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 ...
随机推荐
- ZOJ 4100 浙江省第16届大学生程序设计竞赛 A题 Vertices in the Pocket 线段树+并查集
正赛的时候完全没看这个题,事后winterzz告诉我他想出来的解法. 首先题意是给出n个点,m次操作. 操作有一种是连接两个点,另一种是求此时再为这个图连k条边,最少和最多能有几个联通块. 最少的求法 ...
- [luogu3198] 玩具装箱
题面 最近在搞dp, 发现自己的dp还是太弱了, 做的题比较少, 也有一些东西没学, 这道题算是我独立做的第一道斜率优化dp, 写篇题解纪念一下吧. dp式比较简单, 就是一个线性的dp, 设 ...
- Drool实战系列(二)之eclipse安装drools插件
这里演示是drools7.5.0,大家可以根据自己需要安装不同的drools版本 drools安装地址: http://download.jboss.org/drools/release/ 一. 二. ...
- Python2.7-difflib
difflib主要用于比较两个序列的不同,常见于字符串的比较,可以对差异生成报告.SequenceMatcher 主要用于找两者相似部分,以及两者不同的转换方法,而 Differ 更注重于比较两者的区 ...
- redis主从搭建
两台服务器 127.0.0.101 A 主服务器 127.0.0.108 B 从服务器 从服务器设置 1.修改redis.conf 依次修改daemonize no改为daemonize yes 默 ...
- Leetcode——300. 最长上升子序列
题目描述:题目链接 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101], ...
- opencv 显示摄像头数据
本文章是一个小例子,主要是在ubuntu 系统中利用Opencv 显示摄像头的数据 ,显示到对话框中. 1.建立一个 main.cpp #include<opencv2/core/core.h ...
- jqgrid editrules参数说明
转载至:jqgrid的editrules参数 以下为内容留存记录. editrules editrules是用来设置一些可用于可编辑列的colModel的额外属性的.大多数的时候是用来在提交到服 ...
- 第12章 GPIO输入—按键检测
第12章 GPIO输入—按键检测 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...
- mac下载、破解、安装webstorm编辑器
1.进入webstorm官网 http://www.jetbrains.com/webstorm/,点击DOWNLOAD,开始下载webstorm安装包. untitled.png 2.开始安装 双击 ...