Arduino与Air800开发板使用UART通信:传输DHT22传感器数据
硬件介绍
Arduino Leonardo在数字引脚0(RX)和1(TX)进行串口通信时是使用“Serial1”,USB的串口通信使用的是“Serial”。在数字引脚0(RX)和1(TX)与USB是相互独立的。
Air800使用UART1串口进行通信。
注意:Arduino nano只有一个硬件串口,如果需要使用串口与其他单片机通信时,必须拔除USB线,使用跳线连接串口引脚
代码
Arduino Leonardo代码如下:
#include <inttypes.h>
/*
* LED
*/
unsigned int LED = ;
/*
* DHT22配置程序
*/
unsigned int DHT_PIN = ; #define DHT_OK 1
#define DHT_ERR_CHECK 0
#define DHT_ERR_TIMEOUT -1
float humidity;
float temperature;
unsigned char DHT_read()
{
// BUFFER TO RECEIVE
unsigned char bits[] = {,,,,};
unsigned char cnt = ;
unsigned char idx = ;
unsigned char sum;
// REQUEST SAMPLE
pinMode(DHT_PIN, OUTPUT);
digitalWrite(DHT_PIN, LOW);
delay();
digitalWrite(DHT_PIN, HIGH);
delayMicroseconds();
pinMode(DHT_PIN, INPUT); // ACKNOWLEDGE or TIMEOUT
unsigned int count = ;
while(digitalRead(DHT_PIN) == LOW)
if (count-- == ) return DHT_ERR_TIMEOUT; count = ;
while(digitalRead(DHT_PIN) == HIGH)
if (count-- == ) return DHT_ERR_TIMEOUT; // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT
for (int i=; i<; i++)
{
count = ;
while(digitalRead(DHT_PIN) == LOW)
if (count-- == ) return DHT_ERR_TIMEOUT; unsigned long t = micros(); count = ;
while(digitalRead(DHT_PIN) == HIGH)
if (count-- == ) return DHT_ERR_TIMEOUT; if ((micros() - t) > ) bits[idx] |= ( << cnt);
if (cnt == ) // next byte?
{
cnt = ; // restart at MSB
idx++; // next byte!
}
else cnt--;
} sum = bits[]+bits[]+bits[]+bits[];
if(bits[] != sum) return DHT_ERR_CHECK; humidity = (float)((bits[] << )+bits[])/;
temperature = (float)((bits[] << )+bits[])/; return DHT_OK;
} void setup() {
Serial.begin(,SERIAL_8N1);
Serial1.begin(,SERIAL_8N1);
pinMode(,OUTPUT);//指示灯
pinMode(DHT_PIN,INPUT);
digitalWrite(DHT_PIN, HIGH);
}
void loop() {
unsigned long starttime = millis();
DHT_read();
//Serial.print(temperature);
//Serial.print("-");
//Serial.println(humidity);
Serial1.print(temperature);
Serial1.print("-");
Serial1.print(humidity);
Serial1.println("end");//数据发送完成后必须发送一个end字符串标记数据的结束
digitalWrite(LED,HIGH);
delay(); //Delay
digitalWrite(LED,LOW);
delay(); //Delay
}
Air800读取DHT22传感器的代码包括以下几个文件:cuart.lua,dht22.lua
cuart.lua代码如下:
module(...,package.seeall) --[[
模块名称:“cuart应用”测试
模块功能:用于与arduino开发板通过uart通信
模块最后修改时间:2017.02.16
]] --串口ID,1对应uart1
--如果要修改为uart2,把UART_ID赋值为2即可
local UART_ID =
--模拟输入
local ADC_ID =
--结束标识符,用于uart通信结束标志
local endflag = "end" data = "0-0"
--[[
函数名:read
功能 :读取串口接收到的数据
参数 :无
返回值:无
]]
local function read() --底层core中,串口收到数据时:
--如果接收缓冲区为空,则会以中断方式通知Lua脚本收到了新数据;
--如果接收缓冲器不为空,则不会通知Lua脚本
--所以Lua脚本中收到中断读串口数据时,每次都要把接收缓冲区中的数据全部读出,这样才能保证底层core中的新数据中断上来,此read函数中的while语句中就保证了这一点
local tempdata=""
local flag = false
while true do
local tmp = uart.read(UART_ID,"*l",)
if not tmp or string.len(tmp) == then break end
flag = true
tempdata = tempdata..tmp
print("get dht22 tmp: ",tmp)
--print("get dht22 tempdata: ",tempdata)
--打开下面的打印会耗时
--print("read",data,common.binstohexs(data))
--dht22Get(data) --查找结束字符串是否存在,如果存在,则完成数据的一次读取
if string.find(tempdata,endflag) then
print("get dht22 find:",tempdata)
break
end end
index1,index2=string.find(tempdata,endflag)
if flag==true and index1 ~= nil then
print("get dht22 index:",index1)
if index1> then
--删除末尾的结束标识字符串
data = string.sub(tempdata,,index1-)
end
end
end
function getTemperature()
local tab = split(data,"-")
print("get dht22 temperature:",tab[])
return tab[]
end
function getHumidity()
local tab = split(data,"-")
print("get dht22 humidity:",tab[])
return tab[]
end
--字符串分割函数
--传入字符串和分隔符,返回分割后的table
function split(str, delimiter)
if str==nil or str=='' or delimiter==nil then
return nil
end local result = {}
for match in (str..delimiter):gmatch("(.-)"..delimiter) do
table.insert(result, match)
end
return result
end
--保持系统处于唤醒状态,此处只是为了测试需要,所以此模块没有地方调用pm.sleep("test")休眠,不会进入低功耗休眠状态
--在开发“要求功耗低”的项目时,一定要想办法保证pm.wake("test")后,在不需要串口时调用pm.sleep("test")
pm.wake("test")
--注册串口的数据接收函数,串口收到数据后,会以中断方式,调用read接口读取数据
sys.reguart(UART_ID,read)
--配置并且打开串口
uart.setup(UART_ID,,,uart.PAR_NONE,uart.STOP_1)
dht22.lua代码如下:
require"cuart"
module(...,package.seeall) --[[
模块名称:“dht22应用”测试
模块功能:测试dht22.lua的接口
模块最后修改时间:2017.02.16
]] --temperature温度 humidity湿度
temperature = ""
humidity = "" --[[
函数名:print
功能 :打印接口,此文件中的所有打印都会加上dht22前缀
参数 :无
返回值:无
]]
local function print(...)
_G.print(" dht22 ",...)
end --[[
函数名:dht22Get
功能:读取温湿度数据
参数:无
返回值:无
]]
function dht22Get()
temperature = cuart.getTemperature()
humidity = cuart.getHumidity()
print("dht22Get : ",temperature," ",humidity)
end --[[
函数名:returnTemperature
功能:返回温度
参数:无
返回值:无
]]
function returnTemperature()
return temperature
end --[[
returnHumidity
功能:返回湿度
参数:无
返回值:无
]]
function returnHumidity()
return humidity
end --[[
函数:dht22Init
功能:初始化dht22
参数:无
返回值:无
]]
local function dht22Init() end sys.timer_start(dht22Init,) sys.timer_loop_start(dht22Get,)
Arduino与Air800开发板使用UART通信:传输DHT22传感器数据的更多相关文章
- 开发板通过UART向主机发送数据
/********************************* 代码功能:开发板通过UART向主机发送数据 使用函数: Serial.begin(数据传输的波特率); Serial.printl ...
- Cypress的开发板的UART接口打印调试信息
说实话,在官方论坛现在还没有找到相关有用的消息,因为我们这个开发板的UART没引出来. http://www.cypress.com/?app=forum&id=167&rID=527 ...
- 1. Arduino对第三方开发板的支持
Arduino对第三方开发板也有支持接口,需要手动添加,我们以STM32系列为例,说明添加过程. 目前st的官方提供的一系列板子都支持Arduino,可能是Arduino-IDE更新太慢,目前版本没有 ...
- 【Arduino】开源开发板说明
来自世界各地的新型微控制器层出不穷,这类开发板多数都是通过Arduino改进的版本,例如由Arduino所改良的Yún一样,主要是针对网状网路进行改进或升级了其它无线功能. 但一些开发板也有着其独到的 ...
- x86 版的 Arduino Intel Galileo 开发板的体验、分析和应用
1.前言 在今年(2013)罗马举办的首届欧洲 Make Faire 上,Intel 向对外发布了采用 x86 构架的 Arduino 开发板:Intel Galileo.这无疑是一个开源硬件领域的重 ...
- Ubuntu16.04 Arduino UNO R3开发板
使用的是国内改过的版本, usb芯片换成了ch341, 晶振不是原版的16MHz而是12MHz, 杜邦线孔布局和原版一致. 设备连接 在Ubuntu16.04下不需要驱动, 能直接认出ch341设备 ...
- JZ2440开发板:UART(串口)使用(学习笔记)
查看UART在硬件上的信息,阅读JZ2440原理图可以看到: JZ2440开发板的UART0是可以跟USB相接的,用于打印调试,UART1,UART2两个串口用来外接模块.所以本文仅对UART0进行操 ...
- 用arduino的uno开发板为nano板子烧写bootloader
这篇文章,是为了记录下某宝上淘到的一个没有bootloader的nano开发板的历程(比较坑),自己搜索资料而记录的. 如果没有bootloader,板子就不能接收上传的程序,什么也干不了. 烧写bo ...
- TPYBoard开发板搭建与阿里云服务发送数据
今天给大家带来的是TPYBoard V202开发板的一次测试项目使用心得.而测试项目就是给服务端发送硬件底层数据,而数据有产品名称,WF模块MAC地址,温湿度数据. 什么是MicroP ...
随机推荐
- 【转】浅谈一个网页打开的全过程(涉及DNS、CDN、Nginx负载均衡等)
1.概要 从用户在浏览器输入域名开始,到web页面加载完毕,这是一个说复杂不复杂,说简单不简单的过程,下文暂且把这个过程称作网页加载过程.下面我将依靠自己的经验,总结一下整个过程.如有错漏,欢迎指正. ...
- Oracle create tablespace 创建表空间语法详解
CREATE [UNDO] TABLESPACE tablespace_name [DATAFILE datefile_spec1 [,datefile_spec2] ...... ...
- setattr
setatt r给对象的属性赋值,若属性不存在,先创建再赋值 用法 setattr(object, name, values) object -- 对象. name -- 字符串,对象属性. valu ...
- JAVA框架 json数据交互
一.导入依赖: <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId& ...
- JAVA框架 Mybaits 动态sql
动态sql 一:if标签使用: 我们在查询的时候,有时候由于查询的条件的不确定性,导致where的后面的条件的不同,这时候就需要我们进行where后面的条件进行拼接. Mapper配置文件: < ...
- 搭建windows远程节点_jmeter自动化测试环境(接口测试)
WINDOWS10系统下 环境 172.16.0.115虚拟机windows系统作为远程节点. jenkins安装在172.16.0.119:8088虚拟机中. 一.安装配置Java环境 wind ...
- array_map,array_filter,array_walk区别
这几个方法都有遍历数组,操作的过程. 很容易搞混.尤其很多人养成的编程习惯都是使用foreach来循环遍历.. 就举个简单例子. $a = array( 0,1,2,3,4,5,6,7,8,9 ); ...
- LIN、CAN、FlexRay、MOST,三分钟搞明白四大汽车总线
LIN.CAN.FlexRay.MOST,三分钟搞明白四大汽车总线 2016-09-21 13:09 汽车中的电子部件越来越多,光是ECU就有几十个,这么多的电子单元都要进行信息交互.传统的点对点通信 ...
- Scala _ 下划线
1.引入包中的全部方法 import math._ //引入包中所有方法,与java中的*类似 2.表示集合元素 val a = (1 to 10).filter(_%2==0).map(_*2) / ...
- 从0开始学golang--2.1--如何去爬园子的数据
20天过去了,才开始写...主要还是因为自己懒吧.之前一边上班一边也有挤时间练习golang,可是写博客却老是不能行动,跑步也没跑了.突然的就懈怠了快一个月.可能也和开始玩the elder scro ...