Termostato e sensore di livello con Arduino

Una sezione dedicata ai vostri progetti.
Se avete inventato o costruito qualcosa e lo volete condividere con la community ecco il posto che far per voi

Re: Termostato e sensore di livello con Arduino

Messaggioda idris » 20 feb 2013, 9:36

Ciao, mi chiamo IDRIS . Sto cercando di realizzare il TUO termostato ma ho dei problemi con la compilazione. Mi da errore :C:\Documents and Settings\admin\Documenti\Downloads\arduino-1.0.1-windows\arduino-1.0.1\libraries\OneWire\OneWire.cpp:165: error: 'delayMicroseconds' was not declared in this scope
C:\Documents and Settings\admin\Documenti\Downloads\arduino-1.0.1-windows\arduino-1.0.1\libraries\OneWire\OneWire.cpp: In member function 'uint8_t OneWire::read_bit()':
C:\Documents and Settings\admin\Documenti\Downloads\arduino-1.0.1-windows\arduino-1.0.1\libraries\OneWire\OneWire.cpp:185: error: 'delayMicroseconds' was not declared in this scope



cosa dovrei fare ? GRAZIE ANCORA...
idris
Avatar casuale
Nuovo Utente
 
Messaggi: 4
Iscritto il: 20 feb 2013, 8:02
    Windows XP Chrome

Re: Termostato e sensore di livello con Arduino

Messaggioda Step » 20 feb 2013, 11:25

Ciao Idris, ci siamo già scritti sul blog di Mauro, il tuo problema probabilmente è dovuto alla versione della IDE che hai tu.
Mi spiego meglio, la libreria OneWire richiama la funzione delayMicroseconds da un'altra libreria che nelle ultime versioni della IDE di Arduino è cambiata, sono state raggruppate alcune librerie core nella libreria Arduino.h. Secondo me ti basta aggiornare il software alla versione 1.0.3 che è la stessa che ho usato io, anzi se vuoi stasera a casa posso fare l'upload della mia cartella arduino così avresti la mia stessa identica situazione.
Step
Avatar utente
Amministratore
 
Messaggi: 2242
Iscritto il: 9 nov 2010, 19:36
Località: Una galassia lontana anni luce, dietro l'angolo!
    Windows XP Firefox
Immagine
Tutto questo non vale per il wasabese.....
....è proprio un'altra lingua!

Re: Termostato e sensore di livello con Arduino

Messaggioda idris » 21 feb 2013, 6:54

GRAZIE ... NE SAREI FELICE ....
idris
Avatar casuale
Nuovo Utente
 
Messaggi: 4
Iscritto il: 20 feb 2013, 8:02
    Windows XP Chrome

Re: Termostato e sensore di livello con Arduino

Messaggioda Step » 21 feb 2013, 9:44

Mi sa che siamo sfalsati di qualche ora...io potrò fare l'upload più o meno tra 12 ore...
Step
Avatar utente
Amministratore
 
Messaggi: 2242
Iscritto il: 9 nov 2010, 19:36
Località: Una galassia lontana anni luce, dietro l'angolo!
    Windows XP Firefox
Immagine
Tutto questo non vale per il wasabese.....
....è proprio un'altra lingua!

Re: Termostato e sensore di livello con Arduino

Messaggioda idris » 21 feb 2013, 11:04

SCUSA.. MA MI ALZO MOLTO PRESTO PER LAVORO.....
idris
Avatar casuale
Nuovo Utente
 
Messaggi: 4
Iscritto il: 20 feb 2013, 8:02
    Windows XP Chrome

Re: Termostato e sensore di livello con Arduino

Messaggioda Step » 21 feb 2013, 20:26

Non scusarti, almeno tu hai un lavoro, ci sono tanti che putroppo sono a casa!

Comunque tutto il mio pacchetto arduino lo puoi scaricare a questo link:
http://www.sendspace.com/file/2jnm33
All'interno c'è una cartella che contiene un paio di sketch, uno è questo termostatino e l'altro è un progetto in evoluzione, ma ho poco tempo da dedicargli e quindi va avanti piano piano.

Se hai problemi sai come trovarmi.
Step
Avatar utente
Amministratore
 
Messaggi: 2242
Iscritto il: 9 nov 2010, 19:36
Località: Una galassia lontana anni luce, dietro l'angolo!
    Windows 7 Firefox
Immagine
Tutto questo non vale per il wasabese.....
....è proprio un'altra lingua!

Re: Termostato e sensore di livello con Arduino

Messaggioda idris » 22 feb 2013, 7:22

GRAZIE MILLE ....STASERA PROVERO' DI SICURO... SE VUOI MI PUOI TROVARE SU FECEBOOK AL NOME CESA IDRIS. MANDAMI PURE L'AMICIZIA .... CIAO
idris
Avatar casuale
Nuovo Utente
 
Messaggi: 4
Iscritto il: 20 feb 2013, 8:02
    Windows XP Chrome

Re: Termostato e sensore di livello con Arduino

Messaggioda Step » 14 mar 2013, 23:43

Cronotermostato, prima parte...spero!

Codice: Seleziona tutto
/*
Cronotermostato
Lettura sensore termico ds18b20 con collegamento 1-wire, Real Time Clock ds1307 su
bus I2C con collegamento SDA e SCL e infine comando comando relais,
il tutto (spero)gestito da lan (interfaccia web)
Pin analogico A5 = SCL e pin analogico A4 = SDA per RTC
Pin digitali 5, 6, 7, 8 = modulo relais (per ora accendo il pim 9 per il led)
Pin digitali 10, 11, 12, 13 = modulo ethernet
Pin digitale 2 = linea dati sensore DS18B20
Piedinatura DS18B20: pin 1 = GND, pin 2 = DQ, pin 3 = Vdd (Valida tra 3,3V e 5V)
Per ora manca completamente la parte web
*/
//#include <String.h>                     //libreria per la gestione delle stringhe ormai integrata nel core di Arduino
#include <SPI.h>                        //libreria per la comunicazione via bus SPI (utilizzata dallo shield ethernet
#include <Ethernet.h>                   //libreria per protocollo ethernet
#include <SD.h>                         //libreria per accedere al contenuto della scheda SD
#include <OneWire.h>         //libreria per ds18b20
#include <DallasTemperature.h>      //libreria per conversione valore
#include <Wire.h>         //libreria per bus I2C
#include <DS1307new.h>                  //libreria per RTC
//#include <LiquidCrystal.h>            //libreria per lcd

#define ONE_WIRE_BUS 9                   //il terminale data del sensore � connesso alla porta digitale 9 di Arduino

OneWire oneWire(ONE_WIRE_BUS);           //imposto la comunicazione oneWire per il ds18b20
DallasTemperature sensors(&oneWire);   //passo le info di oneWire alla DallasTemperature
const int chipSelect = 4;               //pin per la scegliere di utilizzare la scheda SD

   int rele_out1 = 5;      //stabilisco l'uscita digitale per il rel� 1
   int rele_out2 = 6;      //stabilisco l'uscita digitale per il rel� 2
   int rele_out3 = 7;      //stabilisco l'uscita digitale per il rel� 3
   int rele_out4 = 8;      //stabilisco l'uscita digitale per il rel� 4
   int temperatura;        //temperatura rilevata
     int isteresi;           //tolleranza termica per evitare continui on/off
   //int antigelo;           //temperatura antigelo per impianto
   int eco;                //temperatura utilizzata in orari nottturni o in assenze
   int confort;            //temperatira utilizzata nei periodi abitativi
   int timer;              //serve per verificare se è l'ora di accendere il termostato (booleana in futuro?)
   int termo;              //serve per verificate se la temperatura è nel range corretto (booleana in futuro?)
   int statotermostato;    //variabile per test
        int manuale;            //variabile per accensione manuale con temperatura (booleana in futuro?)
       
   
/*dichiaro gli on/off possibili per il timer (3 al giorno)  */
   int on1ore;      //valore ore prima accensione luned�
   int on1minuti;      //valore minuti prima accensione luned�
   int on2ore;      //valore ore seconda accensione luned�
   int on2minuti;      //valore minuti seconda accensione luned�
   int on3ore;      //valore ore terza accensione luned�
   int on3minuti;      //valore minuti terza accensione luned�
   int off1ore;      //valore ore primo spegnimento luned�
   int off1minuti;      //valore minuti primo spegnimento luned�
   int off2ore;      //valore ore secondo spegnimento luned�
   int off2minuti;     //valore minuti secondo spegnimento luned�
   int off3ore;      //valore ore terzo spegnimento luned�
   int off3minuti;         //valore minuti terzo spegnimento luned�




   
/* valido per visualizzazione su lcd 16x2   
  byte grado[8] = {      //creo i dati per il carattere grado
  0b00010,
  0b00101,
  0b00010,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
};
*/

    char stringa [8];            //dichiaro la stringa dove trasferisco i caratteri del file letto da SD con le dimensioni
    unsigned int numeri [86];    //dichiaro un array di numeri dove inserisco i numeri convertiti dai caratteri della stringa con le dimensioni
    unsigned int i=0;            //creo un indice per la stringa
    unsigned int j=0;            //creo un indice per l'array numeri
   

void setup(){

  Wire.begin();               //inizializzo la libreria wire
  Serial.begin(9600);                           //inizializzo la seriale
  sensors.begin();            //inizializzo la libreria per leggere il sensore
 
  //lcd.createChar(0, grado);     //associo i dati del grado al carattere custom 0
  //lcd.begin(16, 2);             //dichiaro il tipo di lcd
 
  pinMode(rele_out1, OUTPUT);   //assegno il modo uscita digitale al pin 5
  pinMode(rele_out2, OUTPUT);   //assegno il modo uscita digitale al pin 6
  pinMode(rele_out3, OUTPUT);   //assegno il modo uscita digitale al pin 7
  pinMode(rele_out4, OUTPUT);   //assegno il modo uscita digitale al pin 8
 
 

  isteresi = 1;        //dichiaro una isteresi di accensione e spegnimento di 1 grado 
  manuale = 0;         //porto a zero la modalià manuale (lavoro in automatico) verrà gestita da web
 
  /* ----imposto le variabili termiche in attesa di impostarle da web----- non più, inserite da file su SD */
  //antigelo = 5;        //temperatura minima per la sicurezza antigelo impianto
  //eco = 17;            //temperatura notturna o economica
  //confort = 21;        //temperatura giornaliera o confort
 

 
 
/*parte da utilizzare solo per rimettere l'orologio, questione da sviluppare*/
//RTC.stopClock();
//RTC.fillByYMD(2013,1,3);
//RTC.fillByHMS(22,58,0);
//RTC.setTime();
//RTC.startClock();


  pinMode (10, OUTPUT);    //pin da settare uscita, serve per il chip ethernet w5100, se alto disabilita la rete
           
    if (!SD.begin(chipSelect))      //se non c'è SD o non è inizializzato il pin 4
      {
      return;                       //interrompo la lettura da SD
    }
   
    File dataFile = SD.open ("tmponoff.txt");  //leggo il file con gli on off in formato "on ore,on minuti,off ore,off minuti....", esempio 08,00,07,00, ecc.
    if (dataFile){                             //alla cui fine ho aggiunto anche i valori termici in formato xx,yy, nel mio caso 17,21,
      while (dataFile.available()) {           //se il file è presente e fino a che è disponibile
        stringa[i] = (dataFile.read());        //associo i caratteri del file alla stringa in sequenza con indice i
        if (stringa[i] == ','){                //se il carattere letto è ,
          stringa[i]='\0';                     //allora vado a capo
          numeri[j] = atoi (stringa);          //e converto il carattere della stringa in un intero inserendolo in array numeri con indice j
          ++j;                                 //incremento j
          i=0;                                 //azzero i
          }else{                               //altrimenti
          ++i;                                 //incremento i per la lettura del carattere successivo
          }
        }
      dataFile.close();                       //chiudo il file letto da SD
    }
}

void loop(){

   RTC.getTime(); //abilito l'acquisizione dei dati RTC
   
/*tutto il Serial.print è parte del controllo per i test (si può rimuovere in caso di necessità, si risparmia circa 1 kB)*/

   Serial.println(" ");
   Serial.println(" ");
   Serial.println("GG/MM/AAAA");
   Serial.print(RTC.day, DEC);
   Serial.print("/");
   Serial.print(RTC.month, DEC);
   Serial.print("/");
   Serial.print(RTC.year, DEC);
   Serial.println(" ");
   Serial.println(" ");
   Serial.println("hh:mm:ss");
   Serial.print(RTC.hour, DEC);
   Serial.print(":");
   Serial.print(RTC.minute, DEC);
   Serial.print(":");
   Serial.print(RTC.second, DEC);
   Serial.println(" ");
   Serial.println(" ");
   
   sensors.requestTemperatures();                  // Invia il comando di lettura delle temperatura
        int temperatura = sensors.getTempCByIndex(0);   //lettura ingresso digitale 13 e assegnazione del valore alla variabile temperatura
   temperatura = temperatura - 2 ;         //riduco provvisoriamente per problemi di montaggio la temperatura rilevata
                     //che risente del calore generato dall'elettronica sottostante

        eco = numeri[84];
        confort = numeri[85];
       
        Serial.print ("eco = ");
        Serial.println (eco);
        Serial.print ("confort = ");
        Serial.print (confort);
        Serial.println (" ");

   
   Serial.print ("Temperatura rilevata = ");
        Serial.print (temperatura);
        Serial.print (" C");
   Serial.println (" ");
        Serial.println (" ");
           
        Serial.println("giorno della settimana");
       
   switch (RTC.dow)                           //separo la programmazione per i 7 giorni settimanali
   {
      case 0:                            //domenica
                Serial.println("DOMENICA");                                         
                        on1ore = numeri[0];        //associo le prime 12 cifre dell'array numeri ai vari comandi on off
                        on1minuti = numeri[1];
                        off1ore = numeri[2];
                        off1minuti = numeri[3];
                        on2ore = numeri[4];
                        on2minuti = numeri[5];
                        off2ore = numeri[6];
                        off2minuti = numeri[7];
                        on3ore = numeri[8];
                        on3minuti = numeri[9];
                        off3ore = numeri[10];
                        off3minuti = numeri[11];                                   
      break;

      case 1:                             //lunedì
                Serial.println("LUNEDI'");             
                        on1ore = numeri[12];        //associo le seconde 12 cifre dell'array numeri ai vari comandi on off
                        on1minuti = numeri[13];
                        off1ore = numeri[14];
                        off1minuti = numeri[15];
                        on2ore = numeri[16];
                        on2minuti = numeri[17];
                        off2ore = numeri[18];
                        off2minuti = numeri[19];
                        on3ore = numeri[20];
                        on3minuti = numeri[21];
                        off3ore = numeri[22];
                        off3minuti = numeri[23];                     
      break;

      case 2:                             //martedì
                Serial.println("MARTEDI'");
                        on1ore = numeri[24];        //associo le terze 12 cifre dell'array numeri ai vari comandi on off
                        on1minuti = numeri[25];
                        off1ore = numeri[26];
                        off1minuti = numeri[27];
                        on2ore = numeri[28];
                        on2minuti = numeri[29];
                        off2ore = numeri[30];
                        off2minuti = numeri[31];
                        on3ore = numeri[32];
                        on3minuti = numeri[33];
                        off3ore = numeri[34];
                        off3minuti = numeri[35];                   
      break;

      case 3:                             //mercoledì
                Serial.println("MERCOLEDI'");       
                        on1ore = numeri[36];        //associo le quarte 12 cifre dell'array numeri ai vari comandi on off
                        on1minuti = numeri[37];
                        off1ore = numeri[38];
                        off1minuti = numeri[39];
                        on2ore = numeri[40];
                        on2minuti = numeri[41];
                        off2ore = numeri[42];
                        off2minuti = numeri[43];
                        on3ore = numeri[44];
                        on3minuti = numeri[45];
                        off3ore = numeri[46];
                        off3minuti = numeri[47];
      break;

      case 4:                             //giovedì
                Serial.println("GIOVEDI'");
                        on1ore = numeri[48];        //associo le quinte 12 cifre dell'array numeri ai vari comandi on off
                        on1minuti = numeri[49];
                        off1ore = numeri[50];
                        off1minuti = numeri[51];
                        on2ore = numeri[52];
                        on2minuti = numeri[53];
                        off2ore = numeri[54];
                        off2minuti = numeri[55];
                        on3ore = numeri[56];
                        on3minuti = numeri[57];
                        off3ore = numeri[58];
                        off3minuti = numeri[59];
      break;

      case 5:                             //venerdì
                Serial.println("VENERDI'");
                        on1ore = numeri[60];        //associo le seste 12 cifre dell'array numeri ai vari comandi on off
                        on1minuti = numeri[61];
                        off1ore = numeri[62];
                        off1minuti = numeri[63];
                        on2ore = numeri[64];
                        on2minuti = numeri[65];
                        off2ore = numeri[66];
                        off2minuti = numeri[67];
                        on3ore = numeri[68];
                        on3minuti = numeri[69];
                        off3ore = numeri[70];
                        off3minuti = numeri[71];
      break;

      case 6:                             //sabato
                Serial.println("SABATO");     
                        on1ore = numeri[72];        //associo le settime 12 cifre dell'array numeri ai vari comandi on off
                        on1minuti = numeri[73];
                        off1ore = numeri[74];
                        off1minuti = numeri[75];
                        on2ore = numeri[76];
                        on2minuti = numeri[77];
                        off2ore = numeri[78];
                        off2minuti = numeri[79];
                        on3ore = numeri[80];
                        on3minuti = numeri[81];
                        off3ore = numeri[82];
                        off3minuti = numeri[83];
                     
      break;
      
   }
   
   /*con la variabile timer e la termo gestisco il temostato*/

        /*con la formula ore*60+minuti ottengo i valori assoluti da confrontare per evitare problemi di accavallamenti degli orari di on off*/
       
   if (((on1ore * 60 + on1minuti)  <= (RTC.hour * 60 + RTC.minute)  && (RTC.hour * 60 + RTC.minute) <= (off1ore * 60 + off1minuti - 1 ))
        || ((on2ore * 60 + on2minuti)  <= (RTC.hour * 60 + RTC.minute)  && (RTC.hour * 60 + RTC.minute) <= (off2ore * 60 + off2minuti - 1 ))
        || ((on3ore * 60 + on3minuti)  <= (RTC.hour * 60 + RTC.minute)  && (RTC.hour * 60 + RTC.minute) <= (off3ore * 60 + off3minuti - 1 )))
         {
      timer = 1;
    }else{
      timer = 0;
    }

        /*confronto la temperatura rilevata con la temperatura impostata +/- il valore isteresi*/
       
   if (temperatura <= (confort - isteresi))   
    {
      termo = 1;
    }

         if (temperatura >= (confort+isteresi))
         {
      termo = 0;
    }

        /*se termo e timer o termo e manuale sono alti comando la caldaia, lo stesso se la temperatura è  più bassa della temperatura eco*/
       
   if ((termo == 1 && timer == 1) || (termo == 1 && manuale == 1) || (temperatura <= eco))
     {
            statotermostato = 1;
       digitalWrite(rele_out1, HIGH);
            digitalWrite(rele_out2, HIGH);
            digitalWrite(rele_out3, HIGH);
            digitalWrite(rele_out4, HIGH);
     }else{
            statotermostato = 0;
       digitalWrite(rele_out1, LOW);
            digitalWrite(rele_out2, LOW);
            digitalWrite(rele_out3, LOW);
            digitalWrite(rele_out4, LOW);
     }

      Serial.println (" ");
      Serial.println (" "); 
      Serial.print ("timer = ");
      Serial.println (timer);
      Serial.print ("termo = ");
      Serial.println (termo);
      Serial.print ("Stato termostato = ");
      Serial.print (statotermostato);
      Serial.println (" ");
      Serial.println (" ");
      delay (1000);
}

Step
Avatar utente
Amministratore
 
Messaggi: 2242
Iscritto il: 9 nov 2010, 19:36
Località: Una galassia lontana anni luce, dietro l'angolo!
    Windows 7 Firefox
Immagine
Tutto questo non vale per il wasabese.....
....è proprio un'altra lingua!

Re: Termostato e sensore di livello con Arduino

Messaggioda Ligeia » 15 mar 2013, 14:43

Ciao Step,
ho dato un'occhiata al tuo codice e mi sembra buono, nel senso che, webserver a parte, hai gi' tutto il framework
pronto per finire il progetto.
Poiche' mi hai detto che, per il piacere della scoperta, non vuoi che ti faccia troppo spoiler di cosa farei io, mi limito
a darti questo input su questi tutorial, che magari avrai gia' visto:

http://www.linuxmx.it/elettronica/ardui ... erver.html

Come supponevo c'e' una libreria dedicata per i webserver, e cioe':

#include <WebServer.h> //libreria webduino

Molto illuminante e utile ( almeno per me ) e questo tutorial di quelli sopra:

http://www.linuxmx.it/repository/arduin ... re_led.ino

Qui si vede bene come accendere dei led dalla pagina web esposta dalla arduino.

In questo caso, praticamente c'e' un binding automatico delle variabili del corpo dell'html con delle variabili locali,
associate ai vari led. La tua e' una situazione molto simile, dove al posto delle variabili locali puoi usare la tua cache
che ho gia' visto essere presente nel codice ( quella di cui si accennava ieri sera ).

Al limite ti possono servire dei boolean per sincronizzare il webserver con la cache e con la SD, ma non vedo grossi problemi.

Non sto a dilungarmi perche' l'esempio che ti ho girato mi sembra molto chiaro e sono sicuro che non avrai problemi
a inspirarti a questo nel tuo codice.

In ogni caso, non esitare a chiedermi pure qualsiasi dubbio sul C in genere o su questo esempio in particolare.

Ciao, buon hacking, a presto

Ricky
Ligeia
Avatar utente
Utente
 
Messaggi: 73
Iscritto il: 5 mar 2013, 16:30
    Windows 7 Firefox

Re: Termostato e sensore di livello con Arduino

Messaggioda Step » 15 mar 2013, 18:23

Grazie Ricky per i link, avevo già trovato in rete degli esempi simili, per ora come ti ho già detto preferisco documentarmi un po', solo per fare quello che hai visto ci sono diventato pazzo, quindi me la prendo comoda, intanto studio e ogni tanto provo, poi quando sarà il momento vai tranquillo che ti romperò le scatole!
La mia idea era quella di mettere un tasto "invia" che mi facesse partire tutto il discorso memorizzazione, cioè io vorrei fare una pagina con una specie di calendario settimanale con gli orari e una con le temperature, vorrei scrivere questi dati in cache e solo alla fine delle modifiche con il tasto invia (o "memorizza" che è più semlice) vorrei far scrivere il file sulla sd con i dati della cache.
Questo sotto è un primo esempio di pagina che avevo fatto scopiazzando quello che avevo trovato in rete, si tratta di uno screenshot del mio smartphone collegato ad arduino tramite lan, scrivevo i dati numerici nella pagina web e al momento che davo invia associavo i valori alle variabili int.
Immagine


Poi se ci riesco lo brevetto :lol: :lol: :lol:
Step
Avatar utente
Amministratore
 
Messaggi: 2242
Iscritto il: 9 nov 2010, 19:36
Località: Una galassia lontana anni luce, dietro l'angolo!
    Windows 7 Firefox
Immagine
Tutto questo non vale per il wasabese.....
....è proprio un'altra lingua!

PrecedenteProssimo

Torna a Progetti

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite