智能温室系统 1 arduino采集数据 lora收发数据 控制电机水泵等
时间:2022-10-10 21:30:00
@[智能温室系统第一步传感器数据采集 Arduino
# 用于开发板arduino开发板
使用的是arduino ide 可到官网下载
我的代码涉及三个外包LORA 温湿度 线程
如果你懒得,你可以下载我的源码。lora原始收发程序
https://download.csdn.net/download/publicdust/11388928
该代码有三个功能
一
读取温湿度传感器、红外传感器、光敏、土壤湿度、烟雾等各种传感器的数据
二
将数据通过LoRa和树莓派等Arduino的通讯
三
接受覆盆子派的数据,并进行相应的操作。包括电机旋转、泵泵泵、打开灯、蜂鸣器报警。
在这里,代码涉及代码涉及到数据格式的转换。事实上,如果读取数据来完成数据传输,而不需要代码转换,因为我需要通过NBIOT因此,此转换添加到代码中,无需注释即可。此处声明代码中使用的通信频率为434。
二话不说直接上代码
代码中有注释
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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);//控制水泵
}