Hands-on IoT advisor and educator. Passionate about helping everyone create IoT products that will make a difference.
Promoting IoT Education with Apache NuttX RTOS (Real-Time Operating System)
Responsible for teaching and mentoring the next generation of professionals in IoT technologies. He taught the following courses:
IoT Application Development: He prepared and presented lessons and labs for training working adults with IoT programming skills, based on AWS IoT, Sigfox, Ubidots and Arduino. He created the training platform with various AWS services: AWS IoT, Lambda, API Gateway, S3, DynamoDB, SNS, Elasticsearch, Kibana. His students included IT professionals from Agility, IBM, SAP, Ericsson, Canon and ITE.
IoT Project: He supervised the students in creating innovative IoT products (based on AWS IoT and Sigfox) that solve real-world problems like dementia patient tracking, elderly home monitoring, food safety, campus security, AED management, realtime asset tracking.
As former CTO of UnaBiz, he was responsible for creating new tools and systems to help people get onboard with Sigfox the quickest way possible.
(1) UnaLocation - Enhanced Sigfox Geolocation with Machine Learning; (2) UnaRadar - Sigfox Network Finder mobile web app; (3) UnaMap - Sigfox Coverage Web Map; (4) UnaShield - Sigfox Shield for Arduino; (5) UnaBell - Smart Button on Sigfox; (6) sigfox-gcloud - Open Source Sigfox Server for Google Cloud; (7) sigfox-aws - Open Source Sigfox Server for Amazon Web Services
He heads the software development/engineering team that architects, develops and executes proof-of-concept (POC) projects for incubating new businesses for Konica Minolta. He was also consulted for technical due diligence in investment projects and acquisitions.
(1) Straight-Through Food & Beverage Ordering System with iOS and Android mobile apps and Kitchen Display System; (2) Bluetooth Beacon Location Analytics for Android and iOS
Reports directly to CEO Group Digital L!fe, Mr Allen Lew. Responsible for scanning of innovative ICT technologies worldwide and executing proof-of-concept (POC) projects for the SingTel Group. He was also consulted for technical due diligence in SingTel Innov8 investment projects and SingTel Group Strategy acquisitions.
(1) Internet of Things (IoT); (2) Indoor Positioning; (3) Smart Retail; (4) Social Recommendation based on Facebook profiling; (5) Speech Recognition for Singapore English; (6) Image Recognition for Retail; (7) Motion Gesture User Experience; (8) Augmented Reality; (9) Cloud Gaming; (10) Virtual Reality; (11) Video Streaming and Distribution; (12) Home Automation
Lead Enterprise Architect for Microsoft .NET technologies in Singapore's largest system integrator
(1) IRAS Inland Revenue Integrated System; (2) Singapore Health Services Outpatient Administrative System; (3) Digital library systems for National Library Board, Singapore Polytechnic, Temasek Polytechnic, Singapore Airlines Engineering, SASCO; (4) Web portals for IDA MyeCitizen Portal, MINDEF NS Portal, MediaCorp MOBTV Portal; (5) YW8, Singapore’s first mobile payment system by NETS, DBS, SingTel, M1, StarHub
Research Assistant for CHOICES Object-Oriented Operating System
Here are the steps to prepare a Pull Request for Apache NuttX RTOS
How we render graphics directly to PinePhone's Display Hardware... With the Zig Programming Language and Apache NuttX RTOS
How does Pine64 PinePhone render graphics on its LCD Display? Let's find out about the Allwinner A64 SoC's Display Engine (DE) and Timing Controller (TCON0).
Let's build a PinePhone Display Driver in Zig... That will run on Apache NuttX RTOS
How does Pine64 PinePhone control its LCD Display over MIPI Display Serial Interface? Let's find out!
Pine64’s PineDio Stack BL604 is a RISC-V board that’s packed with IoT features: Touchscreen, LoRa, WiFi, BLE, GPS and more. In this presentation we’ll talk about the porting of NuttX to PineDio Stack, how we simplified the developer onboarding, and our plans to support LoRaWAN and LVGL Apps in Zig.
What if we could drag-and-drop NuttX Sensors to create IoT Apps? In this presentation we’ll explore Blockly, the web-based toolkit for Visual Programming, and how we might customise Blockly to create NuttX Sensor Apps. We’ll also discuss the Zig Programming Language, and why Blockly will generate NuttX Sensor Apps as Zig programs.
Is there a simpler and safer way to code Touchscreen Apps with the LVGL Graphics Library? In this presentation we’ll talk about migrating a NuttX LVGL App from C to Zig, and the benefits that it brings.
Let's experiment with the GPIO Hardware on Pine64 PinePhone... With a little help from Apache NuttX RTOS
Our PinePhone Operating System will be awfully quiet if we don't implement UART Input and Output... Here's how we implemented the UART Driver for Apache NuttX RTOS
How Pine64 PinePhone handles Arm64 Interrupts with the Generic Interrupt Controller... And how we implemented PinePhone Interrupt Handling in Apache NuttX RTOS
How we ported Apache NuttX RTOS to PinePhone... And what's inside the U-Boot Bootloader
Apache NuttX RTOS now runs on 64-bit Arm Cortex-A53 with Multi-Core Symmetric Multi-Processing... Will it run on PinePhone? Let's find out!
What if we could drag-and-drop NuttX Sensors... To create IoT Sensor Apps in Zig? Let's find out!
How we create a Zig program visually with Blockly, the drag-n-drop way... And how we might use it to build Sensor IoT Apps for Apache NuttX RTOS
Using Zig to read Sensor Data on Apache NuttX RTOS... With Bosch BME280 Temperature / Humidity / Air Pressure Sensor
Can we use Zig to build an LVGL Touchscreen App for Apache NuttX RTOS? Also wrap the LVGL API in Zig to build simpler, safer LVGL Apps? Let's find out!
Can we use Zig to code PinePhone Apps? Maybe make them simpler and safer? Let's find out!
Let's build a complex IoT App with Zig and LoRaWAN... And run it on RISC-V BL602 with Apache NuttX RTOS
How we run Zig on the BL602 RISC-V SoC... With Apache NuttX RTOS
Pine64 is about to launch the PineDio Stack BL604 RISC-V Board with LoRa and Touch Screen... Here's how we automatically flash and test every new release of Apache NuttX RTOS for PineDio Stack
PineDio Stack BL604 RISC-V Board has an interesting problem on Apache NuttX RTOS... Too many GPIOs! Let's fix this with a GPIO Expander
How we created the Apache NuttX RTOS Driver for Hynitron CST816S I2C Touch Panel... For PineDio Stack BL604 RISC-V Board
Running Apache NuttX RTOS on PineDio Stack BL604 RISC-V board... With ST7789 Display, LVGL Graphics and LoRaWAN
RISC-V BL602 SoC with ST7789 SPI Display and LVGL Graphics Library... Let's make it work on Apache NuttX RTOS!
Reading the Bosch BME280 I2C Sensor with Rust Embedded HAL... On BL602 RISC-V SoC and Apache NuttX RTOS
Apache NuttX OS talks I2C with Bosch BME280 Sensor on BL602 RISC-V SoC... Thanks to the BME280 Driver ported from Zephyr OS
How we expose the UART Port on IKEA VINDRIKTNING Air Quality Sensor... And read the PM 2.5 data with PineDio Stack BL604 RISC-V Board
What's inside the EFlash Loader that flashes all firmware to the BL602 RISC-V SoC
How we automagically flash and test the daily build of Apache NuttX OS on BL602 RISC-V SoC
How we run Rust programs on Apache NuttX OS... And transmit a LoRa Message with Rust
Compressing Sensor Data with CBOR on Apache NuttX OS... By calling TinyCBOR Library
Porting Semtech's LoRaWAN Stack to Apache NuttX OS... And testing it on PineDio Stack BL604 RISC-V Board
Porting the LoRa Driver for Semtech SX1262 from Linux to Apache NuttX OS... And testing it on PineDio Stack BL604 RISC-V Board
How we transmit and receive data over SPI on Apache NuttX OS... By coding a NuttX Device Driver
How we build, flash and test the Apache NuttX operating system on BL602 and BL604 RISC-V SoCs
How we test the pre-production PineDio LoRa Gateway by Pine64... And connect it to The Things Network
How we build a LoRa SX1262 Driver for PineDio USB Adapter... And test it on Pinebook Pro
How we monitor our IoT Sensor Devices connected to The Things Network... With Prometheus Time Series Database and Grafana Dashboards
How we decode CBOR Sensor Data inside The Things Network... With a CBOR Payload Formatter
How we read the Internal Temperature Sensor on the BL602 and BL604 RISC-V SoCs... And transmit to The Things Network
Can we use Roblox to monitor and control an IoT Device... Through LoRaWAN and The Things Network?
How we compress Sensor Data with CBOR... And transmit over LoRaWAN on the BL602 / BL604 RISC-V SoC
How we visualise Sensor Data from The Things Network... With a Custom MQTT Data Source in Grafana
How we join The Things Network and send data to the cloud on the new PineDio Stack BL604 RISC-V Board
How we test LoRaWAN on the new PineDio Stack BL604 RISC-V Board
Can we drag-and-drop Rhai Scripts... And run them on WebAssembly and BL602 RISC-V SoC?
What's it like to create Open Source Software for brand new prototype hardware? Read on to find out!
Can we run Rust Firmware for BL602 RISC-V SoC in a Web Browser... Simulated with WebAssembly?
How we create Rust Firmware that reads Analog Inputs... With the Analog-to-Digital Converter on RISC-V BL602
What's inside the Bouffalo Lab RISC-V BL706 Audio Video Board... And how it differs from BL602
What happens inside the WiFi Driver on RISC-V BL602... And how we found the incomplete source code for the driver
How we run TensorFlow Lite on RISC-V BL602... To create a Glowing LED
All about the BL602 RISC-V Bootloader... And how it loads the Application Firmware into XIP Flash Memory
How we simulate the BL602 RISC-V SoC with uLisp in WebAssembly... And preview Blockly uLisp Apps in the Web Browser
Porting the uLisp Interpreter to PineCone BL602 RISC-V Board... And writing graphical programs with Blockly (Scratch)
How we connect PineCone BL602 RISC-V Board to LoRaWAN... With the Pine64 RFM90 LoRa Module
How we set up our own LoRaWAN Network with RAKwireless RAK7248 WisGate Developer D4H Gateway... And test it with RAKwireless WisBlock in Arduino
How we build, flash and run Rust firmware on BL602 RISC-V SoC... With the BL602 IoT SDK
How PineCone BL602 RISC-V Board with SX1276 receives LoRa packets... Transmitted by RAKwireless WisBlock
How we receive LoRa packets transmitted by PineCone BL602 RISC-V Board ... With RAKwireless WisBlock in Arduino
How we transmit LoRa packets on PineCone BL602 RISC-V Board ... With Semtech 1276 or Hope RF96
Your free open-source resource for learning RISC-V BL602 SoC
How we render an image with PineCone BL602 RISC-V Board ... On Grove Triple Colour E-Ink Display with UART Interface
How we render text and graphics on PineCone BL602 RISC-V Board ... With ST7789 SPI Display and LVGL Graphics Library
PineCone BL602 RISC-V Board talks to BME280 Sensor over SPI... Let's find out how
How we call the BL602 RISC-V Hardware Abstraction Layer to access the BME280 I2C Sensor
How we ported the BL602 RISC-V Hardware Abstraction Layer to Apache Mynewt ... Starting with GPIO
Explore the BL602 GPIO and PWM Demo Firmware... And how they call the GPIO and PWM Hardware Abstraction Layer
What happens when we flash RISC-V firmware to PineCone BL602 Board... And what's inside the BL602 Boot Image, Partition Table, Device Tree and EFuse Configuration
How we port Apache Mynewt embedded operating system to the PineCone BL602 RISC-V Board
I made mistakes in 2020... Here's how I'll do better in 2021
How we build and debug Embedded Rust Firmware for PineCone BL602... With VSCode and GDB
How we connect PineCone BL602 Evaluation Board to OpenOCD... For flashing and debugging RISC-V firmware
What's inside the PineCone BL602 Evaluation Board... And how we're using it to contribute to the RISC-V Open Source Ecosystem
How we build a hand-drawn Watch Face for PineTime Smart Watch... Starting from WebAssembly to Embedded Rust
How we build PineTime Watch Faces with Rust and LVGL... And publish them on crates.io
How PineTime syncs the time over Bluetooth LE with Mynewt and NimBLE... And how we create Watch Faces with LVGL
Converting Embedded C to Rust is not that hard... Here's how we convert a PineTime Watch Face with LVGL from C to Rust on RIOT
Tired of pointer problems on Embedded C? It’s time to switch over to a safer, simpler way of coding: Embedded Rust. We’ll look at Rust hosted on RIOT and how it’s used to create LVGL watch apps for PineTime Smart Watch.
Tired of pointer problems on Embedded C? It’s time to switch over to a safer, simpler way of coding: Embedded Rust. We’ll look at Rust hosted on RIOT and how it’s used to create LVGL watch apps for PineTime Smart Watch.
How we build and preview PineTime Watch Faces with only a web browser... No computer needed!
Learn to build PineTime Smart Watch Firmware in the Cloud... No computer needed!
Learn about Wayland and Ubuntu Touch on PinePhone... And how we build PinePhone Apps with LVGL
How we convert Go code to Dart and Flutter automatically with an Abstract Syntax Tree
How we manage state with the Bloc Library in the Flutter Companion App (Android and iOS) for PineTime Smart Watch
Getting started with PineTime Smart Watch
Creating desktop apps on Linux doesn't have to be hard... Let's build GTK+ 3 apps in Go with the gotk3 library!
How we build the Flutter Companion App (Android and iOS) for PineTime Smart Watch by converting Go to Dart
Bluetooth Low Energy apps are ridiculously easy to code with Flutter and Dart, let me show you how!
Making wasp-os truly awesome with full multitasking, interoperable firmware updates and a common companion app
Observe step-by-step the Wireless Firmware Update running on PineTime Smart Watch (nRF52) with MCUBoot Bootloader, NimBLE Bluetooth LE Stack and Apache Mynewt
Wireless Firmware Updates done right on PineTime Smart Watch... With the open source MCUBoot Bootloader from Apache Mynewt and Zephyr
Configure Mynewt OS to enable access to SPI Flash Memory on PineTime Smart Watch
Flash any firmware to PineTime from our mobile phone... Without opening the watch!
Running Retro Games with Rust is not that hard on PineTime Smart Watch. Here's how I ported a CHIP-8 Game Emulator to PineTime
Create and edit Embedded Rust programs visually by dragging and dropping blocks
Have humans become so greedy for profit… That we have forgotten how to teach one another and advance our species?
VSCode debugging configuration for RIOT
Coding in Embedded C is like building a skyscraper without scaffolding
Using only a Raspberry Pi, we can debug the firmware on PineTime Smart Watch: Step into the flashed program line by line, set a breakpoint to pause execution at a line, inspect variables at runtime, … Just like the Embedded Pros!
Instead of sending SWD data over GPIO one bit at a time, what if we could blast out the data over Raspberry Pi’s SPI interface?
Programming a PineTime is not that hard… All you need is a Raspberry Pi, some wires and a little creativity!
Simple tweaks like Batched Updates and Non-Blocking SPI can have a huge impact on rendering performance
Code Watch Apps in Rust the Declarative Way
5 years ago I decided to fix every link in the IoT Chain so that we can create really useful and affordable IoT gadgets, the Lean and Agile Way
Porting Mynewt OS to GD32 VF103 on RISC-V was a nightmare
Programming the Hynitron CST816S Capacitive Touch Controller
PineTime is the spiritual successor to BBC micro:bit
Many GD32 VF103 RISC-V developer boards are coming real soon... And Mynewt OS would be perfect for them
Set up an nRF52 mesh network, step by step, without any coding
nRF52 works with popular open-source tools on Windows and macOS like VSCode, OpenOCD, Rust and ST-Link
Let’s build a simple gadget that determines its current location based on received GPS signals… And transmits the location to a server via NB-IoT
Peek into the LiteOS + Application source code that was bundled with the NB-IoT Developer Kit
Learn to optimise the power consumption of the NB-IoT Sensor Application in the previous tutorial
Create and edit Embedded Rust programs for STM32 Blue Pill and Apache Mynewt… By dragging and dropping blocks!
Watch what happens behind the scenes when you create a Visual Embedded Rust program
Hardly anyone writes embedded programs in Rust for microcontrollers (like STM32 Blue Pill), we all use C. But we really should switch to Rust!
Let’s build an IoT sensor with a real microcontroller — STM32 Blue Pill — and a real NB-IoT module — Quectel BC95-G!
How to use a Quectel evaluation board to send a CoAP message to the CoAP server hosted at thethings.io
Simpler embedded coding, the visual way
Declarative and Procedural Macros (plus bindgen and tips for Visual Studio Code) to protect Embedded Rust coders from stumbling into embedded traps
It’s time to drop our legacy programming practices and adopt smarter, safer ways to exploit these microcontrollers… starting with Apache Mynewt and Rust.
Let's build a Sensor Network running on two Blue Pills with nRF24L01 and ESP8266
Friendlier for newbies, supports ESP8266 WiFi and nRF24L01
And WiFi Geolocation with ESP8266
Apache Mynewt is a free, open-source realtime operating system for microcontrollers
AWS IoT Rules Engine and Kinesis Firehose were designed to stream live sensor data into Redshift for storage and analysis
With AWS Glue it’s now possible to keep our Redshift data warehouses in sync with JSON-based data stores… So we may exploit the full potential of business analytics and machine learning in AWS!
With Lambda Layers it’s really easy to connect our Node.js Lambda Function to Redshift or PostgreSQL
How do we upgrade the Bootloader when it’s always running in the background, waiting for flashing requests? This article explains a special technique I used to upgrade the MakeCode Bootloader over WebUSB… I call it “Baseloading”
Explore the innards of the MakeCode Bootloader that I have ported to Blue Pill
Computing sensor values in IoT devices can be prone to bugs… And Unit Testing can help to stop the bugs before they pollute the entire IoT chain
Filling in tiny math functions with nano-float
Learn the tips and tools to prevent Blue Pill Bloat
STM32 Blue Pill is a remarkable microcontroller for US$ 2. I proved it by running the USB Storage, USB Serial, USB DFU (Direct Firmware Upgrade) and WebUSB interfaces all on the same Blue Pill concurrently, without any additional hardware!
This work-in-progress document describes an incomplete implementation of STM32 Blue Pill visual programming
I teach Sigfox to working professionals. Here are their questions…
如果您可以將您以電池供應電力的BBC micro:bit設置在城市裡的任何一個角落來收集感測資料 … 或者是隨時查看從家裡、學校、工作場所即時更新的感測資料 … 不是很酷嗎？
Wouldn’t it be cool if you could plant your BBC micro:bit anywhere in the city (powered by batteries) to collect sensor data… And watch live updates of the sensor data from your home, school, workplace, … Even on the go?
使用 BBC micro:bit 連接 Sigfox 物聯網網路會是一個很好幫助孩子們理解感測器與感測網路如何運作的理想方式。micro:bit 是新式以電池提供電力的感測器裝置典範，具備充足的處理能力並支援大多數的感測器類型。在教育用途上，Sigfox 可能是今日用於城市規模測試的感測網路之中，最為便宜的方案。
BBC micro:bit connected to the Sigfox IoT network is the perfect way to help kids understand how Sensors and Sensor Networks operate. The micro:bit is a good representation of a modern battery-powered sensor device, with ample processing power and support for most types of sensors. For education, Sigfox is likely the cheapest option today for experimenting with a city-wide sensor network.
以 STM32 微處理器為核心的 STM32F103C8T6 Blue Pill 開發板連接 Sigfox 收發器模組來接取 Sigfox 物聯網網路可能會是設計一款低功率物聯網裝置的最佳組合。
STM32 “Blue Pill” microcontroller connected to a transceiver module for the Sigfox IoT network might be the best combination for low-power IoT devices right now.
This article that explains all that I have learnt about SPI ports, DMA and interrupts on the Blue Pill
As we learn how to program the FPGA, we’ll soon realise that FPGA programming is really extraordinary, unlike any other kind of programming we have done before
Upsizing from Arduino Uno to a 32-bit STM microcontroller doesn’t have to be hard
Using the cocoOS task scheduler to run Sensor Tasks concurrently while waiting for the Network and UART Tasks
Juggle multiple Arduino sensors, using an open source library for cooperative processing: cocoOS
Since FPGAs are already mainstream, could we use them to create IoT devices that are more power-efficient than current devices based on microcontrollers?
Let's learn Rust, a modern systems programming language that promotes safe, concurrent low-level coding
Here’s the story of the first gadget that I have ever created, with help from the brilliant minds at Seeed in Shenzhen
Better tools for building robust and reliable programs for microcontrollers
Could Alibaba Cloud be the economical cloud for high volume IoT?
How to implement a Finite State Machine on the Arduino Uno
How to experiment with IoT today while minimising the security and performance risks, and keeping costs low
Arduino, Low Power Networks, IoT Networks, IoT Analytics, ...
Lup Yuen talks about two classes of IoT, ‘deep’ IoT and ‘wide’ IoT. Deep IoT devices require high bandwidth and power supply. UnaBiz looks at wide IoT, which refers to devices that are very light, battery-powered and operate on pervasive networks. They can work anytime, anywhere in Singapore and do not rely on WiFi or the cellular network.
Building highly reliable, robust and scalable systems for processing Sigfox messages
Co-created with Upton Lai, the brilliant guy who could make anything
IoT is about solving real problems (not imaginary ones) in a sustainable way
This invention relates to a system for displaying video content streamed from a network in a full screen mode. The system receives receiving a network address based on a selection from a user. The system then transmits a request for content from the network address and subsequently receives the content associated with the network address. A search is performed on the content for data that provides displaying a video content in a full screen mode. Upon detecting the data, the process generates the data and displays video content in full screen mode.
A system and method for providing mobile services, the system comprising: a mobile device executing a client application for generating a mobile service request; and a hub server for receiving and processing the mobile service request, wherein the mobile service request comprises location data of the mobile device, and the hub server pushes one or more mobile service offers to the mobile device based on the location data. The method comprises executing a client application for generating a mobile service request on a mobile device; receiving and processing the mobile service request at a hub server; and pushing one or more mobile service offers from the hub server to the mobile device based on location data, wherein the mobile service request comprises location data of the mobile device.