Qualche info grossolana per un newbie

Ciao a tutti, mi chiamo Davide e sto sperimentando per la prima volta con arduino (e con la meccatronica in generale) per cui alcune cose che io ignoro potranno sembrare idiozie e certamente esserlo ma non per me, siate buoni :stuck_out_tongue:

Ho scoperto questa piattaforma gradie al forum di hardware upgrade, e mi ci sto avvicinando passo passo.
Sto progettando un impianto che:

  • gestisce due pompe a 220V mediante due relais
  • gestisce una TEC a 12V mediante un relais, previo trasformatore e raddrizzatore
  • gestisce tre sonde di temperatura
  • gestisce un display e alcuni pulsanti per cambiare le temperatura di soglia
  • gestisce due interruttori per escludere parti del ciclo

Il tutto per fare la birra :smiley:

Ho acquistato arduino mega (ahimè un clone, sembra ben fatto, dall'uk, costava la metà), un lcd keypad shield, due input shield con 2 bottoni e joy 2 vie (che non so se userò).

Lo sketch ho iniziato a scriverlo e per ora sono a buon punto, la parte di regolazione automatica che gestisce l'impianto è abbastanza ok, sto iniziando a studiare come funziona la programmazione del display e la lettura dei bottoni associati.

Mi trovo però con qualche dubbio hardware:

Non ho trovato cavu m/f ma solo f/f. Arduino ha zoccoli F, gli shield hanno pin M, quindi mi servirebbero delle spinette m/m con la plastichina in mezzo per poter collegare il puntale f allo zoccolo f di arduino. Ho passato tutto ieri a cercare in città (PC) un negozio che li avesse ma niente. Ho trovato un posto interessante dove aveva componenti elettroniche sfuse ma non quegli oggetti, inizio a pensare che non esistano....come si collegano arduino e gli shield?
L'LCD ho pensato di incastrarcelo sopra e dato che la mega è più lunga usare solo i contatti che sbordano per collegare tutto il resto tramite i cavi.
Eventualmente quelle spinette mi servirebbero anche per giuntare i cavi (quelli che ho preso sono sui 25 cm e potrebbero essere corti.)

Altra domanda: che relais riesce a pilotare la Mega alimentata a 9V (ho comprato un alimentatore GBC stabilizzato multivoltaggio da 1000 mA)?
Ho detto al tizio del negozio che butta fuori 5V, lui allora mi ha dato dei relais con la bobina a 6V, mi dice che potrebbero assorbire 50 mA, c'è rischio di danneggiare arduino? Quei relais dovranno rimanere eccitati per ore, non vorrei si surriscaldasse.

Esistono dei quadretti idonei a metterci dentro l'elettronica in modo che venga un lavoretto ben fatto? Alla fine dovrà risultare una cosa "elegante", verrà montata sul telaio del banco con i fuochi, tegamoni, pompe e serbatoi e dovrebbe essere un quadretto in cui entra un cavo di alimentazione ed escono i cavi per il comando dei carichi, con visibili il display (farò un buco a misura), pulsanti e interruttori. Consigli?

Per supportare le schede ho preso dei supportini che in realtà sono dadini di gomma zigrinati, pensavo di prenderli tra le colonnette e la piastra per non montarla "sul duro".

Sempre parlando di connessioni, i relais hanno i puntali per i faston mini, ci sono adattatori o prendo il cavetto, taglio il puntale e mondo un faston femmina?

dimenticavo :-[
non ho capito bene come collegare tutti i cavi, i pin sono unipolari, la massa deve essere comune? Collegata dove?

ciao

perche non vai sul forum del clonatore a chiedere ? :slight_smile:

sono sicuro che il loro italiano è fluentissimo :slight_smile:

Da conti che ho fatto comunque ti sarebbe bastato l'arduino normale, mi sa che il mega e' sprecato. Comunque, non ho capito bene il tuo post perche' dici che arduino ha i pin F e gli shield quelli M, quindi si dovrebbero collegare correttamente. Se invece quello che cerchi e' un adattatore F-F, non esiste e te lo devi saldare. Per i relays puoi utilizzare quello che vuoi, esistonoda 5-6 e 12 volt che potrebbero andare bene con arduino, al limite devi inserire un mosfet o un transistor.

E il prossimo arduino prendilo originale!

Mi rendo conto che sarebbe meglio per tutti se il mondo fosse migliore, ma visto che a me lo stipendio non me lo danno per migliorare il mondo sono obbligato a guardare anche il portafogli, e risparmiare 30? sull'unghia di questi tempi non è male.
La scheda l'ho comprata da DF Robot, mi sembra se ne parli anche nelle pagine del sito di arduino, altro non so.
Mi scappa un po' da ridere ricevendo questa "accoglienza", il mondo è globalizzato solo quando fa comodo? ::slight_smile:

Vabbé andrò a chiedere nel forum del clonatore.

saluti

per la cronaca, DFRobot non è un venditore ufficiale e il suo nome non compare da nessuna parte. ha già ricevuto almeno 5 email da parte nostra perche ha l'abitudine di mettere il nome Arduino su tutto quello che fabbrica.( tr un po' ci sarà pure lo scopino del cesso Arduino)

Arduino è open, chiunque se lo può fabbricare ma chiediamo di non usare il nome Arduino. Ovviamente il nome vale più del resto e contribuire alla comunità è un inutile costo.

Io sono qui a rispondere al forum mentre lui sarà al mare a divertirsi :slight_smile:

m

Massimo, come non darti ragione... cioè hai rilasciato tutto opensource e quello che chiedi è solamente di non copiare il nome, mi pare ragionevole. Beh, se è al mare speriamo venga una mareggiata!

passata la rabbia? tra l'altro la scheda non si chiama nemmeno arduino mega, ma DFRduino mega.

Comunque, se qualcuno fosse interessato a darmi una mano, ho fatto progressi, ma ho ancora dei problemi, forse anche hardware (così chi me l'ha tirata almeno sarà soddisfatto :D)

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

float sonda_refrigerata =15;    // pin a cui e' collegata la sonda serbatoio refrigerata
float sonda_birra = 14;          // pin a cui e' collegata la sonda serbatoio birra
float sonda_tec = 13;          // pin a cui e' collegata la sonda TEC
int alza_refr = 22;      // pin per il bottone aumento setpoint refrigerata
int abbassa_refr = 23;   // pin per il bottone diminuzione setpoint refrigerata
int alza_birra = 24;     // pin per il bottone aumento setpoint birra
int abbassa_birra = 25;  // pin per il bottone diminuzione setpoint birra
int tec = 53;            // pin per il comando relais accensione TEC
int vent_tec = 52;       // pin per il comando relais ventilatore TEC (eventualmente libero il pin e collego il ventilatore al relais TEC)
int pompa_ref = 51;          // pin per il comando relais pompa circuito refrigerata (eventualmente libero il pin e collego la pompa al relais TEC)
int pompa_birra = 50;       // pin per il comando relais pompa circuito birra
int escludi_ref = 49;        // pin per l'interruttore esclusione circuito refrigerata (non essenziale, si puo' anche eliminare)
int escludi_birra = 48;      // pin per l'interruttore esclusione circuito birra
int setpoint_ref = 60;   // inizializza il setpoint dell'acqua refrigerata a 5 C 
int setpoint_birra = 60;// inizializza il setpoint della birra a 22 C
int incr_refr;      // inzializza la variabile associata ai bottoni di regolazione setpoint refrigerata
int incr_birra;     // inizializza una variabile associata ai bottoni di regolazione setpoint birra
int decr_refr;      // inzializza la variabile associata ai bottoni di regolazione setpoint refrigerata
int decr_birra;     // inizializza una variabile associata ai bottoni di regolazione setpoint birra
int lettura_birra;         // inizializza una variabile contenente la lettura della birra
int lettura_refrigerata;           // inizializza una variabile contenente la lettura della refrigerata
int lettura_tec;          // inizializza una variabile contenente la lettura della TEC
int temp_tec;       // inizializza una variabile contenente la temperatura della TEC
int temp_birra;     // inizializza una variabile contenente la temperatura della birra
int temp_ref;       // inizializza una variabile contenente la temperatura della refrigera


void setup() {                                  //dichiarazione degli ingressi come imput o output
  pinMode(sonda_refrigerata, INPUT);  
  pinMode(sonda_birra, INPUT);
  pinMode(sonda_tec, INPUT);
  pinMode(alza_refr, INPUT);
  pinMode(abbassa_refr, INPUT);  
  pinMode(alza_birra, INPUT);
  pinMode(abbassa_birra, INPUT);
  pinMode(tec, OUTPUT);
  pinMode(vent_tec, OUTPUT);
  pinMode(pompa_ref, OUTPUT);
  pinMode(pompa_birra, OUTPUT);
  pinMode(escludi_ref, INPUT);
  pinMode(escludi_birra, INPUT);

 lcd.begin(16,2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Birra");
  lcd.setCursor(0, 1);
  lcd.print("Refr.");
  lcd.setCursor(9, 0);
  lcd.print("Set");
  lcd.setCursor(9, 1);
  lcd.print("Set");
  
}

void loop() {
  
  lettura_birra = analogRead(sonda_birra);                 // legge la sonda birra in valore sonda
  lettura_refrigerata = analogRead (sonda_refrigerata);    // legge la sonda refrigerata in valore sonda
  lettura_tec = analogRead (sonda_tec);                    // legge la sonda TEC in valore sonda
  temp_tec = (5.0 * lettura_tec * 100.0)/1024.0;           // interpreta la lettura della sonda TEC in gradi centigradi
  temp_birra = (5.0 * lettura_birra * 100.0)/1024.0;       // interpreta la lettura della sonda birra in gradi centigradi
  temp_ref = (5.0 * lettura_refrigerata * 100.0)/1024.0;   // interpreta la lettura della sonda refrigerata in gradi centigradi
  incr_birra = digitalRead (alza_birra);        // legge il bottone per alzare il setpoint birra
  delay(20);                                    // il delay serve per evitare che ciclando il programma la lettura venga effettuata piu' volte per una sola pressione
  decr_birra = digitalRead (abbassa_birra);     // legge il bottone per abbassare il setpoint birra
  delay(20);
  incr_refr = digitalRead (alza_refr);          // legge il bottone per alzare il setpoint refrigerata
  delay(20);
  decr_refr = digitalRead (abbassa_refr);       // legge il bottone per abbassare il setpoint refrigerata
  delay(20);

  if (incr_birra = HIGH){           // se ha rilevato pressione del bottone + birra incrementa
    setpoint_birra++;
  }
  if (decr_birra = HIGH){           // se ha rilevato pressione del bottone - birra decrementa
    setpoint_birra--;
  }
  if (incr_refr = HIGH){            // se ha rilevato pressione del bottone + refrigerata incrementa
    setpoint_ref++;
   }
  if (decr_refr = HIGH){            // se ha rilevato pressione del mottone - refrigerata decrementa
    setpoint_ref--;
  }

  if (escludi_ref != HIGH && temp_tec < 80){   // controlla se non e' escluso il circuito refrigerata e se la temperatura della TEC e' sotto soglia
    if (temp_ref > setpoint_ref){              // se il passaggio precedente e' validato, controlla se l'accumulo non e' in temperatura
    digitalWrite(pompa_ref, HIGH);             // se non e' in temperatura accende la pompa del circuito refrigerata
    delay(50);                          // attende un secondo
    digitalWrite(vent_tec, HIGH);       // accende il ventilatore della TEC
    delay(50);                          // attende un secondo
    digitalWrite(tec, HIGH);            // accende la TEC
    }
    else                                // se l'accumulo e' in temperatura 
    { 
    digitalWrite(tec, LOW);             // spegne la TEC
    delay(50);                          // attende 5 secondi
    digitalWrite(vent_tec, LOW);        // spegne il ventilatore della TEC
    digitalWrite(pompa_ref, LOW);       // e la TEC
    }
  }
  else                                  // se il circuito refrigerata e' escluso o se la TEC e' surriscaldata
  { 
    digitalWrite(tec, LOW);             // spegne la TEC 
    delay(50);                          // attende 5 secondi
    digitalWrite(vent_tec, LOW);        // spegne il ventilatore della TEC
    digitalWrite(pompa_ref, LOW);       // e la TEC
  }
  if (escludi_birra != HIGH && temp_birra > setpoint_birra){ // controlla se non e' escluso il circuito birra e che la temperatura della birra sia sopra soglia
    digitalWrite(pompa_birra, HIGH);                         // accende la pompa del circuito birra
    }
    else              
    { 
    digitalWrite(pompa_ref, LOW);       // altrimenti spegne la pompa del circuito birra  
  }
  lcd.setCursor(6, 0);
  lcd.print(temp_birra);
  lcd.setCursor(6, 1);
  lcd.print(temp_ref);
  lcd.setCursor(13, 1);
  lcd.print(setpoint_birra);
  lcd.setCursor(13, 0);
  lcd.print(setpoint_ref);
  
}

In questo modo il display funziona, visualizza correttamente i testi, mentre le due letture delle sonde sono numeri a tre cifre in continuo cambiamento anche senza sonde collegate. Indicativamente cambia repentinamente da 0 a 400 frullando.
I setpoint che ho inizializzato a 60 rimangono tali. Per ora non ho configurato i bottoni analogici dell'lcd per non complicare troppo, quindi ho mantenuto i bottoni analogici.
Se non ho capito male, per far risultare HIGH un digitale, devo collegare un bottone ai 5V e al suo pin. Cliccando chiude il circuito e rileva HIGH.
Il problema è che alcuni pin risultano HIGH ance senza nulla connesso, altri risultano HIGH anche infilandoci un connettore volante, un filo staccato. Per fare la prova, ho usato l'esempio Button che fa accendere un led quando il bottone viene rilevato HIGH.
Questo è un sintomo di un problema hardware?
Lasciamo per un attimo perdere questa cosa, che potrebbe essere eventualmente risolta con una sostituzione del prodotto.
Il problema principale è che ho difficoltà ad ottenere la lettura delle sonde in un formato corretto, cioè gradi centigradi. Senza sonde connesse, in teoria, dovrei leggere un valore corrispondente a 0V, che una volta tarata sarà credo tipo -20°C, tra l'altro stabile.
Penso che la ragione sia il formato della variabile in cui ho convertito il valore dalla lettura alla temperatura.
Qualcuno mi sa dare qualche info a riguardo? Tra l'altro mi è stato consigliato di cambiare la libreria che usavo prima (lcd4bit_mod) con questa perchè dovrebbe avere delle funzioni che servono all'uopo, ma non ne ho trovate.

metti lcd.clear in fondo al codice e guarda se ti funziona.

Il mio consiglio è: prova con dei potenziometri collegati tra massa e 5v al posto dei sensori. Magari creati una funzone per scrivere nel display. Dalla mia breve esperienza ti posso dire che lcd.clear quando stampi dati sul display aiuta parecchio sennò non refresha!

Quei problemi di tensioni sbagliate li hai perchè hai inizializzato alcuni pin in modo sbagliato, non credo dipendano dalla scheda sia guasta.

I pin analogici non vanno inizializzati!

Non ho mai provato ma magari un indirizzamento dei pin come float potrebbe non digerirlo, mi riferisco a:

float sonda_refrigerata =15; // pin a cui e' collegata la sonda serbatoio refrigerata
float sonda_birra = 14; // pin a cui e' collegata la sonda serbatoio birra
float sonda_tec = 13; // pin a cui e' collegata la sonda TEC

Se metto lcd.clear il display rimane vuoto, appare un attimo qualcosa e poi si cancella tutto. Senza lcd.clear funziona perfettamente, nel senso che le scritte rimangono fisse e i numeri continuano a cambiare.
Ho provato a cambiare la variabile da float a long e non cambia nulla, anche i numeri visualizzati sono più o meno uguali. Idem se le dichiaro come int. Se collego la sonda (il pin GND della sonda sul pin GND di arduino, il pin +Vs della sonda sul pin 5V di arduino, il pin Vout della sonda sul pin di arduino che ho usato per la sonda - è corretto??) non cambia nulla.....
Cosa vuol dire che i pin analogici non vanno inizializzati? Non capisco come fare a discriminare tra i pin analogici e quelli digitali dato che da 1 a 15 esistono sia analogici sia digitali e se scrivo <variabile = pin> se pin l'ho usato sul digitale (c'è incastrato il display) come poter usare una sonda su un pin analogico con lo stesso numero.

mi mancano un po' di conoscenze per sapere come lavora il codice.
analogread(input) ad esempio: analogread che cosa si aspetta di dover leggere? In realtà c'è un valore in volt su quel pin. Ugualmente la funzione analogread mi va a scrivere in una variabile un numero, che dovrebbe essere tra 0 e 1024, qualsiasi sia l'ingresso. Essendo un numero, è un int. Poi lo converto in un altro numero mediante la funzione di trasferimento, ma qui ho un dubbio: essa mi produce un numero con la virgola, se lo dichiaro int ci pensa lui ad arrotondarlo o scazza?
Dopodiché ho una variabile che in realtà è un numero, diciamo 20, non dovrei avere problemi a mandarlo direttamente al display.

provando questo semplice codice

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int sensorPin = 15; 

void setup()
{
  lcd.begin(16,2);  
}
 
void loop()                  

{
 int reading = analogRead(sensorPin);  
 float voltage = reading * 5.0 / 1024; 
 lcd.setCursor(0,0);
 lcd.print(voltage); 
 float temperatureC = (voltage - 0.5) * 100 ;  
 lcd.setCursor(6,0);            
 lcd.print(temperatureC);
 float temperatureF = (temperatureC * 9 / 5) + 32;
 lcd.setCursor(0,1);
 lcd.print(temperatureF);
 delay(1000);            
}

ottengo che il primo valore visualizzato, il voltaggio, oscilla tra un valore prossimo a zero ed un valore prossimo a 5.00, che sono i due estremi di lettura.
Collegando una sonda non cambia nulla.
Non so dove sbattere la testa

guarda con un potenziometro al posto della sonda. perchè un potenziometro tipo da 5k-10k sicuramente è compatibile con i livelli logici di arduino. In quel modo capisci se il programma funziona, se non funziona neanche in quel modo prova a cambiare pin, magari quello è difettato.

e se proprio non arrivi a nulla prova potenziometro + questo codice

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int sensorPin = 15;

void setup()
{
  lcd.begin(16,2);  
}

void loop()

{
 int reading = analogRead(sensorPin);  
 float voltage = reading * 5.0 / 1024;
 lcd.setCursor(0,0);
 lcd.print(voltage);
 float temperatureC = (voltage - 0.5) * 100 ;  
 lcd.setCursor(6,0);
 lcd.print(temperatureC);
 float temperatureF = (temperatureC * 9 / 5) + 32;
 lcd.setCursor(0,1);
 lcd.print(temperatureF);
 lcd.clear  //ho aggiunto questo
 delay(100); // e diminuito questo

}

Ho collegato il trimmer da 10 kOhm tra i 5V e il pin della sonda. Qualcosa succede, nel senso che la lettura della tenzione non è più solo tra 0 e 5 V ma ci sono anche valori intermedi. Comunque ad ogn refresh spara casualmente su o giù: 2,73 4,98 1,52 3,76 0,04 cose così.
Se metto lcd.clear() in fondo, come ho verificato prima e riverificato ora, si cancella tutto e non rimane niente.
devo metterlo subito dopo loop().
Comunque anche con il tuo suggerimento e il trimmer attaccato, succede solo che è molto più veloce e non si fa in tempo a leggere, comunque continua a sparare numeri a casaccio. Ho provato tutti e 6 i pi analogici disponibili (i primi due "scoperti", l'8 e il 9, sono già mappati per il display anche se sono fisicamente altri e non ho ancora capito come fare per usarli entrambi)

Cosa vuol dire che i pin analogici non vanno inizializzati? Non capisco come fare a discriminare tra i pin analogici e quelli digitali dato che da 1 a 15 esistono sia analogici sia digitali e se scrivo <variabile = pin> se pin l'ho usato sul digitale (c'è incastrato il display) come poter usare una sonda su un pin analogico con lo stesso numero.

Ma dove hai letto che da 1 a 15 sono sia analogici sia digitali?
Io inizierei dalle basi...

Hai ragione, per quello chiedo :wink:

La scheda ha una serie di pin da 0 a 15 con indicato analog in, una seconda serie di pin da 2 a 13 con scritto PWM, una secondo pin 0 RX, un secondo pin 1 RX, altri pin da 14 a 21 Communication, un'altra serie che va da 22 a 53 con scritto Digital.

I pin che sono numerati da 0 a 15 ci sono da due parti, non so come distinguere nel codice tra l'uno e l'altro.

con delay(1000) leggi il sensore e scrivi un valore ogni secondo, le variazioni entro 1 secondo non le vedi.

mettere lcd.clear() prima del delay ha appunto l'effetto di cancellare sempre lo schermo, il loop esegue le istruzioni talmente veloce che il tempo tra la prima e l'ultima istruzione prima del delay è così piccolo che a occhio non te ne accorgli. L'ultima istruzione prima del delay è il clear del display ed il risultato è il display vuoto!
Mettere il lcd.clear() dopo il delay però è la stessa cosa di metterlo come prima istruzione.

Se col trimmer funziona, allora potrebbe essere un problema di sensori, cosa usi?

no col trimmer non funziona, sballa continuamente la lettura. Sarebbe normale una leggera variazione, n on che passi da un estremo all'altro del campo di misura.
Come sonde ho attaccato una LM35, per ora sto provando a pezzi, niente bottoni o altro.

Complimenti per il progetto arkanoid ... è proprio quello a cui sto pensando io ... automatizzare un impianto per la produzione di birra ;D

Il fatto che arrivino valori a caso dall'arduino non è bello! Io come prova (se non l'hai già fatta) collegherei solamente un potenziometro ad un pin analogico dell'arduino e scriverei giusto due righe di codice per leggerne il valore. Se è ok poi collegherei la sonda. Se anche così non funziona comincerei a dubitare seriamente sul funzionamento della scheda.

Paolo
PS: l'alimentazione della scheda è ok? Non è che magari l'alimentatore è sottodimensionato?

guarda, ho provato in tanti modi, sia senza niente che con un filo che con un trimmer, valori a caso.
Sto aspettando che mi arrivi un pacco con transistor e robetta varia per verificare il funzionamento con i relais, mi sono arrivate le pompe (sembrano ben fatte), la tec, sono quasi a posto.
Appena arriva la roba tento qualche cosa e se non funziona il venditore mi sente.

Si capisce che il padrone di casa mi ha madonnato tanto dietro che il mio clone ha pensato bene di andare a farsi fottere! ;D

Mi sono saldato su una millefori questo schema

ho collegato il +6V dell'alimentatore a dove nello schema c'è +12V (ho il rele a 6V), il negativo dell'alimentatore e la massa di arduino alla massa dello schema, il pin di comando di arduino all' IN 0-5V dello schema.
Ho controllato con il tester e tra comando e terra ci sono 0-5V a intervalli regolari di un secondo (ho usato un codice banale di intermittenza), mentre tra positivo e terra ci sono quasi 9V (l'alimentatore è a 6V ma credo sia dovuto all'assenza di carico).
Però il transistor non commuta e il rele non scatta.
Esistono modi particolari per saldare questa roba? Non vorrei avere cotto qualcosa, anche se onestamente ho cercato di "toccare" appena i piedini al momento della saldatura.