ciao a tutti

ciao a tutti mi chiamo marco e mi sono appena iscritto

vorrei costruire un programma per gestire un acquario ma riesco solo a fare fare un singolo programma ad arduino

quando mescolo piu funzioni mi perdo
se qualcuno fosse cosi paziente da aiutarmi

grazie e ancora un saluto a tutti

Ciao Marco,

pubblica quello che hai fatto fino ad ora (il tuo sketch) e vediamo di capire cosa non funziona.

eccolo.........

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);

int reading = 0;
int sensorPin = A0;
int relay =7;
int reading2 = 0;
int sensorPin2 = A1
int relay2 = 8
void setup() {
 
 lcd.begin(16, 2);
 pinMode(relay,OUTPUT);
}

void loop() {
 reading = analogRead(sensorPin);
 int celsius = reading/2;
 lcd.setCursor(0, 0);
 lcd.print("Temperatura: "); 
 lcd.setCursor(0,1);
 lcd.print(celsius, DEC);
 lcd.print((char)223);
 lcd.print("C");
 if (celsius >28) {
   digitalWrite(7,HIGH);
    lcd.print("    ON");
 } else {
   digitalWrite(7,LOW);
   lcd.print("   OFF");
 }
 delay(500);
 lcd.clear();

 reading2 = analogRead(sensorPin);
 int celsius = reading/2;
 lcd.setCursor(0, 0);
 lcd.print("Temperatura: "); 
 lcd.setCursor(0,1);
 lcd.print(celsius, DEC);
 lcd.print((char)223);
 lcd.print("C");
 if (celsius >28) {
   digitalWrite(7,HIGH);
    lcd.print("    ON");
 } else {
   digitalWrite(7,LOW);
   lcd.print("   OFF");
 }
 delay(500);
 lcd.clear();
}

e pensa che dovrei ancora inserire 5 relay che facciano funzionare le pompe dell acquario alternandosi
e inserire l'orologio per dare a loro un ora a cui accendersi

insomma sono gia 2 settimane che ci sbatto la testa non riesco a far funzionare 2 sensori di temperatura

grazie per aver risposto

ciao,

prima di tutto modifica il tuo post inserendo lo sketch tra i tag code (pulsante </> sopra le faccine)...poi il tuo sketch ha qualche errore...tipo:

tu scrivi lcd.begin(16,2) ma devi scrivere lcd.begin()
nel loop inserisci due volte la variabile locale "int celsius"....la variabile basta definirla una volta sola quindi al sencondo int celsius togli la int.
mancano un paio di ";" nelle variabili globali (quelle scritte in alto).

avevi arlato di difficoltà nel creare e richiamare funzioni...puoi spiegare meglio? altrimenti mi fermo agli errori di compilazione.

ciao

spero di aver capito bene dove mettere il listato

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
// Imposta l'indirizzo del display a 0x27 per 16 caratteri per 2 linee
LiquidCrystal_I2C lcd(0x27,16,2);  




int min_in = 102; // corrisponde a 0.50v
int min_in2 = 102; // corrisponde a 0.50v
int max_in = 205; //  corrisponde a 1.00 v
int max_in2 = 205;// corrisponde a 1.00v
int min_out = 0;// corrisponde a 0c
int min_out2 = 0;// corrisponde a 0c
int max_out = 50;// corrisponde a 50c
int max_out2 = 50;// corrisponde a 50c
int raw_temp = 0;// variabile temperatura grezza
int raw_temp2 = 0;// variabile temperatura grezza

float temperatura = 0.00; // temp memorizzata in decimali
float temperatura2 = 0.00;// temp memorizzata in decimali


void setup(){
  lcd.init();// inizializza il display
  lcd.backlight();//accende la retroilluminazione
  pinMode(A0, INPUT);//imput acqua vasca
  pinMode(A1, INPUT);// imput aria vasca filtro
  pinMode(A2, INPUT);// imput livello acqua filtro
  pinMode(2, OUTPUT); // relay riscaldamento acqua
  pinMode(3, OUTPUT);// relay ventola raffreddamento ambiente filtro

}

  void loop() {
    raw_temp = analogRead(A0);
    raw_temp2 = analogRead(A1);
    temperatura = map(raw_temp, min_in, max_in,min_out, max_out);
    temperatura2 = map(raw_temp, min_in, max_in,min_out, max_out);
    lcd.setCursor(0, 0);
    lcd.print("T ACQUA ");   
    lcd.print(temperatura); 
    lcd.setCursor(0, 1); 
    lcd.print("T ARIA  "); 
    lcd.print(temperatura2);
    delay(3000);
    lcd.clear();
    if (temperatura < 36)digitalWrite(2, HIGH);
    else digitalWrite(2, LOW);
    if (temperatura2 >=25)digitalWrite(3, HIGH);
    else digitalWrite(3, LOW);
    
    int livello = analogRead(A2);
    lcd.setCursor(0, 0);
    lcd.print("LIVELLO ACQUA");
    lcd.setCursor(0, 1);
    lcd.print("FILTRO  ");
    lcd.print(livello);

    delay(3000);
    
    
    
    
    
  
}

qui ho provato in maniera diversa e forse rende meglio l'idea di cosa vorrei fare.
vorrei inserire i messaggi ogni passaggio che fa il programma.

vedi vorrei controllare la temperatura acqua, aria del vano filtro, livello acqua nel filtro , poi inserire i relay che fanno partire il riscaldamento o la ventola per far uscire l'aria calda dal vano filtro , poi mi piacerebbe inserire un pulsante che una volta premuto mi ferma tutte le pompe dell'acquario attiva la mangiatoia poi dopo un tott tempo le fa ripartire.
nella vasca ci sono 3 pompe che dovrebbero funzionare alternate prima una poi l'altra e cosi via.

insomma come inizio un programmino facile facile .......visto che sono solo 3 settimane che lo sto studiando ...... grazie per rispondermi

ciao,

si questa volta hai inserito lo sketch correttamente (modifica anche il primo post).

detto questo nel primo listato hai usato lcd.begin() per inizializzare il display in questo usi lcd.init()!?

non so che libreria usi...quella che ho io necessita del begin().

detto questo...cos'è che non ti funziona?

ciao

ti chiedo una piccola cortesia......

tu quando cominci un nuovo progetto come parti?

ti crei il progetto elettronico prima o il programma?

e meglio fare uno schema a blocchi su un foglio o non ne vale la pena.

quello che non riesco a fare e abbinare una funzione a una comunicazione scritta sul display

ciao

penso che quando si vuole "creare" un progetto si debba pensare a:

cosa deve fare; come e quando deve farlo? (scaldare,raffreddare, leggere temperature, azionare pompe...etc)....qua ci può stare l'abbozzatura di uno schema logico.
per ogni una delle azioni di cui sopra...di che cosa ho bisogno e che cos'ho? (pompe, pulsanti, display, luci..etc)
quanti pin mi serviranno?
che potenze ci sono in gioco? (per singolo componente)
che distanza c'è tra arduino ed i componenti? (influenza un po' di cose)
dove passo i fili? (idem come sopra)
come alimento?

Quindi avendo ben presente cosa devi fare e con che cosa lo farai...magari cerchi esempi uguali o che mostrino l'uso dei singoli componenti o delle singole azioni che vuoi fare...ti trovi le librerie...studi i metodi che ti mette a disposizione...e qua, non solo per le librerie, il concetto di studiare è imperativo...puoi provare a modificare gli esempi che ti vengono suggeriti quando si spiega una funzione, tentare di applicarli per situazioni diverse per cercare di fare tuo il suo utilizzo...ma non s'improvvisa niente. Non so a che livello sei...ma in primis suggerisco una lettura di tutti gli argomenti presenti nel reference QUI, poi uno sguardo alle librerie standard QUI. e nel mentre guardare gli esempi messi a disposizione nell'IDE di arduino.Se trovi difficoltà nel capire od applicare certe cose non scoraggiarti, nulla è facile o difficile a priori...ogniuno di noi ci arriva con i propri tempi, e poi c'è il forum dove chiedere...ma le domande vanno fatte più precise possibili se vuoi un aiuto concreto.

grazie

mi hai dato ottimi consigli. io sono rimasto a 35 anni fa con l'elettronica e in queste 2 settimane infatti ho macinato libri e libri comprati su come usare arduino .
ho studiato elettronica e per quanto riguarda costruire e progettare con i componenti normali non ho problemi anche se sono passati 35 anni.
ora vorrei imparare veramente bene arduino.
grazie ancora per i tuoi preziosi consigli che mi risvegliano la mia memoria.

ciao orso ti vorrei chiedere un piccolo piacere , sto impazzendo per fare girare questo piccolo programma che ho ideato.
arrivo al punto che devo scrivere sul display on oppure off a secondo dello stato ma non riesco a daltarci fuori non è che avresti qualche consiglio?

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
// Imposta l'indirizzo del display a 0x27 per 16 caratteri per 2 linee
LiquidCrystal_I2C lcd(0x27,16,2);
// messaggi da inviare al display
char messaggio1 [ ] = " pompa";
char messaggio2 [ ] = " 1";
char messaggio3 [ ] = " 2";
char messaggio4 [ ] = " 3";
char messaggio5 [ ] = " 4";
char messaggio6 [ ] = " 5";
char messaggio7 [ ] = " 6";
char messaggio8 [ ] = " on";
char messaggio9 [ ] = " off";
char messaggio10 [ ] = " ventilazione";
char messaggio11 [ ] = " livello";
char messaggio12 [ ] = "acqua"; 
char messaggio13 [ ] = "temperatura";
char messaggio14 [ ] = "aria";
char messaggio15 [ ] = " ferma";
char messaggio16 [ ] = " distribuzione";
char messaggio17 [ ] = " mangime";
char messaggio18 [ ] = " riciclo";





int pompa1 = 2;// pompa vasca 1
int pompa2 = 3;// pompa vasca 2
int pompa3 = 4;// pompa vasca 3
int pulsante = 13;// pulsante interruzzione tutte le pompe per distribuire il mangime
int liv_acqua = A0;// livello acqua vasca rabbocco
int liv_acqua_filtro = A1;//livello acqua vasca filtro
int tem_esterna = A2;

 
long randNumber;

void setup() 
{
  lcd.init();//inizializza il display
  lcd.backlight();//accensione retroilluminazione
  
  pinMode(2, OUTPUT);// uscita relay pompa 1
  pinMode(3, OUTPUT);// uscita relay pompa 2
  pinMode(4, OUTPUT);// uscita relay pompa 3
  pinMode(5, OUTPUT);// uscita relay ventola raffreddamento aria vasca filtro
  pinMode(6, OUTPUT);// uscita relay resistenza riscaldamento vasca filtro
  pinMode(7, OUTPUT);// uscita relay pompa principale riciclo
  pinMode(8, OUTPUT);// uscita relay pompa schiumatoio per bollicine e riciclo acqua schiumatoio
  pinMode(9, OUTPUT);// ventola per creare ondine di superficie vasca acquario 
  pinMode(10, OUTPUT);// uscita relay accensione luce notturna o collegata a un transistor per accensione in pwm
  pinMode(11, OUTPUT);// uscita relay accensiione luce vasca filtro oppure collegamento a un transistor per pwm accensione crepuscolare
  pinMode(12, OUTPUT);// uscita relay pompa rabbocco vasca
  pinMode(A0, INPUT);// ingresso potenziometro livello vasca rabbocco
  pinMode(A1, INPUT);//ingresso potenziometro livello vasca filtro
  pinMode(A2, INPUT);//ingresso temperatura esterna
  randomSeed(analogRead(A0));
  
  lcd.setCursor(0, 0);
  lcd.print("inizio programma");// scritta di inizio aviamento acquario
  lcd.setCursor(0, 1);
  lcd.print("  acquario  ");
  delay(10000);
  lcd.clear();
 
  
}

void loop()  {
  int pulsante = digitalRead(pulsante);// legge lo stato del pulsante
  if (pulsante == HIGH) digitalWrite(7, LOW);// se il pulsante e premuto ferma la pompa per min
  else digitalWrite(7, HIGH);// se non premuto non ferma la pompa
  randNumber = random(1, 3);
  if (randNumber == 1) digitalWrite(pompa1, HIGH);
  else digitalWrite(pompa1, LOW);
  lcd.setCursor(0, 0);
  if (randNumber == 1);
  lcd.print(messaggio1);
  lcd.print(messaggio2);
  lcd.setCursor(0, 1);
  if (randNumber != 1);
  lcd.print(messaggio9);
  delay(1000);
  if (randNumber == 1);
  lcd.print(messaggio8);
  delay(1000);
  lcd.clear();

  if (randNumber == 2) digitalWrite(pompa2, HIGH);
  else digitalWrite(pompa2, LOW);

  if (randNumber == 3) digitalWrite(pompa3, HIGH);
  else digitalWrite(pompa3, LOW);

  delay(1000);

  
}

Ciao,

Adesso sono via di casa con scarso, per non n dire nullo, accesso ad internet. Se hai pazienza mercoledì ritorno e guardo meglio.
Quello che posso dirti al momento:
Attenzione allo "scope/visibilità" delle variabili...se ne dichiari una globale evita di chiamarne una con lo stesso nome a livelli locale.
I pin analogici non serve dichiararli come INPUT lo sono di base; se vuoi dare un nome a questi pin non fare "int a = A0" ma usa il #define.
Ti suggerisco di usare le "{}" dopo ogni if,else,while etc anche se esegui una sola riga.
Per fare un minimo di debug scrivi nel monitor seriale le stesse cose che vorresti scrivere su LCD così ti rendi conto di cosa sta succedendo.

a prima vista...

  • pulsante l'hai dichiarata sia globale che locale... cambia nome a una delle 2.

  • ci sono parecchi if che finiscono col ; sei sicuro che siano corretti? scritti così non servono a niente, perché il ; chiude subito l'if

scritto così:

if (randNumber == 1);
  lcd.print(messaggio1);
  lcd.print(messaggio2);
  lcd.setCursor(0, 1);

l'if è inutile e le righe lcd... vengono eseguite sempre.

forse volevi scrivere questo:

if (randNumber == 1) {
  lcd.print(messaggio1);
  lcd.print(messaggio2);
  lcd.setCursor(0, 1);
}

in questo modo le righe lcd... vengono eseguite solo se randNumber è uguale a 1

ciao fratt non so se ti e arrivata la mia risposta spedita quando ero in treno.
ti rispondo ora che sono arrivato in puglia.

mi verrebbe da dire azzz le parentesi graffe........

grazie per la risposta voi del forum siete davvero gentilissimi.

io ho studiato elettronica più di 35 anni fa , ma elettronica cablata non programmata come arduino.
ora sto divorando libri che ho acquistato su arduino.

sono 2 settimane che ho preso contatto con arduino e ora che ho un po di ferie le utilizzo si per stare in spiaggia ma....... divorando libri su arduino.

mi appassiona davvero tanto , e avrei voglia di imparare il suo linguaggio come una seconda lingua.

grazie ancora per la risposta ora provo a mettere le parentesi