Ardu-Aquarium Controller v. 3.3.1

Se ti vede Astrobeed :smiley:
Comunque di niente.
Ciao!

As_Needed:
Se ti vede Astrobeed :smiley:

in realta è da quasi subito che il goto mi tentava, ho cercato di resistere.. :slight_smile:
cmq fin'ora non è andato in errore...

Mastro74:
in realta è da quasi subito che il goto mi tentava, ho cercato di resistere.. :slight_smile:

... faccio finta di non vedere ... perché a uno che programma così sono tentato di cancellare l'account ! :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

Guglielmo

gpb01:
... faccio finta di non vedere ... perché a uno che programma così sono tentato di cancellare l'account ! :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

Guglielmo

:smiley:

... povero GOTO ... ma che vi ha fatto, che lo odiate tanto ? ... Kattivi :cry:

(:stuck_out_tongue: :smiley: :smiley: :D)

Salve,

effettuando delle ricerche sulla libreria menwiz, mi sono imbattuto in questo topic, che, pur non avendo un acquario, mi ha notevolmente interessato per il continuo confrontarsi dei partecipanti.
Volevo dare un mio piccolo contributo.

Mastro74:
Mi vergogno a dirlo, ma ho risolto con un GOTO....... :confused: 8) 8)
e SEMBRA funzionare..
ho provato con un while, ma non funzionava, con il goto se la lettura è errata ripete la scansione della sonda.
in piu per semplificare il codice ho creato una funzione:

float LeggiSonda(DeviceAddress deviceAddress) 

{
 leggi:
    float tempC = sensors.getTempC(deviceAddress);
    if (tempC == -127){
      goto leggi;
    }
    else {return tempC;}
 
}// End LeggiSonda



grazie As_Needed
se poi qualcuno ha soluzioni piu eleganti...

Se vuoi eliminare il famigerato GOTO, puoi implementare la funzione LeggiSonda nel seguente modo:

float LeggiSonda(DeviceAddress deviceAddress) 
{
    float tempC;
	
    while ((tempC = sensors.getTempC(deviceAddress)) == -127)
        ;
		
    return tempC;
   
}// End LeggiSonda

Bello :slight_smile:

Francesco67:
Se vuoi eliminare il famigerato GOTO, puoi implementare la funzione LeggiSonda nel seguente modo:

Grazie!, appena posso provo.

Rieccomi su questo thread, nonostante sia fermo, io vado avanti seppur mooolto lentamente:
Finalmente ho avuto tempo di terminare il modulo relays.
Siccome ho necessita di provarlo prima su un'altro arduino, senza il resto dell'ardware avrei bisogno di uno sketch apposito.
avete per caso del codice adatto, o conoscete pagine o tread del fourum da dove prendere spunto?
per ora ho trovato solo Ardupower, il codice è compatibile?
Nel frattempo continuo a cercare...

Grazie in anticipo.
Andrea

Ho risolto, grazie lo stesso: ho copincollato pezzetti del codice di arduarium, se puo servire eccolo:

#include <Wire.h>
#include <OneWire.h>
#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);


byte Linea1 = 0;
byte Linea2 = 1;
byte Linea3 = 2;
struct DatiLuci              //I valori di Pos, vengono usati per determinare l'indirizzo di memoria in cui vengono registrati gli orari
  { 
    boolean StatoPower;       //Tiene lo stato dell'alimentazione della linea
    
    byte NrPin;           //Contiene il numero di pin delle singole linee
    byte Powerline;         //Contiene l'indirizzo del pin del pcf che comanda la scheda relé
  };
  struct DatiLuci Plafo[3];

////////////////////////////////////////////////////
// Dichiarazioni per periferiche collegate ai PCF //
////////////////////////////////////////////////////


byte riscaldatore;
const int keyboard = 0x39; //PCF8574AP A0 VCC A1,A2 GND
const int schrele = 0x3A;  //PCF8574AP A0 GND, A1 VCC, A2 GND

// Indirizzi dei pin del PCF dedicato alla scheda relé
const byte rele1 = 0x1;  //Termostato
const byte rele2 = 0x2;  //Alimentazione linea 1 Luci
const byte rele3 = 0x4;  //Alimentazione linea 2 Luci
const byte rele4 = 0x8;  //Alimentazione linea 3 Luci
/*const byte rele5 = 0x10; // Per gli usi futuri
const byte rele6 = 0x20;
const byte rele7 = 0x40;
const byte rele8 = 0x80;*/

byte read_pcf(int indirizzo)
  { byte statoIOpcf;
    Wire.beginTransmission(indirizzo); // prima lettura per resettare il pcf ed attivare il piedino int
    Wire.requestFrom(indirizzo, 1);
      if(Wire.available())
        statoIOpcf = Wire.read();
    Wire.endTransmission();
    return statoIOpcf;
  }


void setpinpcf(int indirizzo, byte pin, byte statopin)
  { byte statoschrele = read_pcf(indirizzo);

    if(statopin == HIGH)
      statoschrele = statoschrele | pin;
    else
      statoschrele = statoschrele & ~pin;

    Wire.beginTransmission(indirizzo);
    Wire.write(statoschrele);
    Wire.endTransmission();
  }

void setup() {
  Serial.begin(9600);
  Wire.begin();
  // put your setup code here, to run once:
  // inizializzazione del PCF che comanda la scheda relé
    Wire.beginTransmission(schrele);
    Wire.write(255);
    Wire.endTransmission();

    Plafo[0].Powerline = rele2;
    Plafo[1].Powerline = rele3;
    Plafo[2].Powerline = rele4;
    

}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println(F("Loop"));
setpinpcf(schrele, rele1, 0);
Serial.println(F("R1 0"));
delay(1000); 
setpinpcf(schrele, rele2, 0);
Serial.println(F("R2 0"));
delay(1000); 
setpinpcf(schrele, rele3, 0);
Serial.println(F("R3 0"));
delay(1000); 
setpinpcf(schrele, rele4, 0);
Serial.println(F("R4 0"));
delay(1000); 
setpinpcf(schrele, rele1, 1);
Serial.println(F("R1 1"));
delay(1000); 
setpinpcf(schrele, rele2, 1);
Serial.println(F("R2 1"));
delay(1000); 
setpinpcf(schrele, rele3, 1);
Serial.println(F("R3 1"));
delay(1000); 
setpinpcf(schrele, rele4, 1);
Serial.println(F("R4 1"));
delay(1000); 

}

Mastro74:
Grazie!, appena posso provo.

Perfetto! GRAZIE!!

Dopo sempre tanto tempo, sono riuscito finalmente ad ordinare e far realizzare il mio primo PCB: il modulo relè.
Ho leggermente modificato quello di Rici, aggiungendo tra l'altro una porta USB per collegamento ad Arduino.
Quando l'ho collegato non funzionava, per fortuna ho visto che mancavano soltanto due resistenze di pullup su SDA ed SCL. ho notato che nell' ultimo schema di Rici, mancano, invece c'erano in vecchio schema che per fortuna salvai a suo tempo.
Non avendo le resistenze da 1,5k come da schema, ne ho messe due da 1k.
Ovviamente va alla grande.
Non penso che la differenza delle resistenze sia importante, però date le mie conoscenze scarse di elettronica se qualcuno ha da dire dica.

ps: Rici, ma hai completamente abbandonato?

Mastro74:
Non avendo le resistenze da 1,5k come da schema, ne ho messe due da 1k.
Ovviamente va alla grande.
Non penso che la differenza delle resistenze sia importante, però date le mie conoscenze scarse di elettronica se qualcuno ha da dire dica.

Se ricordo bene, per collegare la scheda relè con il bus I2C si usa l'integrato PCF8574, alimentandolo a 5V. In tal caso i resistori da 1Kohm sono sottodimensionati. Considerato che il PCF8574 opera in standard mode, la specifica del bus I2C richiede per i resistori di pull-up un valore minimo di 1,5Kohm, come puoi vedere dalla figura 42, estrattta dalla specifica, che, per ogni modalità, riporta il valore minimo dei resistori di pull-up al variare di VDD. Nel nostro caso, VDD = 5V e mode = Standard (diagramma 1), per cui Rp(min) = 1,5Kohm.

Il valore massimo dei resistori di pull-up, come vedi dalla figura 41, invece, dipende, oltre che dalla modalità, anche dalla capacità del bus, quindi dalla lunghezza delle linee, dal numero e tipo di dispositivi connessi. Infatti, a parità di capacità del bus, all'aumentare della resistenza di pull-up, aumenta il tempo di risalita del segnale digitale, che se supera la soglia fissata dallo standard del bus I2C, può determinare la non corretta interpretazione dei segnali/dati.

Francesco67:
Se ricordo bene, per collegare la scheda relè con il bus I2C si usa l'integrato PCF8574, alimentandolo a 5V. In tal caso i resistori da 1Kohm sono sottodimensionati. Considerato che il PCF8574 opera in standard mode, la specifica del bus I2C richiede per i resistori di pull-up un valore minimo di 1,5Kohm, come puoi vedere dalla figura 42, estrattta dalla specifica, che, per ogni modalità, riporta il valore minimo dei resistori di pull-up al variare di VDD. Nel nostro caso, VDD = 5V e mode = Standard (diagramma 1), per cui Rp(min) = 1,5Kohm.

Giusto. quindi cosa si rischia? solo errori in lettura scrittura dello stato dei relè? alla ciabatta per ora non ho attaccato nulla, sto ancora testando e sistemando il codice..

Francesco67:

Il valore massimo dei resistori di pull-up, come vedi dalla figura 41, invece, dipende, oltre che dalla modalità, anche dalla capacità del bus, quindi dalla lunghezza delle linee, dal numero e tipo di dispositivi connessi. Infatti, a parità di capacità del bus, all'aumentare della resistenza di pull-up, aumenta il tempo di risalita del segnale digitale, che se supera la soglia fissata dallo standard del bus I2C, può determinare la non corretta interpretazione dei segnali/dati.

Chiarissimo.
per il collegamento I2C ho usato un cavo usb maschio maschio, ricavato da due spezzoni di cavi vecchi, xchè in giro ho trovato solo cavi di 2mt e mezzo, ed io lo cerco di 1mt o 1,5mt, quindi la schermatura non è a massa, o probabilmente lo sono le due meta e solo circa due o tre cm non lo sono (non ho ancora capito se la schermatura va a massa da entrambi i lati)
fin'ora non ho avuto problemi neanche facendo girare uno sketch che accendeva e spegneva tutti i rele in un ciclo continuo.

ps:
In ogni caso il mio post era principalmente per sottolineare la mancanza delle resistenze nello schema di Rici

Ciao a tutti
Dopo un lungo periodo sono riuscito a realizzare questo splendido progetto ma ho un piccolo problema con la lettura Delle temperature. Ogni tanto mi dà un valore negativo -51.50 e a volte anche -51.25.
Dopo svariate volte che appare questo errore il sistema si blocca.
Scusate per gli errori ma sto scrivendo dal telefono.
Qualcuno mi può aiutare?

>elleeffeimpianti: ... nonostante tu sia un utente di vecchia data, NON c'è un tuo post di presentazione :confused: , per cui ... nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO (... che, in questi anni, è stato aggiornato) ... Grazie. :slight_smile:

Guglielmo

Buongiorno a tutti
Scusate ancora, ma pensavo proprio di essermi già presentato, in effetti ho avuto delle difficoltà nel postare la presentazione, ogni volta che premevo post mi ritornava nella schermata delle presentazioni, ma la mia presentazione non veniva pubblicata. Comunque adesso dovrei avercela fatta ed in teoria posso chiedervi un grosso aiuto che mi perseguita ormai da settimane.
Quindi comincio a descrivervi il progetto che ho realizzato grazie a Rici:
a differenza del progetto iniziale, ho usato Arduino Mega e non Uno, ho maggiorato le uscite pwm da 3 a 4, le altre le uso per azionare osmosi inversa e co2.
Ho implementato il progetto con accensione e spegnimento di led quando apro la porta del mobile ed un carico automatico dell’acqua azionato da due sensori uno di minima e uno di massima, non ho voluto usare il sensore di livello proposto da Rici.
Ho provato a cambiare la lettura della sonda di temperatura con un sensore solo, spero che lo sketch sia corretto!!!!
Inoltre ho inserito la lettura del ph con schedina acquistata in rete (progetto da rivedere perché se la sonda è immersa in un bicchiere funziona perfettamente, quando invece la inserisco in vasca i valori sballano completamente, sicuramente ci saranno problemi di impedenza)

Detto questo mi ritrovo, adesso, i seguenti problemi:
continua a comparire, solo durante la fase di accensione delle luci, l’errore della sonda -127.00 con la configurazione attuale, mentre con lo schema di due sonde, come il progetto di Rici mi appaiono addirittura tre errori -51.50, -51.25, -51.15
Inoltre, quando tolgo tensione ai circuiti e alimentando nuovamente il tutto, il settaggio della temperatura ritorna a 5.5 e le ipostazioni dei parametri della linea con pwm 4 sono sballati 48:00 ora inizio e ora fine 21:488 accendendo la luce al 24%.
Ho collegato la sonda al piedino 4 di Arduino Mega che è un ingresso pwm, è giusto?
Su Arduino 1 è collegata così!!!
Le mie considerazioni sono le seguenti:
il problema della sonda è collegato in qualche maniera sicuramente alla pwm4 e anche inserendo il famigerato GOTO continua a dare errori.
Spero siate clementi e possiate darmi un aiutino, sono veramente un disastro!!!

un'ultima cosa, volevo allegarvi lo sketch, ma non trovo il tasto per allegarlo

ho trovato come allegare lo sketch, eccolo, scusate ancora ma sono un disatro :slight_smile: :slight_smile:

ACQUARIO_LUCA_2016_con_PH_R14.zip (16.7 KB)

elleeffeimpianti:
Detto questo mi ritrovo, adesso, i seguenti problemi:
continua a comparire, solo durante la fase di accensione delle luci, l’errore della sonda -127.00 con la configurazione attuale, mentre con lo schema di due sonde, come il progetto di Rici mi appaiono addirittura tre errori -51.50, -51.25, -51.15

Se cerchi a ritroso (non molte pagine credo) trovi la soluzione, io ho avuto lo stesso problema col -127.00

Si ho provato ad usare la funzione goto, ma niente, non funziona.
Ho allegato il codice in modo che voi esperti mi indicate se è stato usato in maniera corretta.