智能温室系统 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);//控制水泵
  
}

 

 

 

 

  • 3
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值