@[智能温室系统第一步传感器数据采集 Arduino
# 用于开发板arduino开发板 使用的是arduino ide 可到官网下载 我的代码涉及三个外包LORA 温湿度 线程
如果你懒得,你可以下载我的源码。lora原始收发程序
https://download.csdn.net/download/publicdust/11388928
该代码有三个功能 一 读取温湿度传感器、红外传感器、光敏、土壤湿度、烟雾等各种传感器的数据 二 将数据通过LoRa和树莓派等Arduino的通讯 三 接受覆盆子派的数据,并进行相应的操作。包括电机旋转、泵泵泵、打开灯、蜂鸣器报警。
在这里,代码涉及代码涉及到数据格式的转换。事实上,如果读取数据来完成数据传输,而不需要代码转换,因为我需要通过NBIOT因此,此转换添加到代码中,无需注释即可。此处声明代码中使用的通信频率为434。 二话不说直接上代码
代码中有注释
#include <DHT.h> #include <DHT_U.h>
#include <DHT.h> #include <DHT_U.h>
#include <DHT.h> #include <DHT_U.h>
#include <pt.h>
#include <SPI.h> // include libraries #include <LoRa.h> #include <String.h> #include <DHT.h> #include <Stepper.h>
#define Smoke_sensor A1 ///烟雾模块引脚 #define Smoke_sensor_D 0 //D0 #define Soil_sensor A2 ///土壤模块引脚 #define Soil_sensor_D 1 //D1 #define PIN_A A0 ///光敏模块引脚2 #define PIN_D 2 //D2 #define Control_bee 3 //指示D3 蜂鸣器 #define Control_waterpump 4 //指示D4 水泵 #define DHTPIN 5 ///温度输出引脚,D5 #define DHTTYPE DHT11 //定义传感器类型 #define Control_led 6 //指示D6 灯泡 #define Control_motor 7 //控制电机 #define Control_fan 8 //指示D13 风扇 //人体红外传感器 #define PIR_sensor A3 //指定PIR模拟端口 A3
DHT dht(DHTPIN, DHTTYPE); //define DHT温湿度 const int csPin = 10; // LoRa radio chip select const int resetPin = 9; // LoRa radio reset const int irqPin = 2; // change for your board; must be a hardware interrupt pin String outgoing; // outgoing message byte msgCount = 0; // count of outgoing messages byte localAddress = 0xFF; // address of this device byte destination = 0xBB; // destination to send to long lastSendTime = 0; // last send time int interval = 6000; // interval between sends
//自控制flag标志 int bee_flag = 0; //设置蜂鸣器flag int fan_flag = 0; //设定风扇flag int waterpump_flag = 0; //设置水泵flag
int redlight_value; //红外值 int light_value; //光强 float tem_float ; //温度 int soilsensor_value2; ///土壤湿度 int array[100]; ///全局字符串 String temandhum = ""; //温湿度 String redlight = ""; //红外 String light = ""; //光敏 String smoke = ""; //烟雾 String soil = ""; ///土壤湿度 String mergestring = ""; ///合并后的字符串 String encode_str = "";//编码字符串 //线程的函数名字 static struct pt receive_pt, water_pt, send_pt, motor_pt,fan_pt;
void setup() { pinMode(PIR_sensor, INPUT); //设置PIR输入模式为模拟端口 //人体红外 pinMode(Soil_sensor, INPUT);//土壤湿度传感器 pinMode(Soil_sensor_D, INPUT); pinMode(Smoke_sensor, INPUT);///烟雾湿度传感器 pinMode(Smoke_sensor_D, INPUT); pinMode(Control_led, OUTPUT); ////设置数字端口输出模式 //灯泡 pinMode(Control_bee, OUTPUT); //蜂鸣器 pinMode(Control_fan, OUTPUT); //风扇 digitalWrite(Control_fan, LOW); pinMode(Control_waterpump, OUTPUT); //水泵 digitalWrite(Control_waterpump, LOW); pinMode(Control_motor, OUTPUT); //电机 digitalWrite(Control_motor, LOW);///关闭电磁锁
///线程定义 PT_INIT(&receive_pt); PT_INIT(&water_pt); PT_INIT(&send_pt); PT_INIT(&motor_pt); PT_INIT(&fan_pt);
Serial.begin(9600); // initialize serial while (!Serial); dht.begin(); //initialize dht Serial.println("LoRa Duplex"); // override the default CS, reset, and IRQ pins (optional) LoRa.setPins(csPin, resetPin, irqPin);// set CS, reset, IRQ pin if (!LoRa.begin(434E6)) { // initialize ratio at 434E6MHz Serial.println("LoRa init failed. Check your connections."); while (true); // if failed, do nothing } Serial.println("LoRa init succeeded."); }
static int pro_receive(struct pt *receive_pt) { PT_BEGIN(receive_pt); Receivedata(); PT_END(receive_pt); } static int pro_senddata(struct pt *send_pt) { PT_BEGIN(send_pt); Senddata(); PT_END(send_pt); } static int pro_controlwater(struct pt *water_pt) { PT_BEGIN(water_pt); control_waterpump(); PT_END(water_pt); } static int pro_controlfan(struct pt *fan_pt) { PT_BEGIN(fan_pt); control_fan(); PT_END(fan_pt); } static int pro_motor(struct pt *motor_pt) { PT_BEGIN(motor_pt); control_step(); //控制电机 PT_END(motor_pt);
}
void Receivedata() { int packetSize = LoRa.parsePacket(); if (packetSize) { Serial.println("Received packet");// received a packet while (LoRa.available()) { // read packet for (int i = 0; i < 3; i++) { array[i] = LoRa.read(); Serial.println(array[i]); } if (array[0] == 1) { if (array[1] == 1) { control_led();//控制灯亮 } else if (array[1] == 2) { control_bee_flag(); //控制蜂鸣器的flag变化 } else if (array[1] == 3) { pro_motor(&motor_pt); //控制电机 } else if (array[1] == 4) { control_fan_flag(); //控制风扇 } else if (array[1] == 5) { control_waterpump_flag(); //控制水泵 } } } } }
void Senddata() { if (millis() - lastSendTime > interval) { String message = encode_str; // send a message Serial.println(mergestring); //Serial.println(message); sendMessage(message); //Serial.println("Sending " + message); lastSendTime = millis(); // timestamp the message interval = random(2000) + 1000; // 2-3 seconds 6000->2000 } mergestring = ""; encode_str = ""; //将字符串置为空 }
//LoRa发送函数 void sendMessage(String outgoing) {
LoRa.beginPacket(); // start packet //LoRa.write(destination); // add destination address //LoRa.write(localAddress); // add sender address //LoRa.write(msgCount); // add message ID //LoRa.write(outgoing.length()); // add payload length LoRa.print(outgoing); // add payload LoRa.endPacket(); // finish packet and send it msgCount++; // increment message ID Serial.println("我们行");
}
//温湿度函数 void TemAndHum() { String hum_str = "1!Hum:"; String tem_str = ",Tem:"; float hum_float = dht.readHumidity();//读取温湿度 tem_float = dht.readTemperature(); hum_str.concat(String(hum_float)); tem_str.concat(String(tem_float)); hum_str.concat(tem_str); temandhum = hum_str; }
//光强函数 void photosensitive() { light_value = analogRead(PIN_A); String light_str = ",light:"; light_str.concat(String(light_value)); light = light_str; }
//红外函数 void infraredsensor() { redlight_value = analogRead(PIR_sensor); if (redlight_value != 0)//判断PIR数值是否大于150, { redlight_value = 1; //感应到人 } else { redlight_value = 0; //表示没有人 } String redlight_str = ",redlight:"; redlight_str.concat(String(redlight_value)); redlight = redlight_str; }
//烟雾函数 void smokesensor() { int smokesensor_value; smokesensor_value = analogRead(Smoke_sensor); if (smokesensor_value < 10) { smokesensor_value = 10; } else if (smokesensor_value > 99) { smokesensor_value = 99; } String smokesensor_str = ",smoke:"; smokesensor_str.concat(String(smokesensor_value)); smoke = smokesensor_str; }
//土壤湿度函数 void soilsensor() { int soilsensor_value1; soilsensor_value1 = analogRead(Soil_sensor); //int soilsensor_value2; soilsensor_value2 = 23 + ((1023 - soilsensor_value1) / 10); String soilsensor_str1 = ",soil:"; String soilsensor_str2 = "%"; soilsensor_str1.concat(String(soilsensor_value2)); soilsensor_str1.concat(String(soilsensor_str2)); soil = soilsensor_str1; }
//字符串拼接函数 void MergeString() { mergestring.concat(temandhum); mergestring.concat(light); mergestring.concat(redlight); mergestring.concat(smoke); mergestring.concat(soil); }
//字符串编码为ASCII值函数 void Encode() { int mergestring_length; mergestring_length = mergestring.length(); //Serial.println(mergestring_length); String encode_string = ""; for (int i = 0; i < mergestring_length; i++) { if (mergestring[i] == 48) encode_string.concat("30"); else if (mergestring[i] == 49) encode_string.concat("31"); else if (mergestring[i] == 50) encode_string.concat("32"); else if (mergestring[i] == 51) encode_string.concat("33"); else if (mergestring[i] == 52) encode_string.concat("34"); else if (mergestring[i] == 53) encode_string.concat("35"); else if (mergestring[i] == 54) encode_string.concat("36"); else if (mergestring[i] == 55) encode_string.concat("37"); else if (mergestring[i] == 56) encode_string.concat("38"); else if (mergestring[i] == 57) encode_string.concat("39"); //0-9;
else if (mergestring[i] == 65) encode_string.concat("41"); else if (mergestring[i] == 66) encode_string.concat("42"); else if (mergestring[i] == 67) encode_string.concat("43"); else if (mergestring[i] == 68) encode_string.concat("44"); else if (mergestring[i] == 69) encode_string.concat("45"); else if (mergestring[i] == 70 ) encode_string.concat("46"); else if (mergestring[i] == 71) encode_string.concat("47"); else if (mergestring[i] == 72) encode_string.concat("48"); else if (mergestring[i] == 73) encode_string.concat("49"); else if (mergestring[i] == 74) encode_string.concat("4a"); else if (mergestring[i] == 75) encode_string.concat("4b"); else if (mergestring[i] == 76) encode_string.concat("4c"); else if (mergestring[i] == 77) encode_string.concat("4d"); else if (mergestring[i] == 78) encode_string.concat("4e"); else if (mergestring[i] == 79) encode_string.concat("4f"); else if (mergestring[i] == 80) encode_string.concat("50"); else if (mergestring[i] == 81) encode_string.concat("51"); else if (mergestring[i] == 82) encode_string.concat("52"); else if (mergestring[i] == 83) encode_string.concat("53"); else if (mergestring[i] == 84) encode_string.concat("54"); else if (mergestring[i] == 85) encode_string.concat("55"); else if (mergestring[i] == 86) encode_string.concat("56"); else if (mergestring[i] == 87) encode_string.concat("57"); else if (mergestring[i] == 88) encode_string.concat("58"); else if (mergestring[i] == 89) encode_string.concat("59"); else if (mergestring[i] == 90) encode_string.concat("5a"); //大写字母
else if (mergestring[i] == 97) encode_string.concat("61"); else if (mergestring[i] == 98) encode_string.concat("62"); else if (mergestring[i] == 99) encode_string.concat("63"); else if (mergestring[i] == 100) encode_string.concat("64"); else if (mergestring[i] == 101) encode_string.concat("65"); else if (mergestring[i] == 102 ) encode_string.concat("66"); else if (mergestring[i] == 103) encode_string.concat("67"); else if (mergestring[i] == 104) encode_string.concat("68"); else if (mergestring[i] == 105) encode_string.concat("69"); else if (mergestring[i] == 106) encode_string.concat("6a"); else if (mergestring[i] == 107) encode_string.concat("6b"); else if (mergestring[i] == 108) encode_string.concat("6c"); else if (mergestring[i] == 109) encode_string.concat("6d"); else if (mergestring[i] == 110) encode_string.concat("6e"); else if (mergestring[i] == 111) encode_string.concat("6f"); else if (mergestring[i] == 112) encode_string.concat("70"); else if (mergestring[i] == 113) encode_string.concat("71"); else if (mergestring[i] == 114) encode_string.concat("72"); else if (mergestring[i] == 115) encode_string.concat("73"); else if (mergestring[i] == 116) encode_string.concat("74"); else if (mergestring[i] == 117) encode_string.concat("75"); else if (mergestring[i] == 118) encode_string.concat("76"); else if (mergestring[i] == 119) encode_string.concat("77"); else if (mergestring[i] == 120) encode_string.concat("78"); else if (mergestring[i] == 121) encode_string.concat("79"); else if (mergestring[i] == 122) encode_string.concat("7a"); //小写字母 else if (mergestring[i] == 44 ) encode_string.concat("2c"); else if (mergestring[i] == 58 ) encode_string.concat("3a"); else if (mergestring[i] == 46 ) encode_string.concat("2e"); else if (mergestring[i] == 33 ) encode_string.concat("21"); else if (mergestring[i] == 37 ) encode_string.concat("25");
} encode_str = encode_string; //局部变量赋给全局变量
}
//控制灯函数 void control_led() { if (array[2] == 0) { digitalWrite(Control_led, LOW); } else { digitalWrite(Control_led, HIGH); } }
//改变bee_flag 当是bee_flag是0时,开启检测;当bee_flag是1时,关闭检测 void control_bee_flag() { if (array[2] == 0) { bee_flag = 0; } else { bee_flag = 1; } }
//通过bee_flag的值,来判断蜂鸣器的开关状态 void control_bee() { if (bee_flag == 1) { if (redlight_value == 0) { digitalWrite(Control_bee, LOW); } else { digitalWrite(Control_bee, HIGH); } } else if (bee_flag == 0) { digitalWrite(Control_bee, LOW); } }
//控制风扇的fan_flag值变化 当fan_flag=0时,开启检测;当fan_flag=1时,关闭检测 void control_fan_flag() { if (array[2] == 1) { fan_flag = 1; } else { fan_flag = 0; } } //根据风扇fan_flag变化来确定风扇状态 void control_fan() { if (fan_flag == 1) { if (tem_float >30) { digitalWrite(Control_fan, LOW); } else { digitalWrite(Control_fan, HIGH); } } else if (fan_flag == 0) { digitalWrite(Control_fan, HIGH); } }
//控制电机函数 void control_step() { if (array[2] == 1) { Serial.println("NI1"); digitalWrite(Control_motor, HIGH); //打开电磁锁 delay(5000); //延时一定时间 digitalWrite(Control_motor, LOW);//关闭电磁锁
} else if (array[2] == 0) { Serial.println("shun0"); digitalWrite(Control_motor, HIGH); //打开电磁锁 delay(5000); //延时一定时间 digitalWrite(Control_motor, LOW);//关闭电磁锁
}
}
//控制水泵的waterpump_flag值变化 当waterpump_flag=1时,开启检测;当waterpump_flag=0时,关闭检测 void control_waterpump_flag() { if (array[2] == 1) { waterpump_flag = 1; } else { waterpump_flag = 0; } }
//控制水泵函数 void control_waterpump() { if (waterpump_flag == 1) { if (soilsensor_value2 < 30) { digitalWrite(Control_waterpump, LOW); } else { digitalWrite(Control_waterpump, HIGH); } } else if (waterpump_flag == 0) { digitalWrite(Control_waterpump, HIGH); } }
void loop() { TemAndHum();//读取温湿度 photosensitive();//读取光强 infraredsensor();//读取红外 smokesensor(); //读取烟雾 soilsensor(); //读取土壤湿度 MergeString();//合并字符串 Encode();//编码 pro_senddata(&send_pt); pro_receive(&receive_pt);
control_bee(); //控制蜂鸣器状态 //control_fan(); //控制风扇状态 pro_controlfan(&fan_pt); pro_controlwater(&water_pt);//控制水泵 }