

// Arduino kapacitní senzor vlhkosti v půdě
// připojení knihoven
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SoftwareSerial.h>

// nastavení propojovacího pinu vlhkosti
#define analogPin0 A0
#define analogPin1 A1
#define analogPin2 A2
// nastavení projojovacích pinů k sigfoxu
#define TX 7
#define RX 8
//napájecí pin
#define vccPin 4

// proměnná pro uložení času měreni
unsigned long cas = 0;
unsigned long interval = 1800000;
// proměnná pro ukládání výsledků měření
int data0 = 0;
int data1= 0;
int data2 = 0;
// nastavení čísla vstupního pinu
const int pinCidlaDS = 2;
// vytvoření instance oneWireDS z knihovny OneWire
OneWire oneWireDS(pinCidlaDS);
// vytvoření instance senzoryDS z knihovny DallasTemperature
DallasTemperature senzoryDS(&oneWireDS);
// inicializace softwarové sériové linky z knihovny
SoftwareSerial Sigfox(RX, TX); 


void setup(void) {
  // inicializace sériové linky s rychlostí 9600 baud
  Serial.begin(9600);
  // zahájení komunikace po softwarové sériové lince rychlostí 9600 baud
  Sigfox.begin(9600);
  //inicializace blikani vestavěné ledky
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(vccPin, OUTPUT);
  // vypnutí napájecího napětí pro modul
  digitalWrite(vccPin, LOW);

  // zapnutí komunikace knihovny s teplotním čidlem
  senzoryDS.begin();  
}

void loop() {
    // když dostaneme nějaké znaky na softwarové sériové lince,
  // odešleme je do počítače
  if (Sigfox.available()) {
    Serial.write(Sigfox.read());
  }
  // když dostaneme nějaké znaky na počítačové sériové lince,
  // odešleme je do Sigfox modulu
  if (Serial.available()) {
    Sigfox.write(Serial.read());
  }
  // pokud je rozdíl mezi aktuálním časem a posledním
  // uloženým větší než 1800000 ms, proveď měření = 30min 1800000
  if (millis() - cas >= interval) {
    // zapneme napájecí napětí pro modul s krátkou pauzou
    // pro ustálení napětí
    digitalWrite(vccPin, HIGH);
    delay(100);
  // načtení hodnoty ze senzoru
  data0 = analogRead(analogPin0);
  data1 = analogRead(analogPin1);
  data2 = analogRead(analogPin2);
  // vytištění výsledků po sériové lince 
  Serial.print("Hodnota nactena ze senzoru 1: ");
  Serial.println(data0);
    Serial.print("Hodnota nactena ze senzoru 2: ");
  Serial.println(data1);
    Serial.print("Hodnota nactena ze senzoru 3: ");
  Serial.println(data2);
  // pokud je překonána nastavená hranice,
  // vytiskneme ještě upozornění
  if (data0 > 500) {
    Serial.println("Prekrocena nastavena hranice, senzor1 na suchu!");
  }
    if (data1 > 500) {
    Serial.println("Prekrocena nastavena hranice, senzor2 na suchu!");
  }
    if (data2 > 500) {
    Serial.println("Prekrocena nastavena hranice, senzor3 na suchu!");
  }
  // pauza před novým měřením, ledka blika
  delay(500);
    digitalWrite(LED_BUILTIN, HIGH);
  delay(180);
  digitalWrite(LED_BUILTIN, LOW);
  delay(80);

    // načtení informací ze všech připojených čidel na daném pinu
  senzoryDS.requestTemperatures();
  // výpis teploty na sériovou linku, při připojení více čidel
  // na jeden pin můžeme postupně načíst všechny teploty
  // pomocí změny čísla v závorce (0) - pořadí dle unikátní adresy čidel
  Serial.print("Teplota cidla DS18B20: ");
  Serial.print(senzoryDS.getTempCByIndex(0));
  Serial.println(" stupnu Celsia");
  // pauza pro přehlednější výpis
  delay(1000);

  

  odesliData();
  delay(1000);
  digitalWrite(vccPin, LOW);
  cas = millis();
  
}
}

void odesliData() {
    // vytvoření proměnné typu char o velikosti 4 znaků,
    // do 4 hexa znaků lze uložit číslo typu uint
    // (velikost 0 až 65535)
    char zprava[12];
    // vytvoření proměnné typu unsigned integer a načtení hodnoty
    // analogového pinu A0
    unsigned int cislo1 = analogRead(A0);//spodni
    unsigned int cislo2 = analogRead(A1);//prostredek
    unsigned int cislo3 = analogRead(A2);//horni
    unsigned int cislo11 = 100-(((cislo1+40)-180)/4.2);//kalibrace a procenta 1      
    unsigned int cislo22 = 100-(((cislo2)-180)/4.2);//kalibrace a procenta 2
    unsigned int cislo33 = 100-(((cislo3)-180)/4.2);//kalibrace a procenta 3
    float cislo4 = senzoryDS.getTempCByIndex(0);  
    int cislo5;//teplota bez tecky
    cislo5 = cislo4 * 100;
    
    // převod načteného čísla na hexadecimální tvar o 4 znacích
    sprintf(zprava, "%04X%04X%04X%04X", cislo11, cislo22, cislo33, cislo5);
    Serial.print("Odeslani dat do Sigfox site, odesilam: ");
    Serial.print(cislo11);
    Serial.print(", ");
    Serial.print(cislo22);
    Serial.print(", ");
    Serial.print(cislo33);
    Serial.print(", ");
    Serial.print(cislo5);    
    Serial.print(", hexa tvar: ");
    Serial.println(zprava);
    Sigfox.print("AT$SF=");
    Sigfox.println(zprava);
    delay(1000);
}

