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.
Arduino Tutorial - Learn electronics and microcontrollers using 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
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 = aRead1,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