incubatrice per uova  aiutoooo

salve , ragazzi vorrei realizare un incubatrice per uova devo creare un termostato che attivi una cella di peltier e una uscita che attivi un umidificatore in base alle impostazione effettuate sia della temperature che del umidita' purtroppo non conosco la programmazione ma ho abbastanza basi per l'elettronica c'e qualcuno di voi che mi puo aiutare ho fatto molte ricerche ma sinceramente non riesco a capire come fare , vorrei visualizare i dati su un display grazie p.s scusatemi non vorrei rubare tempo a nessuno

ciao Emanuele Se avessimo l' imressione che vorresti rubarci del tempo non ti avremmo risposto.

Incomincia di leggere un po di tutorial di Arduino. http://arduino.apogeolab.it/ se non vuoi comprarti un libro oppure ricecrchi un tutorial Arduino in inglese. http://www.ladyada.net/learn/arduino/ http://arduino.cc/en/Tutorial/HomePage

Hai bisogno di 4 cose: 1 sensore di temperature 1 sensore di umiditá 1 driver per l'elemento peltier (qualche resistenza di potenza su un dissipatore mi sembra meno critico, visto che devi solo riscaldare e non raffreddare) 1 driver per l'umidificatore un ventola.

ciao e grazie della risposta per quanto riguarda il libro lo comprato e lo sto legendo e ho notato che parla anche dei sensori.

° volevo usare la cella di peltier perche cosi facendo basta che imposto una temperatura ad esempio 37,5° quando aumentava o diminuiva il calore all’interno si termoregolava sia con il freddo che con il caldo

° ho scopiazato questo codice

 int potPin = 0;

float temperature = 0;

void setup()

{

Serial.begin(9600);

Serial.println("LM35 Thermometer ");

analogReference(INTERNAL);

}

void printTenths(int value) {

// prints a value of 123 as 12.3

Serial.print(value / 10);

Serial.print(".");

Serial.println(value % 10);

}

void loop() {

int span = 20;

int aRead = 0;

for (int i = 0; i < span; i++) {

aRead = aRead+analogRead(potPin);

}

aRead = aRead / 20;

temperature = ((100*1.1*aRead)/1024)*10;

// convert voltage to temperature

Serial.print("Analog in reading: ");

Serial.print(long(aRead));

// print temperature value on serial monitor

Serial.print(" - Calculated Temp: ");

printTenths(long(temperature));

delay(500);

}

e sembra funzionare bene adesso dovrei eliminare la lettura seriale e inviare il tutto sul display ed aggiungere un uscita per il rele’ credo ci sto provando ma senza risultati

° poi ho trovato un altro codice che fa al caso mio solo che anche questo invia dati tramite serial monitor e non so come fare mi potresti dare qualche altro consiglio grazie ancora sei stato gentilissmo
http://www.synaptica.info/2010/02/03/arduino-duemilanove-application-1/langswitch_lang/it/

ciao,
se hai un display lcd seriale prova a dare un occhio a questo link
http://arduino.cc/en/Reference/LiquidCrystal
gli esempi sono mooolto chiari e in 5 minuti puoi vedere la solita “hello world”.
se invece non un oggetto di questo tipo meglio se scrivi quello che intendi utilizzare

il codice che hai trovato utilizza la seriale per ricevere la temperatura minima e memorzzarla sulla eeprom. (puoi anche pensare di tenere quest aparte di codice per poter modificare al volo la sogli su cui vuoi regolare)

if (Serial.available() > 0)
   {
      TemperaturaMinima = Serial.read();
      EEPROM.write(0, 1);
      EEPROM.write(1, TemperaturaMinima);
   }

e per trasmettere al PC i dati della temperatura

   Serial.print((byte)tempC);
   Serial.print((byte)TempC_Decimal);
   Serial.println((byte)TemperaturaMinima);

queste tre righe le devi sostituire con la comunicazione con il tuo display

ho un display display hd44780 4*20 pensi che puo andare

il tempo di studiarlo e faro' una prova

non so dirti sul 4x20 (io ho provato la libreria su un 2x16, come fanno anche negli esempi ed era la prima volta che provavo ad utilizzare un display lcd) eventualmente dai un occhio anche qui http://www.arduino.cc/playground/Code/LCD4BitLibrary terzo punto di Compatibility

ciao emanuele
Per primo non fare fare calcoli a arduino che sono costanti:
"temperature = ((1001.1aRead)/1024)10;"
la stessa cosa con meno tempo di esecuzione é
temperature = aRead
1,074; È solo una operazione di calcolo al posto di 4.

Per alimentare il peltier io userei una ponte H che si usa per i motori tipo http://www.robot-italy.com/product_info.php?cPath=83_30&products_id=464 Puoi riscaldare o rafreddare e regolare la potenza di riscaldamneto/raffredamento.

Programmerei anche una loop di ritardo per evitare che il riscaldamneto oscilli.

Ciao Uwe

grazie a tutti il codice definitivo che sto lavorando e questo

/*
  Analog input, analog output, serial output
 
 Reads an analog input pin, maps the result to a range from 0 to 255
 and uses the result to set the pulsewidth modulation (PWM) of an output pin.
 Also prints the results to the serial monitor.
 
 The circuit:
 * potentiometer connected to analog pin 0.
   Center pin of the potentiometer goes to the analog pin.
   side pins of the potentiometer go to +5V and ground
 * LED connected from digital pin 9 to ground
 
 created 29 Dec. 2008
 by Tom Igoe
 
 */
 
#include <EEPROM.h>
 #include <LiquidCrystal.h>
 
 
 LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
 
// These constants won't change.  They're used to give names
// to the pins used:
float tempC;
int TempC_Decimal = 0;
int tempPin = 0;
int DigitalPin =  13;
int TemperaturaMinima = 23;
int value = 0;
 
int sensorValue = 0;        // value read from the pot
int outputValue = 0;        // value output to the PWM (analog out)
 
void setup() {
  // initialize serial communications at 9600 bps:
    lcd.begin(20, 4);
  value = EEPROM.read(0);
  if (value == 1) 
  {
    TemperaturaMinima =  EEPROM.read(1);
  }
  
}
 
void loop() {
   if (Serial.available() > 0) 
   {
      // read the incoming byte:
      TemperaturaMinima = Serial.read();
      
      EEPROM.write(0, 1);
      EEPROM.write(1, TemperaturaMinima);
 
   }
 
   tempC = analogRead(tempPin);           //read the value from the sensor
   tempC = (5.0 * tempC * 100.0)/1024.0;  //convert the analog data to temperature
   TempC_Decimal = (tempC - (tempC)) * 100;
   lcd.clear();
   lcd.setCursor  (4,1);
   lcd.print(tempC);   //send the data to the computer
   lcd.setCursor  (4,7);
   lcd.print(TempC_Decimal);             //send the data to the computer
   lcd.setCursor  (2,2);
   Serial.println(TemperaturaMinima);
   if (tempC < TemperaturaMinima) 
   {
     digitalWrite(DigitalPin, HIGH);   // set the LED on
     delay(4000);                  // wait for a second
   }
   if (tempC > (TemperaturaMinima + 1)) 
   {
     digitalWrite(DigitalPin, LOW);   // set the LED on
     delay(4000);      
   }
   delay(200);                                     
}

lo modificato in base a i vostri aiuti e sembra funzionare a temperatura impostata attiva una uscita per il rele al momento e un led .
adesso volevo sapere se era possibile tramite due pulsanti aumentare o diminuire lintervento di soglia e visualizarlo sul display

per uwefed ho provato a modificare anche questo temperature = aRead*1,074; ma quando faccio la verifica mi da errore sono sicuro che sbaglio qualcosa qmc poi ci riprovero

ciao,
per i pulsanti guarda qui http://www.arduino.cc/en/Tutorial/Button.
Crei una variabile (es. isteresi) che inizializzi a 1 e la utilizzi in

if (tempC > (TemperaturaMinima + isteresi))

In riferimento al codice del link metti

if(buttonState == HIGH)
{ isteresi += 0.1}

e togli l’else. Poi realizzi un secondo pulsante (hardware uguale) solo che per questo il codice é

if((button2State == HIGH) && (isteresi > 0))
{ isteresi -= 0.1}

Poi fai visualizzare sul display isteresi nello stesso modo in cui lo fai per la temperatura

Sui conti, non è che sbagli a mettere la “virgola” al posto del “punto”?
temperature = aRead*1**.**074

frog niente da fare non ci riesco proprio ho passato tutto il pomeriggio a provarci ma riesco ad avere solo errori

forse allora è meglio se posti il codice completo che ti da errore

ho provato a scrivere ma sicuramente mi manca qualcosa ma non so dove sbaglio

  Analog input, analog output, serial output
 
 Reads an analog input pin, maps the result to a range from 0 to 255
 and uses the result to set the pulsewidth modulation (PWM) of an output pin.
 Also prints the results to the serial monitor.
 
 The circuit:
 * potentiometer connected to analog pin 0.
   Center pin of the potentiometer goes to the analog pin.
   side pins of the potentiometer go to +5V and ground
 * LED connected from digital pin 9 to ground
 
 created 29 Dec. 2008
 by Tom Igoe
 
 */
 
#include <EEPROM.h>
 #include <LiquidCrystal.h>
 
 
 LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
 
// These constants won't change.  They're used to give names
// to the pins used:
float tempC;
int TempC_Decimal = 0;
int tempPin = 0;
int DigitalPin =  13;
int TemperaturaMinima = 22;
int value = 0;
 int isteresi = 1;
int sensorValue = 0;        // value read from the pot
int outputValue = 0;        // value output to the PWM (analog out)
 
void setup() {
  
    lcd.begin(4,20);
  value = EEPROM.read(0);
  if (value == 1) 
  {
    TemperaturaMinima =  EEPROM.read(1);
  }
  pinMode isteresi, INPUT) ;
}
 
void loop() {
   if (Serial.available() > 0) 
   {
      // read the incoming byte:
      TemperaturaMinima = Serial.read();
      
      EEPROM.write(0, 1);
      EEPROM.write(1, TemperaturaMinima);
      buttonState =digitalRead(isteresi);
      if(buttonState == HIGH)
      { isteresi  += 0.1}
 
   }
 
   tempC = analogRead(tempPin);           //read the value from the sensor
   tempC = (5.0 * tempC * 100.0)/1024.0;  //convert the analog data to temperature
   TempC_Decimal = (tempC - (tempC)) * 100;
   lcd.clear();
   lcd.print ( "TEMP.INTERNA +" );
   lcd.setCursor  (14,0);
   lcd.print(tempC);   //send the data to the computer
   lcd.setCursor  (19,0);
   lcd.print(TempC_Decimal);             //send the data to the computer
   lcd.setCursor  (2,2);
   Serial.println(TemperaturaMinima);  
 lcd.setCursor (0,1);   
 lcd.print ( "TEMP.di soglia +" ); 
    lcd.setCursor (18,1);          //sposta i gradi di soglia sull'lcd
 
   lcd.print(TemperaturaMinima); // scrive temperatura di soglia
    
   if (tempC < TemperaturaMinima)
   
   if (tempC (TemperaturaMinima + isteresi))
   
   {
     digitalWrite(DigitalPin, HIGH);   // set the LED on
     delay(4000);                  // wait for a second
   }
   if (tempC > (TemperaturaMinima + 1)) 
   {
     digitalWrite(DigitalPin, LOW);   // set the LED on
     delay(4000);      
   }
   delay(200);                                     
}

questo e con il casino

e questo funziona ma non imposta il livello di intervento ventola

/*
  Analog input, analog output, serial output
 
 Reads an analog input pin, maps the result to a range from 0 to 255
 and uses the result to set the pulsewidth modulation (PWM) of an output pin.
 Also prints the results to the serial monitor.
 
 The circuit:
 * potentiometer connected to analog pin 0.
   Center pin of the potentiometer goes to the analog pin.
   side pins of the potentiometer go to +5V and ground
 * LED connected from digital pin 9 to ground
 
 created 29 Dec. 2008
 by Tom Igoe
 
 */
 
#include <EEPROM.h>
 #include <LiquidCrystal.h>
 
 
 LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
 
// These constants won't change.  They're used to give names
// to the pins used:
float tempC;
int TempC_Decimal = 0;
int tempPin = 0;
int DigitalPin =  13;
int TemperaturaMinima = 22;
int value = 0;
 
int sensorValue = 0;        // value read from the pot
int outputValue = 0;        // value output to the PWM (analog out)
 
void setup() {
  
    lcd.begin(4,20);
  value = EEPROM.read(0);
  if (value == 1) 
  {
    TemperaturaMinima =  EEPROM.read(1);
  }
  
}
 
void loop() {
   if (Serial.available() > 0) 
   {
      // read the incoming byte:
      TemperaturaMinima = Serial.read();
      
      EEPROM.write(0, 1);
      EEPROM.write(1, TemperaturaMinima);
 
   }
 
   tempC = analogRead(tempPin);           //read the value from the sensor
   tempC = (5.0 * tempC * 100.0)/1024.0;  //convert the analog data to temperature
   TempC_Decimal = (tempC - (tempC)) * 100;
   lcd.clear();
   lcd.print ( "Temp.Interna +" );
   lcd.setCursor  (14,0);
   lcd.print(tempC);   //send the data to the computer
   lcd.setCursor  (19,0);
   lcd.print(TempC_Decimal);             //send the data to the computer
   lcd.setCursor  (2,2);
   Serial.println(TemperaturaMinima);  
 lcd.setCursor (0,1);   
 lcd.print ( "Temp.Attivazione +" ); 
    lcd.setCursor (18,1);          //sposta i gradi di soglia sull'lcd
 
   lcd.print(TemperaturaMinima); // scrive temperatura di soglia
   lcd.setCursor (0,2); 
   lcd.print ( "Umidita' Int. %" ); 
  
   if (tempC < TemperaturaMinima) 
   {
     digitalWrite(DigitalPin, HIGH);   // set the LED on
     delay(4000);                  // wait for a second
   }
   if (tempC > (TemperaturaMinima + 1)) 
   {
     digitalWrite(DigitalPin, LOW);   // set the LED on
     delay(4000);      
   }
   delay(200);                                     
}

mi sono accorto di averti dato un’ indicazione mezza sbagliata sulla funzionalità da associare al pulsante (ad ogni giro di loop, se tieni premuto il pulsante incrementa l’isteresi di 0.1 gradi).
Domani con calma miglioro la cosa e ispeziono il codice che hai scirtto.

grazie gentilissimo comunque non sei tu che ti sei sbagliato sono io che non ci capisco niente. va bene anche l'interesi di 0,1 per volta tanto basta solo spingere piu volte

può pero succedere che il setup() sia talmente volece ad essere eseguito che non si riesca a controllare l'incremento dell'isteresi: tu pensi di premere velocemente una sola volta ma isteresi aumenta di 0.4: per la tua applicazione può non essere un problema ma io trovo la cosa particolarmente noiosa

intanto il pulsante

...
int buttonPin = ?; //qui devi mettere il numero del pin sul quale hai collegato il pulsante
char stato_pulsanti = 0;
int isteresi = ?; //qui devi mettere il valore di default dell'isteresi
...

void setup(){
    ...
    pinMode(buttonPin, INPUT)
    ...
}

void loop(){
    ...
    buttonState = digitalRead(buttonPin);
    if((buttonState == HIGH) && !(stato_pulsanti & 0x01))
    {
        isteresi  += 0.1;
        stato_pulsanti |= 0x01;
    }
    else
    {
        if((buttonState == LOW) && (stato_pulsanti & 0x01))
        {
            //isteresi  -= 0.1;            //riga erroneamente inserita in un primo momento
            stato_pulsanti &= ~0x01:
        }
    }
    ...
}

per il resto del codice ci guardo nel pomeriggio

ciao, come ormai mi succede un po’ troppo di frequente ho ragionato troppo poco. Il codice per l’utilizzo del pulsante che ho pubblicato questa mattina conteneva un errore di funzionalità: non andava messa la riga con isteresi -= 0.1
Ho guardato il tuo codice e secondo me questo dovrebbe funzionare correttamente

#include <EEPROM.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

float tempC;
int TempC_Decimal = 0;
int tempPin = 0;
int DigitalPin =  13;
int TemperaturaMinima = 22;
int value = 0;
int isteresi = 1;
int buttonPin_inc = 6;
int buttonPin_dec = 7;
char stato_pulsanti = 0;
int lettura_pulsante = 0;

void setup() {
  lcd.begin(4,20);
  value = EEPROM.read(0);
  if (value == 1)
  {
    TemperaturaMinima =  EEPROM.read(1);
  }
  pinMode(DigitalPin, OUTPUT);
  pinMode(buttonPin_inc, INPUT);
  pinMode(buttonPin_dec, INPUT);
}

void loop() {
  //valutazione di dati disponibili da seriale
  if (Serial.available() > 0)
  {
    TemperaturaMinima = Serial.read();
    EEPROM.write(0, 1);
    EEPROM.write(1, TemperaturaMinima);
  }
  
  //gestione della pressione del pulsante collegato al pin 6 per incrementare l'isteresi
  lettura_pulsante = digitalRead(buttonPin_inc);
  if((lettura_pulsante == HIGH) && !(stato_pulsanti & 0x01))
  {
    isteresi += 0.1;
    stato_pulsanti |= 0x01;
  }
  else
  {
    if(lettura_pulsante == LOW)
    {
      stato_pulsanti &= ~0x01;
    }
  }
  
  //gestione della pressione del pulsante collegato al pin 7 per decrementare l'isteresi
  lettura_pulsante = digitalRead(buttonPin_dec);
  if((lettura_pulsante == HIGH) && !(stato_pulsanti & 0x02))
  {
    isteresi -= 0.1;
    stato_pulsanti |= 0x02;
  }
  else
  {
    if(lettura_pulsante == LOW)
    {
      stato_pulsanti &= ~0x02;
    }
  }
  
  //calcolo dela temperatura attuale
  tempC = analogRead(tempPin);           //read the value from the sensor
  tempC = (5.0 * tempC * 100.0)/1024.0;  //convert the analog data to temperature
  TempC_Decimal = (tempC - (tempC)) * 100;
  //visualizzazione a display
  lcd.clear();
  lcd.print ( "TEMP.INTERNA +" );
  lcd.setCursor  (14,0);
  lcd.print(tempC);
  lcd.setCursor  (19,0);
  lcd.print(TempC_Decimal);
  lcd.setCursor  (2,2);
       lcd.setCursor (0,1);  
       lcd.print ( "TEMP.di soglia +" );
  lcd.setCursor (18,1);          //sposta i gradi di soglia sull'lcd
  lcd.print(TemperaturaMinima); // scrive temperatura di soglia
  
  //trasmissione via seriale della temperatura di soglia
  Serial.println(TemperaturaMinima);
  
  //gestione dell'attivazione/disattivazione dell'uscita in base alla temperatura letta
  if (tempC < TemperaturaMinima)
  {
    digitalWrite(DigitalPin, HIGH);   // set the LED on
    delay(4000);                      // wait for a second
  }
  else
  {
    if (tempC > (TemperaturaMinima + isteresi))
    {
      digitalWrite(DigitalPin, LOW);  // set the LED off
      delay(4000);      
    }
  }
  delay(200);                                    
}

prevede due pulsanti, uno per incrementare l’iscteresi (collegato al pin 6) e un oper decrementarla (collegato al pin 7) per lo schema fai sempre riferimento a www.arduino.cc/en/Tutorial/Button.
Per quel che riguarda la ventola tu dici “[…]questo funziona ma non imposta il livello di intervento ventola”. Dove avresti collegato la ventola? E in che condizioni si dovrebbe attivare? Sul codice non c’è traccia di queste due cose.

grazie frog sei veramente un genio quasi quasi mi fai invidia ahahaaaa. Domani preparo i pulsanti e faccio una prova,la ventola che dico io in realta' e la cella di peltier per riscaldare ,attualmente sul codice e selezionato da un led e posto al pin 13 si attiva appena scende la temperatura impostata che adesso sempre sul codice c'e scritto temperatua minima 22 comunque ancora dico che non so come ringraziarti domani ti faccio sapere

aspetta a cantar vittoria, per il momento ti posso garantire che non ci sono errori di forma (la compilazione va a buon fine). vediamo domani se ti funziona

non ho resistito a provare adesso con una resistenza e un pezzo di filo ho provato e non funzionava poi ho provato a levare int isteresi e sostituire tutto con TemperaturaMinima e funziona non so il perche ma va poi per salire di un grado bisogna spingere ripetutamente il pulsante e ho provato a modificare questo TemperaturaMinima += 0.1; con +=1; e va un pochino meglio domani preparo dei veri pulsanti e provo meglio