Arduino UNO

Nel progetto ad Arduino è affidato il compito di interfacciamento con l’ambiente, nell’acquisire i valori rilevati dai sensori di Temperatura, Umidità del terreno e Illuminazione, e nel gestire la attivazione degli attuatori (Riscaldatore, Pompa di irrigazione e Lampada di illuminazione).

Ad ogni lettura dei sensori, temporizzata dal ritardo di esecuzione presente nello sketch, Arduino invia sulla Seriale, tramite la quale è collegato con il Raspberry, i valori rilevati e, su questa, rimane in ascolto dello stato degli attuatori che Raspberry gli passa, attivandoli o disattivandoli a seconda del loro valore.
La stringa inviata sulla seriale è formattata secondo il seguente schema:

! valore T | valore H | valore L /

per riconoscerne l’inizio e la fine trasmissione.

Programma Arduino:

#include <OneWire.h>
#include <DallasTemperature.h>
 
// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 2
// Setup a oneWire instance to communicate with any OneWire devices 
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature Tsensor(&oneWire); //DS18B20

// vars sensori T, H, L 
int acq_T = 0;
int acq_H = 0;
int acq_L = 0;
int t_value = 0;
int h_value = 0;
int l_value = 0;
// pins Acquisizione Analogicam
const int pinH = A1;
const int pinL = A2;
// pins Attuatori
const int pinAttuatore_T = 8; //led Verde -> Uscita RISCALDATORE
const int pinAttuatore_H = 9; //led Giallo -> Uscita IRRIGATORE
const int pinAttuatore_L = 10; //led Rosso -> Uscita ILLUMINAZIONE
int incoming;
char rxSeriale[5];
int counter = 0;
const int pinLED = 13;
unsigned long inizioIrrigazione = 0; // in millisecondi
const unsigned long tempoIrrigazione = 10L * 1000L; // ritardo durata irrigazione, in millisecondi

void setup() {
  // output
  pinMode(pinAttuatore_T, OUTPUT);
  pinMode(pinAttuatore_H, OUTPUT);
  pinMode(pinAttuatore_L, OUTPUT);
  pinMode(pinLED, OUTPUT);
  digitalWrite(pinLED, LOW);
  // Start up the library T sensor
  Tsensor.begin();
}

void loop() {
  // lettura e condizionamento Sensori
  Tsensor.requestTemperatures(); // Send the command to get temperatures
  t_value = Tsensor.getTempCByIndex(0);
  acq_H = analogRead(pinH); // H
  h_value = map(acq_H,250,1023,100,0); // converto il valore di acq_H (0-1023) in %H sapendo che in H2o acq_h=180 -> 100%H
  acq_L = analogRead(pinL); // L
  l_value = map(acq_L,0,740,0,4700); //nverto il valore di acq_L (0-1023) in LUX sapendo che acq_l=740 -> 4700 lux
  //gestione comunicazione seriale
  if(counter==0) Serial.begin(9600);
  //invio seriale valori Sensori
  invioSeriale(int(t_value),int(h_value),int(l_value));
  //lettura della risposta seriale di Raspberry per Attuatori
  if (Serial.available() > 0) {
    while(counter<=5){
      incoming = Serial.read();
      rxSeriale[counter]=incoming;
      Serial.println(rxSeriale[counter]);
      counter++;
      if(rxSeriale[0]=='1') digitalWrite(pinAttuatore_T, HIGH); //controllo Riscaldatore
      if(rxSeriale[0]=='0') digitalWrite(pinAttuatore_T, LOW);
      if(rxSeriale[2]=='1') digitalWrite(pinAttuatore_H, HIGH); //controllo Irrigazione
      if(rxSeriale[2]=='0') digitalWrite(pinAttuatore_H, LOW);
      if(rxSeriale[4]=='1') digitalWrite(pinAttuatore_L, HIGH); //controllo Illuminazione
      if(rxSeriale[4]=='0') digitalWrite(pinAttuatore_L, LOW);
    }
    counter=0; 
    //Serial.println("Fine comunicazione");
    Serial.end();
  }
  //ritardo di esecuzione
  delay(3000);
}
void invioSeriale(int T, int H, int L){
  Serial.print("!");
  Serial.print(T);
  Serial.print("|");
  Serial.print(H);
  Serial.print("|");
  Serial.print(L);
  Serial.println("/");
}