基於ROS使用Arduino讀取溫溼度感測器的資料
阿新 • • 發佈:2018-11-01
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
來張圖片: