Kümes Otomasyonu

Kümes Otomasyonu

Bu yazımızda basit bir otomasyon sistemi nasıl kurulur onu anlatacağım. Örnek olarak bir kümes otomasyonu kuracağız. Sıcaklık ve nem değerlerini iki farklı noktadan ölçümleyip değerleri Arduino Cloud üstünden kaydedeceğiz. Ardından gelen verileri göze hitap güzel grafiklere çevireceğiz.

iş bulma ve kurma adına işinize yarayabileceğini düşünüyor. Neticede uzaktan izleme ve kontrol sistemleri işletmelerin üretimlerini arttırdığı için akıllı tarım ve hayvancılık yapan yerlerde çokça tercih edilmektedir. NEden pahalı ithal çözümlere gidelim kendimiz yapalım 💪🏻.

Gerekli Malzemeler:

LoRa Başlangıç Seti
LoRa Başlangıç Seti

E32 433T20D Lora Modülü uygun anten, PCB , Kutu ve Arduino nano modülleri ile birlikte en Uygun Fiyatlı set.

ESP32 ve 3in1 esp32 PCB ürünleri satın almak için tıklayın.

3in1 esp32 PCB

30 pin ESP32

HDC1080 Sıcaklık ve nem Sensörü
HDC1080 Sıcaklık ve nem Sensörü

Kodlar

Sıcaklık ve nem sensör noktalarından birisi

#include "LoRa_E32.h"
#include <SoftwareSerial.h>
#include <Wire.h>
#include "ClosedCube_HDC1080.h"

ClosedCube_HDC1080 hdc1080;

SoftwareSerial mySerial(10, 11);
LoRa_E32 FixajSS(&mySerial);

#define M0 7
#define M1 6

//PARAMETRE AYARLARI
#define Adres 2   //0--65000 arası bir değer girebilirsiniz. Diğer Modüllerden FARKLI olmalı
#define Kanal 20  //Frekans değeri Diğer Modüllerle AYNI olmalı.
//E32 için 0--31 arasında bir sayı giriniz.
//E32 433 için Frekans = 410 + kanal değeri

#define GonderilecekAdres 3  //Mesajın gönderileceği LoRa nın adresi

struct Signal {
  char sifre[15] = "Fixaj.com";
  byte id;
  char konum[15];
  byte nem[4];   //0-100 arası bir değer olduğu için
  byte temp[5];  //0-250 arası bir değer yeterli şimdilik
                 // float tipinde 29.5 gibi bir değer atacak
} data;


void setup() {
  pinMode(M0, OUTPUT);
  pinMode(M1, OUTPUT);

  Serial.begin(9600);
  FixajSS.begin();

  LoraE32Ayarlar();  // parametre ayarlarını buradan verecek

  digitalWrite(M0, LOW);
  digitalWrite(M1, LOW);

  hdc1080.begin(0x40);

  delay(500);
  Serial.println("başlıyoruz.. Fixaj.com");
}

void loop() {



  *(float*)(data.temp) = hdc1080.readTemperature();
  *(float*)(data.nem) = hdc1080.readHumidity();
  strcpy(data.konum, "Mutfak");
  data.id = 2;

  Serial.print("T=");
  Serial.print(*(float*)(data.temp));
  Serial.print("C, RH=");
  Serial.print(*(float*)(data.nem));
  Serial.println("%");

  /*
  delay(2000);  
  data.btn1 = false;
  *(float*)(data.btn2) = 37.199386;
  *(int*)(data.btn3) = 1453;
  strcpy(data.konum, "Teknofest");
*/
  //sıcaklık ve nem değerlerini ölçüp 2 saniyede bir merkeze iletecek.
  ResponseStatus rs = FixajSS.sendFixedMessage(highByte(GonderilecekAdres), lowByte(GonderilecekAdres), Kanal, &data, sizeof(Signal));
  delay(2000);
}

void LoraE32Ayarlar() {
  digitalWrite(M0, HIGH);
  digitalWrite(M1, HIGH);

  ResponseStructContainer c;
  c = FixajSS.getConfiguration();
  Configuration configuration = *(Configuration*)c.data;


  //DEĞİŞEBİLEN AYARLAR
  // Üstte #define kısmında ayarlayınız
  configuration.ADDL = lowByte(Adres);
  configuration.ADDH = highByte(Adres);
  configuration.CHAN = Kanal;

  //SEÇENEKLİ AYARLAR
  configuration.SPED.airDataRate = AIR_DATA_RATE_010_24;  //Veri Gönderim Hızı 2,4 varsayılan
  //configuration.SPED.airDataRate = AIR_DATA_RATE_000_03;  //Veri Gönderim Hızı 0,3 En uzak Mesafe
  //configuration.SPED.airDataRate = AIR_DATA_RATE_101_192; //Veri Gönderim Hızı 19,2 En Hızlı


  configuration.OPTION.transmissionPower = POWER_20;  //Geönderim Gücü max Varsayılan
  //configuration.OPTION.transmissionPower = POWER_10;  //Geönderim Gücü min
  //configuration.OPTION.transmissionPower = POWER_30; // E32 30d modülleri için bunu aktif et

  //GELİŞMİŞ AYARLAR
  configuration.SPED.uartBaudRate = UART_BPS_9600;
  configuration.SPED.uartParity = MODE_00_8N1;
  configuration.OPTION.fec = FEC_0_OFF;
  //configuration.OPTION.fec = FEC_1_ON;
  configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;
  //configuration.OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION;
  configuration.OPTION.wirelessWakeupTime = WAKE_UP_250;
  configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS;

  // Ayarları KAYDET ve SAKLA
  ResponseStatus rs = FixajSS.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
  c.close();
}

Alıcı Server tarafı ESP32

/* 
  Sketch generated by the Arduino IoT Cloud Thing "Untitled"
  https://create.arduino.cc/cloud/things/709334d5-910a-4171-bb47-8818ebf3c0f6 

  Arduino IoT Cloud Variables description

  The following variables are automatically generated and updated when changes are made to the Thing

  float nemKumes;
  float nemMutfak;
  float tempKumes;
  float tempMutfak;
  bool anahtarc;

  Variables which are marked as READ/WRITE in the Cloud Thing will also have functions
  which are called when their values are changed from the Dashboard.
  These functions are generated with the Thing and added at the end of this sketch.
*/
#include "arduino_secrets.h"
#include "thingProperties.h"

#include <LoRa_E32.h>  // E32 modülleri için bunu aktif et
#include <HardwareSerial.h>
#define M0 32  //3in1 PCB mizde pin 7
#define M1 33  //3in1 PCB mizde pin 6
#define RX 27  //  Lora nın 3. pini RX in ESP 32 de hangi pine bağlı olduğu
#define TX 35  // Lora nın 4. pini TX in ESP 32 de hangi pine bağlı olduğu

//Alıcı tarafı ESP32 olduğu parametre ayaraları değişmemiz gerekiyor.

HardwareSerial fixajSerial(1);  //esp32 hardware serial kullanıyoruz
LoRa_E32 FixajSS(TX, RX, &fixajSerial, UART_BPS_RATE_9600);

#define Adres 3   //0--65000 arası bir değer girebilirsiniz. Diğer Modüllerden FARKLI olmalı
#define Kanal 20  //Frekans değeri
//E32 için 0--31 arasında bir sayı giriniz.
//E32 433 için Frekans = 410+kanal değeri

#define roleKontak 14

struct Signal {
  char sifre[15] = "Fixaj.com";
  byte id;
  char konum[15];
  byte nem[4];   //0-100 arası bir değer olduğu için
  byte temp[5];  //0-250 arası bir değer yeterli şimdilik
                 // float tipinde 29.5 gibi bir değer atacak
} data;

void setup() {
  // Initialize serial and wait for port to open:
  Serial.begin(9600);
  // This delay gives the chance to wait for a Serial Monitor without blocking if none is found
  delay(1500);

  // Defined in thingProperties.h
  initProperties();

  // Connect to Arduino IoT Cloud
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);

  /*
     The following function allows you to obtain more information
     related to the state of network and IoT Cloud connection and errors
     the higher number the more granular information you’ll get.
     The default is 0 (only errors).
     Maximum is 4
 */
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();

  pinMode(M0, OUTPUT);
  pinMode(M1, OUTPUT);

  LoraE32Ayarlar();
  digitalWrite(M0, LOW);
  digitalWrite(M1, LOW);

  pinMode(roleKontak, OUTPUT);

  delay(500);
  Serial.println("başlıyoruz.. Fixaj.com");
}

void loop() {
  ArduinoCloud.update();
  while (FixajSS.available() > 1) {

    ResponseStructContainer rss = FixajSS.receiveMessage(sizeof(Signal));
    struct Signal data = *(Signal*)rss.data;

    if (strcmp(data.sifre, "Fixaj.com") == 0) {
      //Serial.println("Sifre dogru");
      Serial.print("Konum1: ");
      Serial.print(data.konum);
      Serial.print("\t id: ");
      Serial.print(data.id);
      Serial.print("\t sicaklik: ");
      Serial.print(*(float*)(data.temp), 2);  // float tipinde olduğu için cast etmem lazım
      Serial.print("\t Nem: ");
      Serial.println(*(float*)(data.nem), 2);

      if (data.id == 1) {
        Serial.println("kümes verisi geldi");
        nemKumes = *(float*)(data.nem);
        tempKumes = *(float*)(data.temp);
      } else if (data.id == 2) {
        Serial.println("mutfak verisi geldi");
        nemMutfak = *(float*)(data.nem);
        tempMutfak = *(float*)(data.temp);
      }
    }


    rss.close();
  }
}

/*
  Since Anahtar is READ_WRITE variable, onAnahtarChange() is
  executed every time a new value is received from IoT Cloud.
*/


void LoraE32Ayarlar() {
  digitalWrite(M0, HIGH);
  digitalWrite(M1, HIGH);
  FixajSS.begin();  // şurayı unutunca ESP32 sürekli ken boot eder !!!DİKKAT!!!

  ResponseStructContainer c;
  c = FixajSS.getConfiguration();
  Configuration configuration = *(Configuration*)c.data;

  //DEĞİŞEBİLEN AYARLAR
  // Üstte #define kısmında ayarlayınız
  configuration.ADDL = lowByte(Adres);
  configuration.ADDH = highByte(Adres);
  configuration.CHAN = Kanal;

  //SEÇENEKLİ AYARLAR
  configuration.SPED.airDataRate = AIR_DATA_RATE_010_24;  //Veri Gönderim Hızı 2,4 varsayılan
  //configuration.SPED.airDataRate = AIR_DATA_RATE_000_03;  //Veri Gönderim Hızı 0,3 En uzak Mesafe
  //configuration.SPED.airDataRate = AIR_DATA_RATE_101_192; //Veri Gönderim Hızı 19,2 En Hızlı

  configuration.OPTION.transmissionPower = POWER_20;  //Geönderim Gücü max Varsayılan
  //configuration.OPTION.transmissionPower = POWER_10;  //Geönderim Gücü min
  //configuration.OPTION.transmissionPower = POWER_30; // E32 30d modülleri için bunu aktif et

  //GELİŞMİŞ AYARLAR
  configuration.SPED.uartBaudRate = UART_BPS_9600;
  configuration.SPED.uartParity = MODE_00_8N1;
  configuration.OPTION.fec = FEC_0_OFF;
  //configuration.OPTION.fec = FEC_1_ON;
  configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;
  //configuration.OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION;
  configuration.OPTION.wirelessWakeupTime = WAKE_UP_250;
  configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS;

  // Ayarları KAYDET ve SAKLA
  ResponseStatus rs = FixajSS.setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
  c.close();
}
/*
  Since Anahtarc is READ_WRITE variable, onAnahtarcChange() is
  executed every time a new value is received from IoT Cloud.
*/
void onAnahtarcChange() {
  digitalWrite(roleKontak, anahtarc);
}

Sonuç

Photo by Egor Myznik on Unsplash