Go Down

Topic: Ardu-Aquarium Controller v. 3.3.1 (Read 230928 times) previous topic - next topic

Mastro74

#930
Feb 05, 2017, 03:16 pm Last Edit: Feb 05, 2017, 04:32 pm by Mastro74
Lo fa, però quel comando è una richiesta di temperatura, per cui non ha senso per quello che vuoi fare. ;) Richiedi semplicemente più volte la stessa cosa. Quindi metti caso verifica la condizione, poi quello che c'è dentro richiede un'altra volta la temperatura e metti caso sia -127 la prende lo stesso.
La rpull up non credo sia il problema alla fine se si verifica solo durante quella condizione. Se no puoi provare anche a metterla da 2.2k circa mettendone una in parallelo da 4.7k a quella da 4.7k. Se si verifica solo esclusivamente in quel caso l'errore, perché non leggere la temp in una variabile dentro un if, però solo quando si verifica l'accensione dei led, escludere la lettura?
Mi vergogno a dirlo, ma ho risolto con un GOTO....... :smiley-confuse:  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:
Code: [Select]
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...
$ cd /pub; more tequila
$ who | grep -i blonde | date && (cd $HOME; chmod -f -R 755 blonde/; unzip; touch; strip; finger; mount; yes; umount; make clean); sleep

As_Needed

Se ti vede Astrobeed :D
Comunque di niente.
Ciao!
MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

Mastro74

Se ti vede Astrobeed :D
in realta è da quasi subito che il goto mi tentava, ho cercato di resistere.. :-)
cmq fin'ora non è andato in errore...
$ cd /pub; more tequila
$ who | grep -i blonde | date && (cd $HOME; chmod -f -R 755 blonde/; unzip; touch; strip; finger; mount; yes; umount; make clean); sleep

gpb01

#933
Feb 05, 2017, 04:38 pm Last Edit: Feb 05, 2017, 04:38 pm by gpb01
in realta è da quasi subito che il goto mi tentava, ho cercato di resistere.. :-)
... faccio finta di non vedere ... perché a uno che programma così sono tentato di cancellare l'account !  :smiley-yell: :smiley-yell: :smiley-yell:

Guglielmo
Search is Your friend ... or I am Your enemy !

As_Needed

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

Guglielmo
:D
MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

Etemenanki

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

(:P :D :D :D)
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

Francesco67

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.

Mi vergogno a dirlo, ma ho risolto con un GOTO....... :smiley-confuse:  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:
Code: [Select]
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:


Code: [Select]
float LeggiSonda(DeviceAddress deviceAddress)
{
    float tempC;

    while ((tempC = sensors.getTempC(deviceAddress)) == -127)
        ;

    return tempC;
  
}// End LeggiSonda

testato

#937
Jun 30, 2017, 08:56 pm Last Edit: Jun 30, 2017, 08:56 pm by testato
Bello  :)
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Mastro74

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



Grazie!, appena posso provo.
$ cd /pub; more tequila
$ who | grep -i blonde | date && (cd $HOME; chmod -f -R 755 blonde/; unzip; touch; strip; finger; mount; yes; umount; make clean); sleep

Mastro74

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
$ cd /pub; more tequila
$ who | grep -i blonde | date && (cd $HOME; chmod -f -R 755 blonde/; unzip; touch; strip; finger; mount; yes; umount; make clean); sleep

Mastro74

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

#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);

}
$ cd /pub; more tequila
$ who | grep -i blonde | date && (cd $HOME; chmod -f -R 755 blonde/; unzip; touch; strip; finger; mount; yes; umount; make clean); sleep

Mastro74

$ cd /pub; more tequila
$ who | grep -i blonde | date && (cd $HOME; chmod -f -R 755 blonde/; unzip; touch; strip; finger; mount; yes; umount; make clean); sleep

Mastro74

#942
Jul 28, 2017, 05:44 pm Last Edit: Jul 28, 2017, 06:51 pm by Mastro74
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?

$ cd /pub; more tequila
$ who | grep -i blonde | date && (cd $HOME; chmod -f -R 755 blonde/; unzip; touch; strip; finger; mount; yes; umount; make clean); sleep

Francesco67

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.


Mastro74

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..


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
$ cd /pub; more tequila
$ who | grep -i blonde | date && (cd $HOME; chmod -f -R 755 blonde/; unzip; touch; strip; finger; mount; yes; umount; make clean); sleep

Go Up