温湿度传感器dht11(arduino实现)、以及ros和arduino通信

目录

dht11模块在Arduino上的使用

实现效果

 详细说明

代码

 ros和arduino通信 


硬件:电脑、bh1750、Arduino

dht11模块在Arduino上的使用

实现效果

 详细说明

硬件

Arduino控制板:1个;

温湿度传感器:1个;

杜邦线:若干;

接线方式

接线方式为:

DHT11的VCC—Arduino的3.3V;
DHT11的GND—Arduino的GND;
DHT11的DATA—Arduino的2;

代码

#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 2
void setup(){
  Serial.begin(9600);
}

void loop(){
  Serial.println("/n");
  int chk = DHT11.read(DHT11PIN);
   Serial.print("Read sensor: ");
  switch (chk)
  {
    case DHTLIB_OK: 
                Serial.println("OK"); 
                break;
    case DHTLIB_ERROR_CHECKSUM: 
                Serial.println("Checksum error"); 
                break;
    case DHTLIB_ERROR_TIMEOUT: 
                Serial.println("Time out error"); 
                break;
    default: 
                Serial.println("Unknown error"); 
                break;
  }

  Serial.print("Humidity (%): ");
  Serial.println((float)DHT11.humidity, 2);

  Serial.print("Temperature (oC): ");
  Serial.println((float)DHT11.temperature, 2);
 delay(2000);
}

 ros和arduino通信 

 由于没有解决ros通信两个数据同时穿引发的冲突问题,参考了另外一篇博客实现了通信。

参考链接:基于ROS使用Arduino读取温湿度传感器的数据_JunJun-CSDN博客

#include <ros.h>
#include <std_msgs/Int16.h>
#include <Wire.h> 
 
std_msgs::Int16 hum;
std_msgs::Int16 tem;
 
int temp;//温度
int humi;//湿度
int tol;//校对码
int j;
unsigned int loopCnt;
int chr[40] = {0};//创建数字数组,用来存放40个bit
unsigned long time;
#define pin 2
 
ros::NodeHandle nh;

ros::Publisher humidity("humidity", &hum);
ros::Publisher temperature("temperature", &tem);
 
 
void setup()
{
  nh.initNode();
  nh.advertise(humidity);
  nh.advertise(temperature);
  
}
 
void loop()
{
   bgn:delay(2000);
  //设置2号接口模式为:输出
  //输出低电平20ms(>18ms)
  //输出高电平40μs
  pinMode(pin,OUTPUT);
  digitalWrite(pin,LOW);
  delay(20);
  digitalWrite(pin,HIGH);
  delayMicroseconds(40);
  digitalWrite(pin,LOW);
  
  //设置2号接口模式:输入
  pinMode(pin,INPUT);
  //高电平响应信号 
  loopCnt=10000;
  while(digitalRead(pin) != HIGH)
  {
    if(loopCnt-- == 0)
    {
      //如果长时间不返回高电平,输出个提示,重头开始。
      Serial.println("HIGH");
      goto bgn;
    }
  }
  //低电平响应信号
  loopCnt=30000;
  while(digitalRead(pin) != LOW)
  {
    if(loopCnt-- == 0)
    {
      //如果长时间不返回低电平,输出个提示,重头开始。
      Serial.println("LOW");
      goto bgn;
    }
  }
  //开始读取bit1-40的数值  
  for(int i=0;i<40;i++)
  {
    while(digitalRead(pin) == LOW)
    {}
    //当出现高电平时,记下时间“time”
    time = micros();
    while(digitalRead(pin) == HIGH)
    {}
    //当出现低电平,记下时间,再减去刚才储存的time
    //得出的值若大于50μs,则为‘1’,否则为‘0’
    //并储存到数组里去
    if (micros() - time >50)
    {
      chr[i]=1;
    }else{
      chr[i]=0;
    }
  }
   
  //湿度,8位的bit,转换为数值
  humi=chr[0]*128+chr[1]*64+chr[2]*32+chr[3]*16+chr[4]*8+chr[5]*4+chr[6]*2+chr[7];
   
  //温度,8位的bit,转换为数值
  temp=chr[16]*128+chr[17]*64+chr[18]*32+chr[19]*16+chr[20]*8+chr[21]*4+chr[22]*2+chr[23];
  //校对码,8位的bit,转换为数值
  tol=chr[32]*128+chr[33]*64+chr[34]*32+chr[35]*16+chr[36]*8+chr[37]*4+chr[38]*2+chr[39];
  //输出:温度、湿度、校对码
   hum.data=humi;
 
   tem.data=temp;
   humidity.publish( &hum);
   temperature.publish( &tem);
  nh.spinOnce();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clark-dj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值