Go Down

Topic: Impianto di irrigazione comandato da sim800l (Read 1 time) previous topic - next topic

salvatore_paterna

Caspita neanche leggendo 50 tutorial ero riuscito a capire quello che mi hai spiegato tu in 6 post !
Ma quindi quando esce dal ciclo if e i rispettivi cicli else if arriva all'else e li resetta le variabili


Grazie Brunello

salvatore_paterna


Ciao Brunello ho apportato due piccole modifiche adesso funziona tutto al 99 % l'unico problema che quando lo stato del galleggiante MAX == HIGH e MIN == LOW il funzionamento è esatto quindi pompa On vasca Off poi quando cambia MAX == LOW e MIN == HIGH diventa pompa On Vasca On il problema è quando ritorna  MAX == HIGH e MIN == HIGH  passa a  vascaOff e invece dovrebbe rimanere On fino a quando non incontra a MIN == HIGH e MAX == HIGH solo al verificarsi di questa condizione vasca dovrebbe ritornare off

salvatore_paterna

#32
May 28, 2018, 03:52 pm Last Edit: May 28, 2018, 04:25 pm by salvatore_paterna
ciao Brunello dopo averci pensato su ho modificato il codice nella parte Vasca piena per evitare il problema d cui spiegavo sopra perché all'inizio avevo sottovalutato il fatto che i galleggianti hanno due stati quindi sono indeciso se fare come ho spiegato sotto oppure salvare lo stato del galleggiante in una variabile come abbiamo fatto con il pulsante pinOnOff , solo che ho notato che sono al limite con la memoria dinamica.
ho anche aggiunto " sms.SendSMS (mittenteregistrato,"STATUS:  ANOMALIA  ");" senno non mi inviava l'sms
spero di aver capito il funzionamento dell'if
Proverò e ti faro sapere grazie della tua infinita pazienza


Code: [Select]



  
  OnOff = digitalRead (pinOnOff);
  if (OnOff != lastOnOff) {
    if (OnOff == LOW) {
      statoOnOff = !statoOnOff ;
    }
    delay(75);
  }
  lastOnOff = OnOff;
  digitalWrite(pinstatoimpianto, statoOnOff);

  // se lo stato dal pulsante è vero oppure  se lo stato da SMS è vero
 if (statoOnOff ) {
    MIN = digitalRead (gallmin);
    MAX = digitalRead (gallmax);
    SUPERPIENO = digitalRead (superpieno);
 if (MAX == HIGH && MIN == HIGH)  { //VASCA VUOTA
       if (inviosms == true ) {
      sms.SendSMS(Mittente, "STATUS:Vasca vuota PompaON,VascaOFF");
      inviosms = false;  }
      digitalWrite(pompa, HIGH);
      Serial.print ("Pompa pozzo accesa  -  ");
      digitalWrite(vasca, LOW);
      Serial.println ("Pompa vasca spenta ");
       }
  else if (MAX == LOW && MIN == LOW)  {//VASCA PIENA      
    if (inviosms == true ) {
      sms.SendSMS(Mittente, "STATUS:Vasca piena PompaON,VascaOFF");
      inviosms = false;  }
      digitalWrite(pompa, HIGH);
      Serial.print ("Pompa pozzo accesa  -  ");
      digitalWrite(vasca, HIGH);
      Serial.println ("Pompa vasca accesa");
      }
      else if (MAX == HIGH && MIN == LOW ){
        digitalWrite(pompa, HIGH);
        digitalWrite(vasca,HIGH );
        Serial.println("fase 2 vasca piena ");// stampo solo per verificare dopo elimino la striga
      }
      else if (SUPERPIENO == LOW )
{
Serial.print ("anomalia  -  ");
 if (inviosmsSuperpieno == true) {
sms.SendSMS (mittenteregistrato,"STATUS:  ANOMALIA  ");
inviosmsSuperpieno = false; }
}
  }
 else {
    digitalWrite(pompa, LOW);
    Serial.print("Pompa pozzo spenta  -  ");
    digitalWrite(vasca, LOW);
    Serial.println("Pompa vasca SPENTA ");
   inviosms=true;
   inviosmsSuperpieno = false;
 }

 }





oppure e meglio che lo stato del galleggiante superpieno lo verifica prima quando entra nella condizione " if (MAX == LOW && MIN == LOW)  {//VASCA PIENA
      if (SUPERPIENO == LOW ) "




Code: [Select]





  OnOff = digitalRead (pinOnOff);
  if (OnOff != lastOnOff) {
    if (OnOff == LOW) {
      statoOnOff = !statoOnOff ;
    }
    delay(75);
  }
  lastOnOff = OnOff;
  digitalWrite(pinstatoimpianto, statoOnOff);

  // se lo stato dal pulsante è vero oppure  se lo stato da SMS è vero
  if (statoOnOff ) {
    MIN = digitalRead (gallmin);
    MAX = digitalRead (gallmax);
    SUPERPIENO = digitalRead (superpieno);
    if (MAX == HIGH && MIN == HIGH)  { //VASCA VUOTA
      if (inviosms == true ) {
        sms.SendSMS(Mittente, "STATUS:Vasca vuota PompaON,VascaOFF");
        inviosms = false;
      }
      digitalWrite(pompa, HIGH);
      Serial.print ("Pompa pozzo accesa  -  ");
      digitalWrite(vasca, LOW);
      Serial.println ("Pompa vasca spenta ");
    }
    [color=red]else if (MAX == LOW && MIN == LOW)  {//VASCA PIENA
      if (SUPERPIENO == LOW )[/color]
      {
        Serial.print ("anomalia  -  ");
        if (inviosmsSuperpieno == true) {
          sms.SendSMS (mittenteregistrato, "STATUS:  ANOMALIA  ");
          inviosmsSuperpieno = false;
        }
      }
    }
    else
    {
      if (inviosms == true ) {
        sms.SendSMS(Mittente, "STATUS:Vasca piena PompaON,VascaOFF");
        inviosms = false;
      }
      digitalWrite(pompa, HIGH);
      Serial.print ("Pompa pozzo accesa  -  ");
      digitalWrite(vasca, HIGH);
      Serial.println ("Pompa vasca accesa");
    }
    else if (MAX == HIGH && MIN == LOW ) {
      digitalWrite(pompa, HIGH);
      digitalWrite(vasca, HIGH );
      Serial.println("fase 2 vasca piena ");// stampo solo per verificare dopo elimino la striga
    }
  }
  else {
    digitalWrite(pompa, LOW);
    Serial.print("Pompa pozzo spenta  -  ");
    digitalWrite(vasca, LOW);
    Serial.println("Pompa vasca SPENTA ");
    inviosms = true;
    inviosmsSuperpieno = false;


brunello22

Ho perso il filo.....

per la memoria, usa il suffisso (F

Code: [Select]
Serial.print (F("Pompa pozzo accesa  -  "));

salvatore_paterna

#34
May 28, 2018, 11:00 pm Last Edit: May 30, 2018, 10:25 pm by salvatore_paterna
ciao brunello ieri sera ho scritto questo post ma non mi ha salvato il post sul forum!  :)
cmq
allora cerco di essere breve il progetto si sviluppa in tre fasi:

fase 1 pulsante OnOff
fase 2 con pulsante OnOff HIGH leggi lo stato dei galleggianti e intraprendi un azione
MAX ;
MIN;
SUPERPIENO ;

Adesso funziona tutto yesss l'unico problema che gli sms me l'invia solo quando inizio il ciclo dopo se cambia stato non mi invia i messaggi come richiesto , sbagliero a resettare la variabile !!!

Code: [Select]



#include "SIM900.h"
#include <SoftwareSerial.h>
SoftwareSerial  Sim900Serial(2, 3);// rx, tx
#include "sms.h"
#include <Wire.h>
SMSGSM sms;
int numdata;
boolean started = false;
char smsbuffer[160];
char Mittente[20];
char mittenteregistrato [13] = "+393891" ; // numero del mittente registrato (conosciuto)
char nomemittente [16] = "Impianto ULIVETO";
char sedicicrt [16]; // zona di memorizzazione dei primi sedici caratteri del messaggio ricevuto
int i = 0; // indice utilizzato nei cicli di for
int semaforo = 0; // semaforo riconoscimento numero telefono: o = numero riconosciuto;
// 1 = numero sconosciuto
const byte pompa = 4 ;// Il Pin 4 è quello connesso al relè1 della pompa del pozzo
const byte vasca = 5 ;// Il Pin 5 è quello connesso al relè 2 della pompa della vasca di rilancio
const byte gallmax = 6; // Il Pin 6 è quello connesso al galleggiante che segna la vasca piena
const byte gallmin = 12 ;// Il Pin 12 è quello connesso al galleggiante che segna la vasca vuota
const byte superpieno = 8 ;// Il Pin 8 è quello connesso al galleggiante che segna la vasca troppo piena ANOMALIA
const byte pinOnOff = 10; // Il Pin 10 è quello connesso al tasto ON
const byte pinstatoimpianto = 11;// il pin 11 si accende quando l'impianto e on o off
const byte pinOnOffsim = 9;// Il Pin 9 è quello connesso al TASTO CHE GESTISCE SOLO LA POMPA
//GALLEGGIANTI
byte MAX = 0 ; //VARIABILE CHE MEMORIZZA LO STATO DEL GALLEGGIANTE A LIVELLO MASSIMO CAPACITA'
byte MIN = 0; //VARIABILE CHE MEMORIZZA LO STATO DEL GALLEGGIANTE A LIVELLO MINIMA CAPACITA'
byte SUPERPIENO = 0;//VARIABILE CHE MEMORIZZA LO STATO DEL GALLEGGIANTE A LIVELLO SUPERPIENO
//-----------------------------------------------------------------------------------------------
//stato pulsante on off
byte OnOff = 0 ; //VARIABILE CHE MEMORIZZA LO STATO DEL PULSANTE SUL PIN 10
byte statoOnOff = 0 ;//Se sistema acceso o spento (HIGH = Acceso)
byte lastOnOff = 0 ;
//-----------------------------------------------------------------------------------------------
bool inviosms = false ;
bool inviosmsSuperpieno = false ;
void setup()
{
  pinMode(pinOnOff, INPUT_PULLUP);   // imposta il pin 10 come pin di INPUT.
  pinMode(pompa, OUTPUT);   // imposta il pin 4 come pin di OUTPUT.
  digitalWrite(pompa, HIGH); // spegne inizialmente il relè, uso High perchè questi relè altrimenti appena accessa la scheda da subito un input e si chiude il contatto
  pinMode(vasca, OUTPUT);   // imposta il pin 5 come pin di OUTPUT.
  digitalWrite(vasca, HIGH); // spegne inizialmente il relè, uso High perchè questi relè altrimenti appena accessa la scheda da subito un input e si chiude il contatto
  pinMode(gallmax, INPUT_PULLUP);   // imposta il pin 6 come pin di OUTPUT.
  pinMode(gallmin, INPUT_PULLUP);   // imposta il pin 12 come pin di OUTPUT.
  pinMode(superpieno, INPUT_PULLUP);// imposta il pin 8 come pin di OUTPUT.
  pinMode(pinstatoimpianto, OUTPUT);   // indicatore impianto spento o acceso
  pinMode(pinOnOffsim, OUTPUT);
  digitalWrite(pinstatoimpianto, statoOnOff);// indicatore acceso alto

  //Serial connection.
  Serial.begin(9600);
  // GSM setup
  digitalWrite(pinOnOffsim, HIGH);
  delay(1500);  // > 1 secondo
  digitalWrite(pinOnOffsim, LOW);
  delay(2500); // > 2.2 secondi
  Serial.println("SIM900 setup...");
  if (gsm.begin(2400)) {
    Serial.println("SIM900 Pronta");
    started = true;
  }
  else
    Serial.println(" SIM900 ko");
}

void loop()
{

  char inSerial[50];
  char position;
  if (started)
  {
    position = sms.IsSMSPresent(SMS_ALL);// legge i messaggi in coda
    if (position) {
      sms.GetSMS(position, Mittente, smsbuffer, 160);// Leggo il messaggio ed il mittente
      Serial.print("sms in arrivo da");
      Serial.println("Tel.:" + String( Mittente));
      Serial.println("Content: " + String(smsbuffer));
      semaforo = 0;
      for (i = 0; i <= 12; i++)
      {
        if (!(Mittente[i] == mittenteregistrato [i]))
          semaforo = 1;
      }
      if (semaforo == 0)
        Serial.print (nomemittente);
      else
        Serial.print (Mittente);
      // attende tre secondi per consentire la lettura su lcd del mittente
      Serial.print ("testo sms:");
      for (i = 0; i <= 15; i++)
        sedicicrt [i] = smsbuffer [i]; // memorizzo i primi 16 caratteri del messaggio ricevuto
      Serial.print (sedicicrt); // espongo su lcd il messaggio ricevuto
      if (strcmp(smsbuffer, "On") == 0)
      {
        statoOnOff = true ;
      }
      else if (strcmp(smsbuffer, "Off") == 0)
      {
        statoOnOff = false ;
      }
      else if (strcmp(smsbuffer, "Stato") == 0)
      {
        if (digitalRead(statoOnOff) )
        {
          sms.SendSMS(Mittente, "STATUS: impianto SPENTO"); // restituisce true se invia l'SMS
        }
        else
        {
          sms.SendSMS(Mittente, "STATUS: impianto ACCESO"); // restituisce true se invia l'SMS
        }
      }
      else
      {
        Serial.println ("sms non valido");
      }
      // attende tre secondi per consentire la lettura del messaggio
      sms.DeleteSMS(position); // Elimina l'SMS appena analizzato
    }

  }



  OnOff = digitalRead (pinOnOff);
  if (OnOff != lastOnOff) {
    if (OnOff == LOW) {
      statoOnOff = !statoOnOff ;
    }
    delay(75);
  }
  lastOnOff = OnOff;
  digitalWrite(pinstatoimpianto, statoOnOff);

  // se lo stato dal pulsante è vero oppure  se lo stato da SMS è vero
  if (statoOnOff ) {
    MIN = digitalRead (gallmin);
    MAX = digitalRead (gallmax);
    SUPERPIENO = digitalRead (superpieno);
    if (MAX == HIGH && MIN == HIGH)  { //VASCA VUOTA
      if (inviosms == true ) {
        sms.SendSMS(Mittente, "STATUS:Vasca vuota PompaON,VascaOFF");
        inviosms = false;
      }
      digitalWrite(pompa, HIGH);
      Serial.print ("Pompa pozzo accesa  -  ");
      digitalWrite(vasca, LOW);
      Serial.println ("Pompa vasca spenta ");
    }
  
    else if (MAX == LOW  && MIN == LOW)
    {
     if (SUPERPIENO == LOW )
      {
        Serial.println ("anomalia  -  ");
        if (inviosmsSuperpieno == true) {
          sms.SendSMS (Mittente, "STATUS:  ANOMALIA  ");
          inviosmsSuperpieno = false;
        }
    digitalWrite(pompa, LOW);
    Serial.print("Pompa pozzo spenta ANOMALIA -  ");
    digitalWrite(vasca, LOW);
    Serial.println("Pompa vasca SPENTA ANOMALIA ");
      }
     else{
        if (inviosms == true ) {
        sms.SendSMS(Mittente, "STATUS:Vasca piena PompaON,VascaOFF");
        inviosms = false;
      }
      digitalWrite(pompa, HIGH);
      Serial.print ("Pompa pozzo accesa  -  ");
      digitalWrite(vasca, HIGH);
      Serial.println ("Pompa vasca accesa");
    }
     }
       }
      
    else {
     if (inviosms == true ) {
        sms.SendSMS(Mittente, "STATUS:IMPIANTO SPENTO");
        inviosms = false;
      }    
    digitalWrite(pompa, LOW);
    Serial.print("Pompa pozzo spenta  -  ");
    digitalWrite(vasca, LOW);
    Serial.println("Pompa vasca ");
    inviosmsSuperpieno = false;
  }

}



salvatore_paterna

Ciao Brunello stavo impazzendo per capire come scrivere sullo sketch per non fare nulla quando cambia lo stato di un galleggiante , L'ho scoperto basta non creare la condizione legge il sensore ma non stampa e non fa nulla fino a quando non si verifica un'altra condizione naturalmente vera ! allora in quel caso agisce per come indicato nell'if .
grazie ancora

Go Up