arduino与air800开发板使用uart通信:传输dht22传感器数据(代码片段)

且听风吟-wuchao 且听风吟-wuchao     2022-10-22     235

关键词:

硬件介绍

Arduino Leonardo在数字引脚0(RX)和1(TX)进行串口通信时是使用“Serial1”,USB的串口通信使用的是“Serial”。在数字引脚0(RX)和1(TX)与USB是相互独立的。

Air800使用UART1串口进行通信。

代码

Arduino Leonardo代码如下:

#include <inttypes.h>
/*
 * LED
 */
 unsigned int LED = 13;
/*
 * DHT22配置程序
 */
unsigned int DHT_PIN = 7;

#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[5] = 0,0,0,0,0;
  unsigned char cnt = 7;
  unsigned char idx = 0;
  unsigned char sum;
  // REQUEST SAMPLE
  pinMode(DHT_PIN, OUTPUT);
  digitalWrite(DHT_PIN, LOW);
  delay(18);
  digitalWrite(DHT_PIN, HIGH);
  delayMicroseconds(40);
  pinMode(DHT_PIN, INPUT);

  // ACKNOWLEDGE or TIMEOUT
  unsigned int count = 10000;
  while(digitalRead(DHT_PIN) == LOW)
    if (count-- == 0) return DHT_ERR_TIMEOUT;

  count = 10000;
  while(digitalRead(DHT_PIN) == HIGH)
    if (count-- == 0) return DHT_ERR_TIMEOUT;

  // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT
  for (int i=0; i<40; i++)
  
    count = 10000;
    while(digitalRead(DHT_PIN) == LOW)
      if (count-- == 0) return DHT_ERR_TIMEOUT;

    unsigned long t = micros();

    count = 10000;
    while(digitalRead(DHT_PIN) == HIGH)
      if (count-- == 0) return DHT_ERR_TIMEOUT;

    if ((micros() - t) > 40) bits[idx] |= (1 << cnt);
    if (cnt == 0)   // next byte?
    
      cnt = 7;    // restart at MSB
      idx++;      // next byte!
    
    else cnt--;
  

  sum = bits[0]+bits[1]+bits[2]+bits[3];
  if(bits[4] != sum) return DHT_ERR_CHECK;
    

  humidity = (float)((bits[0] << 8)+bits[1])/10;
  temperature = (float)((bits[2] << 8)+bits[3])/10;
  
  return DHT_OK;


void setup() 
   Serial.begin(115200,SERIAL_8N1);
   Serial1.begin(115200,SERIAL_8N1);
   pinMode(13,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(925); //Delay
   digitalWrite(LED,LOW);
   delay(925); //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 = 1
--模拟输入
local ADC_ID = 0
--结束标识符,用于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",0)
        if not tmp or string.len(tmp) == 0 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>0 then
            --删除末尾的结束标识字符串
            data = string.sub(tempdata,0,index1-1)
        end
    end
end
function getTemperature()
    local tab = split(data,"-")
    print("get dht22 temperature:",tab[1])
    return tab[1]
end
function getHumidity()
    local tab = split(data,"-")
    print("get dht22 humidity:",tab[2])
    return tab[2]
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,115200,8,uart.PAR_NONE,uart.STOP_1)

  dht22.lua代码如下:

require"cuart"
module(...,package.seeall)

--[[
模块名称:“dht22应用”测试
模块功能:测试dht22.lua的接口
模块最后修改时间:2017.02.16
]]

--temperature温度   humidity湿度
temperature = "0"
humidity = "0"


--[[
函数名: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,2000)

sys.timer_loop_start(dht22Get,2000)

 

hi3861通过uart串口协议与其它开发板进行通信

一、搭建编译环境1、下载虚拟机VMware和Ubuntu20.0.14下载VMwareWorkstationPro|CN​sudoapt-getinstallnodejssudoapt-getinstallnpmnode--version//查看nodejs版本npm--version//查看npm版本(2)安装Python编译环境sudoapt-getinstallpython3.8sudoap 查看详情

arduinouno可以运行两个以上的软件uart通信吗?

我正在开发一个应用程序,我需要从一个ArduinoUno大师那里与6个ArduinoUnos进行通信。六个Arduino板放置在距离主ArduinoUno1米处。因此我不能使用SPI或I2C我是否正确?这可能与ArduinoUno中的软件UART有关吗?6个UART与软件串口通信?如果... 查看详情

使用c#应用程序与arduino开发板进行通信

在本文中,我们将一个ArduinoProMini开发板连接到PC,并且使用C#Windows应用程序与其进行通信。 将硬件连接到PC是非常有利的,不仅是因为你可以发送命令以及监控状态,还可以实时调试代码。当你正在努力制作一个模块,想... 查看详情

micropython+esp8266:uart串口通信

...们:我们可以使用UART库访问UART串口。在本章中,我使用Arduino板作为UART源。我们从UART读取传入的消息。开始吧!在串口通信的教程中,我使用ArduinoUno连接到NodeMCU板。我们在连接到Arduino板的NodeMCU上使用UART0。我们应该将RX引脚... 查看详情

eda课设fpga开发板vhdl实现串口通信(代码片段)

...信设计目的随着FPGA/CPLD器件在控制领域的广泛使用,开发嵌于FPGA/CPLD器件内部的通用异步收发器,以实现FPGA/CPLD开发系统与PC机之间的数据通信是很有实际意义的。FPGA/CPLD与单片机、ARM等器件不同,它内部并没有集成U... 查看详情

eda课设fpga开发板vhdl实现串口通信(代码片段)

...信设计目的随着FPGA/CPLD器件在控制领域的广泛使用,开发嵌于FPGA/CPLD器件内部的通用异步收发器,以实现FPGA/CPLD开发系统与PC机之间的数据通信是很有实际意义的。FPGA/CPLD与单片机、ARM等器件不同,它内部并没有集成U... 查看详情

tq2440开发板学习纪实---设置uart串口,输出helloworld!

0串口,UART,RS232,RS485傻傻分不清0.1串行通信与并行通信串口名字表示采用的通信方式为串行而不是并行。那么串行与并行的区别是啥呢?很简单,串行就是同一时刻只能传输一个bit,而并行则可以同时传... 查看详情

计算机与 BASYS 3 FPGA 之间的 UART 通信

...要将数据从Windows10计算机发送到BASYS3板(ARTIX7FPGA)。我使用UART来做到这一点。在PuTTY串行控制台中输入要发送的数据。出于测试目的,我决定使用板上的8个LED显示接收到的数据 查看详情

开发板通过uart向主机发送数据

1/*********************************2代码功能:开发板通过UART向主机发送数据3使用函数:4Serial.begin(数据传输的波特率);5Serial.println(传回的数据);6创作时间:2016*10*077作者邮箱:[email protected]8********************************/9voidsetup() 查看详情

使用 UART 从 Raspberry Pi 编程 Arduino

】使用UART从RaspberryPi编程Arduino【英文标题】:ProgramanArduinofromaRaspberryPiusingUART【发布时间】:2014-03-2123:42:55【问题描述】:我正在尝试使用RaspberryPi对安装在面包板上的Arduino进行编程。对于Arduino的设置,我一直遵循this教程,除... 查看详情

stm32f407-串口学习1(uart协议简介)

...eMX来配置芯片的一些操作,在后面我会以我使用的STM32F407开发板来举例讲解(其他STM32系列芯片大多数都可以按照这些步骤来操作的),如有不足请多多指教。2、UART简介  嵌入式开发中,UART串口通信协议是我们常用的通信协... 查看详情

arduino开发esp8266——安装与配置esp8266开发板

一、安装Arduino1.下载安装包:点击打开2.安装:直接点击下一步直至安装完成。如下图所示:二、下载ESP8266开发板库:在这面填写ESP8266开发板地址:http://arduino.esp8266.com/stable/package_esp8266com_index.json,保存... 查看详情

w5500学习开发:硬件使用说明

   开发板  硬件说明 一,开发板主控芯片说明:      1.单片机:STM32F103RET6    2.GPRS模块:Air202二,开发板外设说明:    1.以太网模块:W5500    2.外设通信接口: 422或者485通信    3.继... 查看详情

linkgui™aire32开发板介绍

概述LinkGUI™AirE32让开发者可以在ESP32芯片上实现完美的图形交互体验。本开发平台是基于ESP32WROVER芯片组,将GUI系统无缝嵌入到乐鑫开源的ESP-IDF开发环境,实现让开发者既可开发出优秀的UI接互,又可使用ESP-IDF丰富的... 查看详情

arduino开发esp8266——安装与配置esp8266开发板

一、安装Arduino1.下载安装包:点击打开2.安装:直接点击下一步直至安装完成。如下图所示:二、下载ESP8266开发板库:在这面填写ESP8266开发板地址:http://arduino.esp8266.com/stable/package_esp8266com_index.json,保存... 查看详情

arduino开发esp8266——安装与配置esp8266开发板

一、安装Arduino1.下载安装包:点击打开2.安装:直接点击下一步直至安装完成。如下图所示:二、下载ESP8266开发板库:在这面填写ESP8266开发板地址:http://arduino.esp8266.com/stable/package_esp8266com_index.json,保存... 查看详情

华为云技术分享盘点物联网常用开发板

...面为大家介绍几款常用的物联网开发板。2常用开发板2.1Arduino开发板2.1.1简介Arduino开发板本着让用户简单使用而且开源的设计 查看详情

avr单片机教程——uart进阶(代码片段)

...系列。?在第一期中,我们已经开始使用UART来实现单片机开发板与计算机之间的通信,但只是简单地讲了讲一些概念和库函数的使用。在这一篇教程中,我们将从硬件与软件等各方面更深入地了解UART。USART组件一直在讲的UART其实... 查看详情