锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2022-10-10 21:30:00 温湿度传感器怎么连接ni

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

 

 

 

 

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

相关文章