[ Ruff 开发套件 ] Lesson 4 - LCD 温湿度计


(Bonnie) #1

第四课 LCD 温湿度计

  • 谁将登场
    • LCD 模块
    • 温湿度传感器
  • 你将学会
    • 温湿度传感器的使用
    • LCD 屏的进阶使用

介绍

这节课将实现一个用 LCD 屏显示的温湿度计:

  • LCD 屏初始显示 “Welcome !” 欢迎字样;
  • 1秒钟后,在第一行显示当前温度,在第二行显示当前湿度;
  • 每秒钟刷新当前温度和湿度的值。

元件

  • Ruff 开发板
  • 温湿度传感器模块
  • LCD 模块

外设添加

  • 向项目中添加名为lcd的 LCD 模块

    • model 选择lcd1602-02,驱动版本选择最新版。

  • 向项目中添加名为humirature的温湿度传感器模块,

    • model 选择 DHT11,驱动版本选择最新版。

代码

  • 在编写代码之前需要完成 Ruff 开发板的设置连接、硬件连线。如果有疑问大家可以到这里了解。

  • 想了解 Ruff 应用开发步骤和模型,可以到这里

初始化

我们首先初始化 LCD 屏以及设置光标:

  • 打开 LCD 屏幕;

  • 使用设置setCursor(x,y)函数设置光标到(1,0)处并打印欢迎语;

    • LCD 模块的setCursor函数用来设置光标,用法如下:

      setCursor(x, y, [callback])

    • LCD 模块每行可显示16个字符,共有两行字符,

      • (0,0)指向第一行第一个字符;
      • (1,0)指向第一行第二个字符;
      • (0,1)指向第二行第一个字符;
  • 初始化代码如下:

$('#lcd').turnOn();
$('#lcd').setCursor(1, 0);
$('#lcd').print('Welcome!');
  • 可以在这里复习LCD 模块知识。

温度显示

之后我们解决:如何检测和显示当前温度

  • 使用温湿度传感器模块的getTemperature() 函数获取当前温度:

    • 温湿度模块的getTemperature() 函数语法如下:

      getTemperature(callback)

  • 设置光标到第一行第二个字符处;

  • 打印 temperature 和当前温度;

  • 使用setInterval 函数每秒钟重新检测和显示当前温度。

  • 温度显示代码如下:

setInterval(function () {
    $('#humirature').getTemperature(function (error, temperature) {
        if (error) {
            console.error(error);
            return;
        }
        $('#lcd').setCursor(1, 0);
        $('#lcd').print('temperature: ' + temperature);
    });
}, 1000);

湿度显示

之后我们解决:如何检测和显示当前湿度,解决方法和温度类似。

  • 使用温湿度传感器模块的getRelativeHumidity() 函数获取当前湿度:

    • 温湿度模块的getRelativeHumidity() 函数用法如下:

      getRelativeHumidity(callback)

  • 设置光标到第二行第二个字符处;

  • 打印“humility ”和当前湿度;

  • 使用setInterval 函数每秒钟重新检测和显示当前湿度。

  • 湿度显示代码如下:

setInterval(function () {
    $('#humirature').getRelativeHumidity(function (error, humidity) {
        if (error) {
            console.error(error);
            return;
        }
        $('#lcd').setCursor(1, 1);
        $('#lcd').print('humidity: ' + humidity);
    });
}, 1000);
  • 可以在这里进一步学习温湿度传感器模块知识;

最后,

  • 初始化温度显示湿度显示的实现放在 $.ready 事件下 。

完整代码

'use strict';

$.ready(function (error) {
    if (error) {
        console.log(error);
        return;
    }

    $('#lcd').turnOn();
    $('#lcd').setCursor(1, 0);
    $('#lcd').print('Welcome!');
    
    setInterval(
        function () {
            $('#humirature').getTemperature(function (error, temperature) {
                if (error) {
                    console.error(error);
                    return;
                }
                $('#lcd').setCursor(1, 0);
                console.log('temperature', temperature);
                $('#lcd').print('temperature: ' + temperature);
            });
        }, 1000);

    setInterval(function () {
        $('#humirature').getRelativeHumidity(function (error, humidity) {
            if (error) {
                console.error(error);
                return;
            }
            $('#lcd').setCursor(1, 1);
            console.log('humidity', humidity);
            $('#lcd').print('humidity: ' + humidity);
        });
    }, 1000)
});

(kingh) #3

按照这篇文章操作,下载model,驱动版本也选了最新的
但是执行 rap deploy -s
提示是
Preparing application package... WARN Package "hd44780" requires version of RuffOS to match>=1.2.0 <1.4.0, but gets1.5.0instead. WARN Package "pcf8574" requires version of RuffOS to match>=1.2.0 <1.4.0, but gets1.5.0instead. Deploying application package (105.5kB)... Ruff application deployed successfully. Sending start command... Ruff application started successfully.

我去https://rap.ruff.io/raps/lcd1602-pcf8574a-hd44780看的时候,看着标记是

`Supported Engines

Ruff: >=1.2.0 <1.6.0`

但是看看本地的文件,readme里是
`HD44780 LCD Controller Driver for Ruff.

Supported Engines

  • Ruff: >=1.2.0 <1.4.0

Supported Models

  • hd44780`

新上手的板子,谢谢。


(jerry) #4

这是一个 bug,已经修复了,多谢反馈。
现在下载得到的hd44780pcf8574支持Ruff: >=1.2.0 <1.6.0


(lizhuang) #5

为何我按照这个教程执行不行啊,然后执行rap log语句,然后就只是出现了Connected to device,然后就没有然后了,怎么破?求指教啊?


(bychxchf) #6

Error: ENOENT: no such file or directory: /sys/devices/dht11/iio:device0/in_temp_input
at [anon] (/data/ruff/forJenkins/workspace/ruff-embedded/src/fs.c:86) internal
at [anon] () native strict preventsyield

提示出现这个错误是怎么回事


(rickypan) #7

看上去应该是 dht11 没有正常初始化。

能不能试试看单独运行 dht11(温湿度) 模块,看看是否正常工作?


(yuexiaolong) #8

湿度在日志中和在LCD板上显示的数值不一致:板子是几百,日志中大多是几十,偶尔有几百。
日志截图:

看了传感器的文档,写得是取相对数值%,但为什么板子上一直都是ddd.d ,例: 284.6
:dizzy_face:


(rickypan) #9

你的ruff os 是哪个版本?


(yuexiaolong) #10
ruff  --version
1.6.1

(rickypan) #11

将 ruff 系统升级到 1.8.0 再试试看


(yuexiaolong) #12

将固件和SDK升级后,测试仍然出现上述情况。
通过一段时间观察,对比LCD板和log的输出数据,我发现如下情况:

  1. LCD板会有偶尔正确输出(两位数 ab),仅发生在程序启动片刻后;

  2. LCD出现错误的数据(四位小数 abc.d)后,仔细观察:
    c.d 会在一段时间不发生改变,但是ab会发生变化且和日志输出ab(正确)一致;
    c.d 变化时,发现日志中输出的是错误数据(四位 xym.n),c.d 变为 m.n。m.n 在下一次错误数据时继续改变。

经阅读代码 ruff_modules\dht11\src\index.js,其实我对JS只是了解,好像代码还加了node.js 什么……还没深入学习。:joy:所以只能傻瓜化对变量输出调试。发现从传感器读取到异常数据(较当前温湿度大很多)时,会发生输出错误。
温度和湿度都会有错误,但是只有湿度对后续输出有影响。
下面是修改var value = Number(buffer.toString('utf-8', 0, length)) / 1000
var value = Number(buffer.toString('utf-8', 0, length)) ,输出原生的 value
并且,输出 value 的数值长度,如下:

发现,当数据为7位长度时,除以1000,不就是错误的产生嘛;当6位时,是正确的。
所以我就抖机灵的加了判断,

    var value; 
    if (length == 6) { //仅当数值正确时才进行转换
    value = Number(buffer.toString('utf-8', 0, length)) / 1000;
} 

啊哈,面板输出正常了~
不过我只能这做到这了,剩下的你们加油啊……
另外,我一直有个疑问,那个获取到的偶尔特别大数值,是正常的嘛?是因为传感器误差嘛?


(ckhhhhh) #13

我也有这个问题也


(ludingping) #14

添加了温度温度传感器驱动之后,程序不能启动。
删除驱动之后又可以运行。请检查一下。
装的是最新版v0.3.6


(ludingping) #15

Error: ENOENT: no such file or directory: /sys/devices/dht11/iio:device0/in_temp_input
at [anon] (/data/ruff/forJenkins/workspace/ruff-embedded/src/fs.c:86) internal
at [anon] () native strict preventsyield
错误信息如上
我按照layout的提示安装的设备。Data=> io18


(kenshin) #16

您的 SDK 版本和 板卡 OS 版本是?


(ludingping) #17

1.11.1
板卡是上周升级的最新版本。


(jerry) #18

可以尝试重启开发板,看是否仍有此错误。


(echodoyle) #19

image
有时候会出现这个,虽然不影响但怎么解决?


(jerry) #20

正常现象,忽略这个错误即可。