Integrare Shield Ethernet a progetto già funzionante

Allora ragazzi...
Ho cercato grazie alle vostre basi ed ai vostri consigli di abbozzare qualcosa.
So già che molto probabilmente ci saranno degli errori, ma perlomeno si compila. :smiley:
Mi farebbe piacere avere qualche feedback per capire se mi sono rimesso sulla retta via...

// Inclusione librerie
#include <SPI.h>
#include <Ethernet.h>
#include <LiquidCrystal.h>

// Definizione costanti e variabili
const int rs = 0, en = 1, d4 = 2, d5 = 3, d6 = 4, d7 = 5;
const int Min = 6, Max = 7; 
const int Echo = 8, Trig = 9;

int stato = 1;

// Definizione caratteri del caricamento durante l'avvio
byte avvio[8] = {
  B11111,
  B00000,
  B11111,
  B11111,
  B11111,
  B11111,
  B00000,
  B11111
};

// Definizione MAC Address, IP Address e Porta
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};

IPAddress ip(192, 168, 178, 49);
EthernetServer server(80);

// Definizione pin schermo LCD
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {

//Inizializzazione Ethernet Shield
Ethernet.init(10);
Ethernet.begin(mac, ip);
server.begin();

// Definizione pin
pinMode(Trig,OUTPUT);
pinMode(Echo,INPUT);
pinMode(Min,OUTPUT); 
pinMode(Max,OUTPUT);

// Finto boot: Nome creatore del sistema + caricamento --> Nome del sistema
lcd.createChar(1, avvio);
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("  CMV  SISTEMI  ");
delay(1000);
  for(int i=-1;i<15;i++) {
    lcd.setCursor(i+1,1);
    lcd.write(1);
    delay(500);
  }
delay(1000);
lcd.clear();
delay(250);
lcd.setCursor(0,0);
lcd.print("  MONITORAGGIO  ");
delay(200);
lcd.setCursor(0,1);
lcd.print(" RISERVA IDRICA ");
delay(4000);
lcd.clear();
}

void loop() {
  
//Attivazione sensore
digitalWrite(Trig, LOW);
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);

//Calcolo distanza
long durata = pulseIn(Echo, HIGH);
long distanza = 0.034 * durata / 2; 
return distanza;

//Calcolo livello
int liv = 100 - (((distanza-18)*100)/110) ;   // (distanza-18) : livello = 110 : 100 
//100 = %, 18 = cm rilevati dal sensore in più quando l'autoclave è pieno per riportare valore in tolleranza       

//Macchina a stati
switch (stato){
  case 0:
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("    ANOMALIA    ");
      digitalWrite(Min,LOW);         
      digitalWrite(Max,LOW);
      if (liv > 100) stato = 0;
      if ((liv < 100) && (liv > 70)) stato = 1;
  break;
  
  case 1: 
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Autoclave: PIENO ");
      digitalWrite(Min,HIGH);         
      digitalWrite(Max,LOW);
      if (liv > 100) stato = 0;
      if ((liv < 100) && (liv > 70)) stato = 1; 
      if ((liv < 70) && (liv > 40)) stato = 2;
  break;
  
    case 2:
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Autoclave: MEDIO ");
      digitalWrite(Min,HIGH);         
      digitalWrite(Max,LOW);
      if ((liv < 100) && (liv > 70)) stato = 1;
      if ((liv < 70) && (liv > 40)) stato = 2;
      if (liv < 30) stato = 3;
  break;
  
    case 3:
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Autoclave: VUOTO ");
      digitalWrite(Min,LOW);         
      digitalWrite(Max,HIGH);
      if ((liv < 70) && (liv > 40)) stato = 2;
      if (liv < 30) stato = 3;
  break;
}
delay(200);  
  

//Server
EthernetClient client = server.available();
if (client) {
  boolean currentLineIsBlank = true;
  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
      if (c == '\n' && currentLineIsBlank) {
        
        //Pagina HTML
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println("Connection: close");  
        client.println("Refresh: 5");
        client.println();
        client.println("<!DOCTYPE HTML>");
        client.println("<html>");
        client.println("<head>");
        client.println("<title> Sistema Di Monitoraggio Riserva Idrica </title>");
        client.println("</head>");
        client.println("<body>");
        client.println("<h2 align='center'><font color='gray'> CMV Sistemi </font></h2>");
        client.println("<h1 align='center'> Sistema Di Monitoraggio Riserva Idrica </h1>");
        client.println("
");
        client.println("<p table align='center'>");
        client.println("<tr><b>Autoclave: </b></tr>");
        client.print("<tr>"); 
        
        // Stato 
        if (stato == 0){
          client.print ("Anomalia");
        } else if (stato == 1){
          client.print ("Pieno");
        } else if (stato == 2){
          client.print ("Medio");
        }   else if (stato == 3){
          client.print ("Vuoto");
          }
        
          
        client.print("</tr>");
        client.println("
");
        client.println("<tr><b>Autoclave: </b></tr>");
        client.print("<tr>"); 
        client.print(liv);
        client.print("%</tr>");
        client.println("</p>");
        client.println("</body>");
        client.println("</html>");
        break;
      }
      if (c == '\n') {
        currentLineIsBlank = true;
      } else if (c != '\r') {
        currentLineIsBlank = false;
      }
    }
  }
  delay(1);
  client.stop();
}
}

Non proprio, l'algoritmo che pilota lo stato dovrebbe essere esterno alla gestione degli stati, poi che da dentro uno stato tu possa anche cambiarlo nessuno lo vieta, ma essendo un dato che leggi dal sensore al primo avvio entri sicuro nella zona PIENO e poi lo ricalcoli, nulla di eclatante ma per pulizia dovresti determinare lo stato prima di valutarlo

Ma questa cosa è ininfluente a livello di funzionamento oppure potrebbe creare problemi?
Inoltre mi sto studiando la variabile SafeString in quanto vorrei depositare al suo interno il liv così da poterlo stampare sul display... ho fatto qualche prova ma c’è ancora qualcosa che non va.
Comunque ragazzi mi scuso se vi sto ponendo quesiti forse basilari ma vi ripeto sono un novizio che però vi garantisco ha tanta voglia di imparare.

Problemi magari no, ma se parti già con una logica non corretta non può che peggiorare man mano che scrivi. Se stai imparando dovresti sfruttare questi progetti per migliorare non solo la conoscenza del linguaggio ma anche, e soprattutto, il giusto modo di "pensare" gli algoritmi in modo da creare programmi robusti e funzionanti.
Convertire il numero in stringa per stamparlo sul display mi pare sia superfluo perché il metodo print dell'lcd ci pensa da se a fare le necessarie conversioni e comunque continuo a spingere per l'uso delle stringhe classiche del C, nel tuo caso usando la funzione itoa hai il tuo risultato, senza nessuna classe aggiuntiva.
E torno a ripetere che cercare di far funzionare le varie componenti del progetto in modo separato e unirle solo quanto le varie parti funzionano o, in alternativa, affrontare le parti successive solo dopo che la parte precedente funziona alla perfezione è la strada giusta, tu hai preferito inglobare sin da subito tutto e adesso hai malfunzionamenti, la loro indagine potrebbe occuparti molto tempo in più rispetto ad un piccolo programma che fa solo quello.
E noto anche che non c'è traccia di messaggi sulla seriale a scopo di debug, unico vero sistema che ti aiuta a capire cosa stia succedendo.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.