1. 程式人生 > >基於ROS使用Arduino讀取溫溼度感測器的資料

基於ROS使用Arduino讀取溫溼度感測器的資料

1. 硬體

Arduino控制板:1個;

溫溼度感測器:1個;

杜邦線:若干;

1.1 接線方式

接線方式為:

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

來張實際的照片(略麻煩):

2 程式  

#include <ros.h>
#include <std_msgs/Int16.h>
#include <Wire.h> 

std_msgs::Int16 data1;
std_msgs::Int16 data2;
 
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 chatter1("chatter1", &data1);
ros::Publisher chatter2("chatter2", &data2);
 
 
void setup()
{
  nh.initNode();
  nh.advertise(chatter1);
  nh.advertise(chatter2);
}
 
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];
  //輸出:溫度、溼度、校對碼
   data1.data=humi;

   data2.data=temp;
   chatter1.publish( &data1);
   chatter2.publish( &data2);
  nh.spinOnce();
}

 

2.1 程式下載和執行

首先:roscore

其次:rosrun rosserial_python serial_node.py /dev/ttyACM0

/dev/ttyACM0  這個是自己的埠號

最後:rostopic echo /chatter1

           rostopic echo /chatter2

來張圖片: