硬件介绍

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传感器数据的更多相关文章

  1. 开发板通过UART向主机发送数据

    /********************************* 代码功能:开发板通过UART向主机发送数据 使用函数: Serial.begin(数据传输的波特率); Serial.printl ...

  2. Cypress的开发板的UART接口打印调试信息

    说实话,在官方论坛现在还没有找到相关有用的消息,因为我们这个开发板的UART没引出来. http://www.cypress.com/?app=forum&id=167&rID=527 ...

  3. 1. Arduino对第三方开发板的支持

    Arduino对第三方开发板也有支持接口,需要手动添加,我们以STM32系列为例,说明添加过程. 目前st的官方提供的一系列板子都支持Arduino,可能是Arduino-IDE更新太慢,目前版本没有 ...

  4. 【Arduino】开源开发板说明

    来自世界各地的新型微控制器层出不穷,这类开发板多数都是通过Arduino改进的版本,例如由Arduino所改良的Yún一样,主要是针对网状网路进行改进或升级了其它无线功能. 但一些开发板也有着其独到的 ...

  5. x86 版的 Arduino Intel Galileo 开发板的体验、分析和应用

    1.前言 在今年(2013)罗马举办的首届欧洲 Make Faire 上,Intel 向对外发布了采用 x86 构架的 Arduino 开发板:Intel Galileo.这无疑是一个开源硬件领域的重 ...

  6. Ubuntu16.04 Arduino UNO R3开发板

    使用的是国内改过的版本, usb芯片换成了ch341, 晶振不是原版的16MHz而是12MHz, 杜邦线孔布局和原版一致. 设备连接 在Ubuntu16.04下不需要驱动, 能直接认出ch341设备 ...

  7. JZ2440开发板:UART(串口)使用(学习笔记)

    查看UART在硬件上的信息,阅读JZ2440原理图可以看到: JZ2440开发板的UART0是可以跟USB相接的,用于打印调试,UART1,UART2两个串口用来外接模块.所以本文仅对UART0进行操 ...

  8. 用arduino的uno开发板为nano板子烧写bootloader

    这篇文章,是为了记录下某宝上淘到的一个没有bootloader的nano开发板的历程(比较坑),自己搜索资料而记录的. 如果没有bootloader,板子就不能接收上传的程序,什么也干不了. 烧写bo ...

  9. TPYBoard开发板搭建与阿里云服务发送数据

       今天给大家带来的是TPYBoard V202开发板的一次测试项目使用心得.而测试项目就是给服务端发送硬件底层数据,而数据有产品名称,WF模块MAC地址,温湿度数据.      什么是MicroP ...

随机推荐

  1. 基于汇编的 C/C++ 协程 - 切换上下文

    在前一篇文章<基于汇编的 C/C++ 协程 - 背景知识>中提到一个用于 C/C++ 的协程所需要实现的两大功能: 协程调度 上下文切换 其中调度,其实在技术实现上与其他的线程.进程调度没 ...

  2. Oracle Database(rdbms) 12.2 安装组件

    1. 工具用法 su - oracle $ $(orabasehome)/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl Usage: catcon ...

  3. 网络侦查与网络扫描-P201421410029

    中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告   实验一 网络侦查与网络扫描     学生姓名 李政浩 年级 2014 ...

  4. 最长公共子串(LCS:Longest Common Substring)

    最长公共子串(LCS:Longest Common Substring)是一个非常经典的面试题目,本人在乐视二面中被面试官问过,惨败在该题目中. 什么是最长公共子串 最长公共子串问题的基本表述为:给定 ...

  5. memcpy、memmove、memset、memchr、memcmp、strstr详解

    第一部分 综述 memcpy.memmove.memset.memchr.memcmp都是C语言中的库函数,在头文件string.h中.memcpy和memmove的作用是拷贝一定长度的内存的内容,m ...

  6. 20155226 《网络攻防》 Exp1 PC平台逆向破解(5)M

    20155226 <网络攻防> Exp1 PC平台逆向破解(5)M 实践目标 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串 该程序同时包含另一个代 ...

  7. 20155310 Exp9 Web安全基础实践

    20155310 Exp9 Web安全基础实践 基础问题 SQL注入攻击原理,如何防御? SQL注入漏洞是指在Web应用对后台数据库查询语句处理存在的安全漏洞.也就是,在输入字符串中嵌入SQL指令,在 ...

  8. [转]Linux 系统挂载数据盘

    原文地址:http://blog.csdn.net/jeep_ouc/article/details/39289643 *Linux的云服务器数据盘未做分区和格式化,可以根据以下步骤进行分区以及格式化 ...

  9. mapreduce中控制mapper的数量

    很多文档中描述,Mapper的数量在默认情况下不可直接控制干预,因为Mapper的数量由输入的大小和个数决定.在默认情况下,最终input占据了多少block,就应该启动多少个Mapper.如果输入的 ...

  10. 【php增删改查实例】第六节 - 部门管理模块(开始)

    sql建表语句详见:https://www.jianshu.com/p/c88077ed9073 1.新建html模板 新建一个空白的txt文档,然后把后缀名改为.html 用任意一个编辑器打开,比如 ...