DEV Community

Peli de Halleux
Peli de Halleux

Posted on

1 1 1 1

DeviceScript and LCD screens

This article shows how to use DeviceScript to program a microcontroller (ESP32-C3), a temperature/humidity sensor (BME680) and a LCD character screen to build a tiny weather dashboard. This project does not require soldering or embedded skills.

A LCD screen display temperature and humidity

In a previous article, we looked at using an OLED screen to display temperature readings using DeviceScript.

DeviceScript

DeviceScript brings JavaScript/TypeScript to tiny IoT devices such as the ESP32. DeviceScript provides a user friendly editing/debugging experience in Visual Studio Code.

You can follow along this tutorial without any hardware and use the simulators provided by DeviceScript. Otherwise, the parts needed are

Seeed Studio Xiao + Grove shield

The Xiao ESP32-C3 is a low-cost compact microcontroller board running the Espressif ESP32-C3.

The Grove shield for Xiao is a convenient base for the Xiao that provides an easy access to OLED screens, Grove connectors and battery charging.

DeviceScript provides a shield drivers that configures the pins and the OLED display for this hardware combo.



import { XiaoGroveShield} from "@devicescript/drivers"

const shield = new XiaoGroveShield()


Enter fullscreen mode Exit fullscreen mode

LCD screen as character screen

The Grove LCD screen supports 16 columns and rows of characters; it provides an I2C interface that dramatically reduces the complexity of connecting this kind of devices (just plug the grove connector and go). The driver is written in TypeScript/DeviceScript.

The sceen is modelled as a character screen. Using services allows DeviceScript to provide simulation and device twin capabilities to your coding experience.
 



import {
    XiaoGroveShield,
    startGroveRGBLCD16x2,
} from "@devicescript/drivers"

const shield = new XiaoGroveShield()
const screen = await startGroveRGBLCD16x2()
await screen.message.write('starting...')


Enter fullscreen mode Exit fullscreen mode

BME680

The BME680 is a high-precision temperature/humidity/gas sensor that can be conveniently connected through one of the grove connector.

The sensor is exposed as 3 services, temperature, humidity, air quality, that can be used to poll the sensor data and display it on the screen.



import {
    startBME680,
} from "@devicescript/drivers"

...
const { temperature, humidity } = await startBME680({
    address: 0x76
})
const temp = await temperature.reading.read()
const humi = await humidity.reading.read()
await screen.message.write(`t ${temp}\nh ${humi}`)


Enter fullscreen mode Exit fullscreen mode

Simulation

You try this code without hardware. DeviceScript will spin up simulators for the Xiao, the sensors and screens.

A screenshot of the simulator view in DeviceScript

Value dashboard

Since display sensor values is a common task, DeviceScript provides a helper ValueDashboard to render a list of sensor data.

The value dashboard



import { ValueDashboard } from "@devicescript/runtime"

...
const dashboard = new ValueDashboard(screen, {
    temperature: { digits: 1, unit: "C" },
    humi: { digits: 0, unit: "%" },
})

setInterval(async () => {
    dashboard.values.temperature = temperature.reading.read()
    dashboard.values.humi = humidity.reading.read()
    await dashboard.show()
}, 1000)


Enter fullscreen mode Exit fullscreen mode

All together

The final sample is a tiny weather display that shows the temperature/humidity reported by the BME680 sensor.



import {
    startGroveRGBLCD16x2,
    startBME680,
    XiaoGroveShield,
} from "@devicescript/drivers"
import { ValueDashboard } from "@devicescript/runtime"

const shield = new XiaoGroveShield()
const { temperature, humidity } = await startBME680({
    address: 0x76,
})
const screen = await startGroveRGBLCD16x2()

const dashboard = new ValueDashboard(screen, {
    temp: { digits: 1, unit: "C" },
    humi: { digits: 0, unit: "%" },
})

setInterval(async () => {
    dashboard.values.temp = await temperature.reading.read()
    dashboard.values.humi = await humidity.reading.read()
    await dashboard.show()
}, 1000)


Enter fullscreen mode Exit fullscreen mode

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay