Serra casalinga automatizzata

E se l'argomento interessa... non è che tutti hanno la necessità di automatizzare una serra. ;) Cmq resta il fatto che il forum è pieno di informazioni, e basta cercare uno specifico argomento per poi adattarlo al proprio scopo. Ad esempio, mi serve gestire un display con un orologio? Beh, non hai che l'imbarazzo della scelta. Insomma, ogni cosa è stata sicuramente trattata singolarmente, intanto puoi cominciare a guardarti intorno.

Ragazzi sono riuscita a fare dei grandi passi....mi è arrivata la mega e la wi fi shield e sono riuscita a metterla in linea...e provando tutti gli esempi vedo che è in linea....in un esempio in particolare quello della simple web server e andando a mettere l'indirizzo del mio scudo wifi mi dice che il browser non puo aprire la pagina....cavolo come mai???

il codice che inserisco è il seguente,

/*
  WiFi Web Server LED Blink
 
 A simple web server that lets you blink an LED via the web.
 This sketch will print the IP address of your WiFi Shield (once connected)
 to the Serial monitor. From there, you can open that address in a web browser
 to turn on and off the LED on pin 9.
 
 If the IP address of your shield is yourAddress:
 http://yourAddress/H turns the LED on
 http://yourAddress/L turns it off
 
 This example is written for a network using WPA encryption. For 
 WEP or WPA, change the Wifi.begin() call accordingly.
 
 Circuit:
 * WiFi shield attached
 * LED attached to pin 9
 
 created 25 Nov 2012
 by Tom Igoe
 */
#include <SPI.h>
#include <WiFi.h>

char ssid[] = "yourNetwork";      //  your network SSID (name) 
char pass[] = "secretPassword";   // your network password
int keyIndex = 0;                 // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;
WiFiServer server(80);

void setup() {
  Serial.begin(9600);      // initialize serial communication
  pinMode(9, OUTPUT);      // set the LED pin mode

  // check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present"); 
    while(true);        // don't continue
  } 

  // attempt to connect to Wifi network:
  while ( status != WL_CONNECTED) { 
    Serial.print("Attempting to connect to Network named: ");
    Serial.println(ssid);                   // print the network name (SSID);

    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:    
    status = WiFi.begin(ssid, pass);
    // wait 10 seconds for connection:
    delay(10000);
  } 
  server.begin();                           // start the web server on port 80
  printWifiStatus();                        // you're connected now, so print out the status
}


void loop() {
  WiFiClient client = server.available();   // listen for incoming clients

  if (client) {                             // if you get a client,
    Serial.println("new client");           // print a message out the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        if (c == '\n') {                    // if the byte is a newline character

          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {  
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:    
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();

            // the content of the HTTP response follows the header:
            client.print("Click <a href=\"/H\">here</a> turn the LED on pin 9 on
");
            client.print("Click <a href=\"/L\">here</a> turn the LED on pin 9 off
");

            // The HTTP response ends with another blank line:
            client.println();
            // break out of the while loop:
            break;         
          } 
          else {      // if you got a newline, then clear currentLine:
            currentLine = "";
          }
        }     
        else if (c != '\r') {    // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }

        // Check to see if the client request was "GET /H" or "GET /L":
        if (currentLine.endsWith("GET /H")) {
          digitalWrite(9, HIGH);               // GET /H turns the LED on
        }
        if (currentLine.endsWith("GET /L")) {
          digitalWrite(9, LOW);                // GET /L turns the LED off
        }
      }
    }
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}

void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
  // print where to go in a browser:
  Serial.print("To see this page in action, open a browser to http://");
  Serial.println(ip);
}/code]

Come colleghi l'Arduino Mega + Wifi con il resto della rete? Passi tramite un router wifi? Se si, controlla le impostazioni interne del router se consentono lo scambio di dati tra cliente Wifi e tra wifi e Lan; non è scontato.

sicuramente non lo è se usi l'ip pubblico, che ip usi? dovrebbe essere nel range 192.168.x.x per essere corretto*

*vale per il 70/80% dei casi, you mileage may vary

Ragazzi dopo la notte insonne sono riuscitaaaaaaaa!!!in pratica bastava scaricare una vecchia idee di arduino e tutto funziona alla perfezione…quanto meno il collegamento alla rete wifi…ora devo vedere come collegare il tutto con il resto che voglio fare…avrò sicuramente bisogno di un grande aiuto da parte vostra…voi sapete troppo e io avendo iniziato da un mese mi sento un po’ indietro…anni luce diciamo…a presto ragazzi!!!

ciao a tutti tramite la wifi sono riuscita a comandare il led sul pin nove…ora ho altri led da comandare…volevo sapere che sbaglio nel codice…so che sbaglio qualche cosa con gli if e andrebbero forse else…vi prego di aiutarmi

    client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();

            // the content of the HTTP response follows the header:
            client.print("Click <a href=\"/H\">here</a> turn the LED on pin 9 on
");
            client.print("Click <a href=\"/L\">here</a> turn the LED on pin 9 off
");
            client.print("Click <a href=\"/H\">here</a> turn the LED on pin 2 on
");
            client.print("Click <a href=\"/L\">here</a> turn the LED on pin 2 off
");
            client.print("Click <a href=\"/H\">here</a> turn the LED on pin 3 on
");
            client.print("Click <a href=\"/L\">here</a> turn the LED on pin 3 off
");
            client.print("Click <a href=\"/H\">here</a> turn the LED on pin 8 on
");
            client.print("Click <a href=\"/L\">here</a> turn the LED on pin 8 off
");
            
            // The HTTP response ends with another blank line:
            client.println();
            // break out of the while loop:
            break;         
          } 
          else {      // if you got a newline, then clear currentLine:
            currentLine = "";
          }
        }     
        else if (c != '\r') {    // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }

        // Check to see if the client request was "GET /H" or "GET /L":
        if (currentLine.endsWith("GET /H")) {
          digitalWrite(9, HIGH);               // GET /H turns the LED on
        }
        if (currentLine.endsWith("GET /L")) {
          digitalWrite(9, LOW);                // GET /L turns the LED off
          
        if (currentLine.endsWith("GET /H")) {
          digitalWrite(2, HIGH);               // GET /H turns the LED on
        }
        if (currentLine.endsWith("GET /L")) {
          digitalWrite(2, LOW);                // GET /L turns the LED off
        } 
          
        if (currentLine.endsWith("GET /H")) {
          digitalWrite(3, HIGH);               // GET /H turns the LED on
        }
        if (currentLine.endsWith("GET /L")) {
          digitalWrite(3, LOW);                // GET /L turns the LED off
        }
        if (currentLine.endsWith("GET /H")) {
          digitalWrite(8, HIGH);               // GET /H turns the LED on
        }
        if (currentLine.endsWith("GET /L")) {
          digitalWrite(8, LOW);                // GET /L turns the LED off
        }
          
          
        }
      }
    }
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }

In pratica con questo codice comando via wi fi solo il led 9…

Ricontrolla le graffe aperte e chiuse in quella serie di if, mi sembrano ne manchino. E dove mancavano mi sà che per non far dare errore al compilatore le hai chiuse tutte al fondo. Un consiglio, secondo me è meglio se le scrivi così (la graffa aperta giù e allineata alla chiusa):

if (currentLine.endsWith("GET /H")) 
{ digitalWrite(2, HIGH);               // GET /H turns the LED on
}

Forse è perchè stai controllando sempre le stesse due lettere?

Ho riprovato a caricare il codice, risulta sempre errato. premetto che non ne so praticamente niente di arduino, ho iniziato ora a studiare, visto che il codice fa al caso mio ho provato a caricarlo, però non è giusto. Qualcuno ha provato a caricarlo su arduino, poi date compila e cominciano i vari errori di compilazione! che qualcuno carichio il codice e faccia la prova!!!! Qualcuno sa correggerlo? IO uso un 2560 mega, ho caricato la libreria, ma niente !!!

@didac1: ti avevo già invitato alla lettura del regolamento via PM. Ma vedo che non hai seguito il mio suggerimento.

Su questo forum ci si comporta così: 1) si legge il regolamento 2) si usa il 1° post per presentarsi 3) una volta fatto questo si può pubblicare un messaggio che sia postato in modo conforme al regolamento, quindi dando tutte le informazioni necessarie a capire il problema. Hai pubblicato i messaggi di errore che ricevi? No.

Allora il codice risulta perfetto e errori zero....certo che non è che bisogna fare copia ed incolla dei codici altrui....magari bisognerebbe metterci un po anche del proprio....che ne di? A me il codice funziona alla perfezione e errori ne da esattamente zero..... Guarda ho iniziato anche io da zero e se sono arrivata a questo punto non è grazie a copia e incolla....ci ho messo la testa giorno e notte e alla fine ci sono arrivata....non so gli altri ma io non voglio aiutare chi dice che fa copia incolla senza neanche dare un occhio al codice....a per informarti io ho iniziato da circa due mesi con arduino...non è che sono brava ma metto anima e corpo in quel che cerco di fare...e ti dico che di copia ed incolla ne ho fatti ben pochi.....comunque che erori ti darebbe il mio codice??che schermo usi?? usi i2c per schermo che wi fi hai? se non dai nemmeno queste indicazioni pensi che qualcuno ti possa aiutare??

Bravo leo non sgridare sempre solo me....anche un po gli altri....

salve,

spiegazioni, ce il bisogno di farlo!!!

Ho in atto una coltivazione di ariocarpus,cactacea di origine messicana. ho cercato in rete qualche progetto da mettere in funzione subito per il controllo di temperatura, umidità, ma niente che facesse al caso mio. Per caso girando in questo sito mi sono imbattuto nel tuo progetto, l'ho ritenuto valido.

Essendo che proprio quel che mi serve come partenza,ho provato a caricare il codice, mettere la libreria DHT.h, ma iniziano i casini. Tutto qui, come gli do verifica succede mi da questi errori :

Arduino:1.5.5-r2 (Windows 7), Scheda:"Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"

sketch_feb22a:4: error: 'LiquidCrystal_I2C' does not name a type
sketch_feb22a:5: error: no matching function for call to 'DHT::DHT()'
C:\Users\Administrator\Documents\Arduino\libraries\DHTsensorlibrarymaster/DHT.h:32: note: candidates are: DHT::DHT(uint8_t, uint8_t, uint8_t)
C:\Users\Administrator\Documents\Arduino\libraries\DHTsensorlibrarymaster/DHT.h:23: note:                 DHT::DHT(const DHT&)
sketch_feb22a.ino: In function 'void setup()':
sketch_feb22a:13: error: 'lcd' was not declared in this scope
sketch_feb22a:28: error: 'class DHT' has no member named 'setup'
sketch_feb22a.ino: In function 'void loop()':
sketch_feb22a:34: error: 'class DHT' has no member named 'getMinimumSamplingPeriod'
sketch_feb22a:36: error: 'class DHT' has no member named 'getHumidity'
sketch_feb22a:37: error: 'class DHT' has no member named 'getTemperature'
sketch_feb22a:38: error: 'lcd' was not declared in this scope

Debbo correggere la ragazza su una cosa,prima di scrivere che fosse sbagliato, ho provato a scriverlo, riscriverlo da capo e di mio pugno più volte, solo quando non sapevo più cosa fare mi sono iscritto! Comunque il progetto che ho in mente va ben oltre quello che è qui in discussione, con questa partenza di progetto, si arriva ad ottenere il controllo serio della temperatura ecc. Tra qualche mese sarà ora di ampliare il discorso,in termini di luce, irrigarione, controllo ec, nutrimenti e fase alba-tramonto! Questo sarà il risultato da ottenere! salve e grazie a chi saprà dare aiuto. diego

Il problema al 99% sta nel fatto che stai usando IDE 1.5.x invece di 1.0.5, e quindi hai incompatibilità con le librerie.

didac1: salve, spiegazioni, ce il bisogno di farlo!!! Arduino:1.5.5-r2 (Windows 7), Scheda:"Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)" salve e grazie a chi saprà dare aiuto. diego

Ma le librerie le hai caricate ? LiquidCrystal e DHT library ?

Nid, gli interventi bisogna leggerli, altrimenti qui moltiplichiamo le parole inutilmente:

Essendo che proprio quel che mi serve come partenza,ho provato a caricare il codice, mettere la libreria DHT.h, ma iniziano i casini.

Poiché Martaale usa (almeno a me pare così) la 1.0.5 e dice di compilare tutto correttamente, non può essrci altra possibilità dell'incompatibilità della lib DHT con l'IDE 1.5.5 usata da didacl

Scusa Michele, ma io intendevo chiedere se l’utente @didac1 è sicuro di averle messe nel posto giusto le librerie?
Perchè io uso la 1.5.5 ma quelle librerie Liquid_I2C e DHT non mi danno errori (ho riprovato un esempio adesso adesso). Uso IDE 1.5.5 originale senza aggiornamenti di toolchain.

no, scusa tu per la mia involontaria perentorietà; le tue prove dimostrano che purtroppo il nostro amico ha serie difficoltà anche con il semplice copia/incolla, quindi non posso fare altro che accodarmi al consiglio di studiare un minimo di programmazione iniziale, un buon testo base aiuterebbe tantissimo, in modo da imparare almeno a capire cosa sta facendo, poi si può procedere con un po' di sperimentazione, altrimenti qui si rischia solo di incasinarsi e soprattutto diimbordellire il Topic di Martaale che, al contrario, dimostra sempre di più di darsi da fare sul serio, vista la rapidità con la quale sta procedendo nel suo progetto.

buongiorno,
ho seguito il consiglio, ho eliminato tutto ed ho rinstallato da capo, sia il programma arduino, sia ide.
ho scaricato libreria dht11, libreria i2c.
Carico il codice famoso( serra casalinga automatizzata) sito nella prima pagina delle discussioni, ma continuavo ad avere gli stessi messaggi di errore.
Visto che non ho il display ho ribaltato un po il codice esistente, eliminando tutto quel che riguarda lcd ed ho inserito quel che serve per il serial monitor, ora funziona!
Andiamo in ordine: questo è il codice originario

#include "DHT.h"
#include <Wire.h>  // 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
DHT dht;

const int sensorPin = A0;  // sensore temperatura
int ledFan = 13; // VENTOLE
int ledRes = 7; // SERPENTINA
void setup() 
{
  Serial.begin(9600);
  lcd.begin(20,4);
  {
  for(int i = 0; i< 3; i++)
  pinMode(ledFan, OUTPUT);
  pinMode(ledRes, OUTPUT);
  lcd.setCursor(0,0); //Start at character 4 on line 0
  lcd.print("SERRA ALE & MARTA");
  lcd.setCursor(0,1); //Start at character 4 on line 0
  lcd.print("Temp. Aria:");
  lcd.setCursor(0,2); //Start at character 4 on line 0
  lcd.print("Umid. Aria:");
  delay(1000);
  


  dht.setup(A0); // data pin 2
}
}

void loop() 
{
 delay(dht.getMinimumSamplingPeriod();

  float humidity = dht.getHumidity();
  float temperature = dht.getTemperature();
 lcd.setCursor(0,2);

 lcd.setCursor(12,2);
  lcd.print("% ");
  delay(1000);
  
  lcd.print(humidity, 1);
  lcd.setCursor(12,1);
  lcd.print("C ");
  lcd.print(temperature, 1);
  lcd.setCursor(12,2);
  
  if (temperature > 25) {  // se temperatura maggiore di 21
    
    digitalWrite(13, HIGH);  // accende la ventola
    digitalWrite(7, LOW);  //spegne la resistenza
    lcd.setCursor(0,3);  
    lcd.print("Ventole Accese");
    
    } else if(temperature < 18) {
    digitalWrite(13, LOW);
    digitalWrite(7, HIGH);
    lcd.setCursor(0,3);
    lcd.print("Serp. Accese");
    
    } else {                // se temperatura compresa tra 21 e 18 tutto spento
    digitalWrite(13, LOW);
    digitalWrite(7, LOW);
    lcd.setCursor(0,3);
    lcd.print("Tutto Spento  ");
    }
   
  
  delay(5000);  // intervallo tra le letture


se gli si da compila esce questo tipo di errore:
error:'LiquidCrystal_I2C' does not name a type
           In function' void setup()':
           'lcd' was not declared in this scope
           In function 'void loop()':
error: expected ')' before ',' token
error:' lcd' was not declared in this scope

Ho pensato di rifare il codice senza lcd, ma usare il seriale, il codice ora ha quest'aspetto, funziona:
[code]
#include "DHT.h"
#include <Wire.h>  // 
#include <LiquidCrystal_I2C.h>

DHT dht;
const int  sensorPin = 2;  // sensore temperatura
int ledFan = 13; // ventole
int ledRes =7;  //serpentina

void setup() 
{
  Serial.begin(9600);
  Serial.println();
  Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)");
  {
  for(int  i =0; i< 3; i++);
  pinMode(ledFan, OUTPUT);
  pinMode(ledRes, OUTPUT);
  delay(1000);
  dht.setup(2); // data pin 2
}
}

void loop() {
 delay(dht.getMinimumSamplingPeriod());

  float humidity = dht.getHumidity();
  float temperature = dht.getTemperature();
  
  Serial.print(dht.getStatusString());
  Serial.print("\t");
  Serial.print(humidity, 1);
  Serial.print("\t\t");
  Serial.print(temperature, 1);
  Serial.print("\t\t");
  Serial.println(dht.toFahrenheit(temperature), 1);
  delay(1000);
  
   
  

  

  
  if (temperature > 25) {  // se temperatura maggiore di21
   digitalWrite(13, HIGH); //accende la fentola
   digitalWrite(7, LOW);  // spegne la serpentina
   
   } else if (temperature < 18) {  // se temperatura minore di 18
   digitalWrite(13, LOW);
   digitalWrite(7, HIGH);
 
   } else {        // se temperatura compresa tra 21 e 18
   digitalWrite(13,LOW);  
   digitalWrite(7, LOW);
   }
   
  delay(2000);  // intervallo tra le letture 
}

praticamente è simile all’originale, ma ancora cera un’ errore cioè mancava nell’originale una parentesi tonda chiusa :
delay(dht.getMinimumSamplingPeriod());

per intendersi l’ultima tonda a destra prima del ;
non voglio che nessuno si arrabbi, ma sarebbe interessante che qualcuno provi a caricare l’originale giusto per prova .
non so se è solo colpa mia, comunque sia con la modifica ora funziona!!!
Toglietevi la natta e provate!!![/code]