在本篇笔记中菠菜园将为朋友们分享Arduino uno R3开发板如何将传感器中的数据实时发送到服务器。因为波波目前不能久坐,所以为了尽快写完日记记录,中间就略去了服务器的配置。如需学习服务器的配置也可以看菠菜园中以往关于服务器安装配置的教程。
下面是服务器接收并实时展示室内温度的截图:
服务器配置:Centos +lnmp+php7.1+Gatewayworker(用于解决高并发访问和数据推送)
硬件:Arduino uno R3+ESP8266-01S+DH11
程序源码:
- //类库的引入
- #include <SoftwareSerial.h>
- #include <Wire.h>
- SoftwareSerial mySerial(3, 2); //ESP8266模块
- int temp;//温度
- int humi;//湿度
- int tol;//校对码
- int j;
- unsigned int loopCnt;
- int chr[40] = {0};//创建数字数组,用来存放40个bit
- unsigned long time;
- #define pin 8
- void setup() {
- //系统初始化
- Serial.begin(9600);
- while (!Serial) {
- ; // wait for serial port to connect. Needed for native USB port only
- }
- mySerial.begin(115200);
- mySerial.println("AT+RST"); // 初始化重启一次esp8266
- delay(1500);
- // echo();
- mySerial.println("AT");
- echo();
- delay(500);
- mySerial.println("AT+CWMODE=1"); // 设置Wi-Fi模式
- echo();
- mySerial.println("AT+CWJAP=\"SSID\",\"PASSWD\""); // Wi-Fi信道和密码
- echo();
- delay(10000);
- mySerial.println("AT+CIPMUX=0"); // 连接Wi-Fi
- echo();
- mySerial.println("AT+CIPSTART=\"TCP\",\"网址\",端口"); // 连接服务器
- echo();
- }
- 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];
- //输出:温度、湿度、校对码
- Serial.print("temp:");
- Serial.println(temp);
- Serial.print("humi:");
- Serial.println(humi);
- Serial.print("tol:");
- Serial.println(tol);
- mySerial.println("AT+CIPSEND=11"); // 连接Wi-Fi
- echo();
- //int number = 12;
- //char string[25];
- //itoa(number, string, string);
- //Serial.println(string);
- mySerial.print("温度:");
- mySerial.println(temp); // 连接Wi-Fi
- echo();
- }
- void echo(){
- if((mySerial.available() > 0)){
- Serial.println(mySerial.read());
- }
- }
以上实例是经过菠菜园测试的,后期的一些内容因涉及正规项目开发,故不再分享。对于Arduino入门级的学习来讲这三篇文章基本上已经涵盖了传感器的用法,数据的获取及传输。如有其他问题也欢迎加波波QQ或微信进行交流。