资讯详情

智能温室系统 1 arduino采集数据 lora收发数据 控制电机水泵等

@[智能温室系统第一步传感器数据采集 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);//控制水泵    }

 

 

 

 

标签: 温湿度传感器怎么连接ni

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台