前文回顾
《物联网系统RT-Thread学习—开发环境搭建》
《物联网系统RT-Thread学习—内核学习》
《物联网系统RT-Thread学习—设备和驱动学习》
本集预告
由于使用的是一个最小系统板,所以只能做一些gpio能够对接的外设开发,这次来学习一下组件中的命令行,并且以一个温湿度计作为范例,来验证一下效果。
开发过程
这次使用了一个DHT11温湿度模块,一线制的协议,通过GPIO的方式与开发板的PB11引脚对接,然后连接3.3v与地即可。
为了显示数据,这里用了上一篇介绍的显示屏。
这次就开始强调使用别人的轮子方法,我们在项目配置中,搜索一下DHT11模块。果然已经有开发好的模块了
偶买噶,用它!
然后保存配置,系统会自动更新下来驱动程序及demo程序
我们所要做的就是移植sample中的内容,到我们的main中,即可完成了代码的移植。
这里是配置单总线的GPIO口
#define DHT11_DATA_PIN GET_PIN(B, 12)
然后有两个函数值得注意
前者是注册读取线程,后者是注册组件。
后者这一步是必须要有的,因为借助这个方式才能将设备注册到系统中去。
前者倒不是必须的,我们可以在main函数中进行启动控制。
先进行测试读取温湿度值,这里基本没有问题,串口可以输出我们读取到的温湿度,不过只有整数。这里可以通过修改sensor_dallas_dht11.c中的读取函数,将小数部分也读取出来,但是为了尊重作者,这里就不展示修改了,用人家东西,哪里能挑三拣四。
然后我们将其读取到的值,进行显示,就用到了上一篇文章所用的oled显示了。
我们将读取到的内容,分成两行,显示到屏幕上。
这里要实验一下RTT提供的—FinSH 控制台
FinSH 是 RT-Thread 的命令行组件(shell),正是基于上面这些考虑而诞生的,FinSH 的发音为 [ˈfɪnʃ]。
反正我是没咋看懂怎么读,法哎是?还是鱼?
这里我们就添加一下命令行
void open_oled(void)
{
ssd1306_Init();
ssd1306_Fill(White);
ssd1306_UpdateScreen();
}
void start_temp(void)
{
dht11_read_temp_sample();
}
void stop_temp(void)
{
rt_thread_delete(dht11_thread);
ssd1306_Fill(White);
ssd1306_UpdateScreen();
}
MSH_CMD_EXPORT(open_oled , start oled display);
MSH_CMD_EXPORT(start_temp , start show temp and hum);
MSH_CMD_EXPORT(stop_temp , stop show temp and hum);
注册三个命令,用来控制打开屏幕,开始显示温度,停止显示温湿度。
MSH_CMD_EXPORT(命令名称, 命令描述);不需要加引号
系统启动后,通过tab按键,可以查看所有命令
按照步骤开始执行
没啥毛病。
有时候,你以为的可以了,其实只是有时候可以了,结果发现上电的时候,发现会无法读到温度。
所以注册的时候,要延迟一秒,才能保证上电注册成功。
总结经验(划重点)
如果出现对应宏开启之后,有些文件并没有编译进来,需要在保存配置之后,调用下更新Sconsscripts
每次修改配置之后,rtconfig.h文件就会重新生成,所以你做的修改,都会消失,尽量备份一下。
这里都是心得感受,绝对的有价值。
结束语
看来得再入手一些东西,才能继续深造啊,不过现在的芯片模块真是便宜了。这一套温湿度下来也就是40块钱。
网上随便买个温湿度计,也就20多块钱……
实体经济真是不好做啊。