Ardu-Aquarium Controller v. 3.3.1

Ok, fingero' di crederci (ma solo per farti un piacere :stuck_out_tongue: :D)

riciweb:
Rimane il fatto che alla fine faccio cmq. come mi pare ]:smiley: ]:smiley: ]:smiley:

E ci mancherebbe pure il contrario :wink: XD

oddio mi avete fattoscompisciare :grin:

Arrieccomi!!!

allora, a casa avevo ho un DS18B20 waterproof (che poi ho scoperto essere il sensore che usate), e l'ho usato senza la libreria dallas, ma solo quella OneWire. Allego il codice, magari vi a risparmiare qualche prezioso byte in flash: funziona in modalità parassita, ovvero GND e VCC collegati a GND, e il cavo dati sul pin 9 + pull-up di 4,7K (io uso 2 in serie da 2.2K, quindi 4.4K, senza problemi), dovrebbe funzionare con qualsiasi risoluzione, ma lascia quella di default (12bit), che permette una lettura ogni 750ms al massimo.

Notare che si tratta di una versione rivista di quella per il ds18S20 (notare la S) che è presente sul playground

#include <OneWire.h>

/* DS18B20 Temperature chip i/o */

OneWire  ds(9);  // on pin 9
#define MAX_DS1820_SENSORS 2
byte addr[MAX_DS1820_SENSORS][8];
void setup(void) 
{
  Serial.begin(9600);
  delay(1000);

  Serial.println("DS18B20 Test");

  for (int i=0;i<MAX_DS1820_SENSORS;i++){
    if (!ds.search(addr[i])) 
    {
      Serial.println("No more addresses.");
      ds.reset_search();
      delay(250);
      return;
    }
  }

}
int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
char buf[20];

void loop(void) 
{
  byte i, sensor;
  byte present = 0;
  byte data[9];

  for (sensor=0;sensor<MAX_DS1820_SENSORS;sensor++)
  {
    if ( OneWire::crc8( addr[sensor], 7) != addr[sensor][7]) 
    {
      Serial.println("CRC is not valid");
      return;
    }

    if ( addr[sensor][0] != 0x28) 
    {
      Serial.print("Device is not a DS18B20: ");
      Serial.println(addr[sensor][0], HEX);
      return;
    }

    ds.reset();
    ds.select(addr[sensor]);
    ds.write(0x44,1);         // start conversion, with parasite power on at the end

    delay(1000);     // maybe 750ms is enough, maybe not
    // we might do a ds.depower() here, but the reset will take care of it.

    present = ds.reset();
    ds.select(addr[sensor]);    
    ds.write(0xBE);         // Read Scratchpad

    for ( i = 0; i < 9; i++) 
    {           // we need 9 bytes
      data[i] = ds.read();
    }

    LowByte = data[0];
    HighByte = data[1];
    TReading = (HighByte << 8) + LowByte;

    Serial.print("Temperaura: ");
    Serial.println(TReading/16.0);    
    
    Serial.print("Configuration: ");
    Serial.println(data[4], BIN);
  }
}

Grazie Lesto,
appena ho un minuto ci gioco un pò.

Riccardo

lesto ho fatto una prova per capire se ne vale la pena, il tuo sketch occupa 6KB, usando invece la libreria dallas, ed in modalita' async (che visto parliamo di un blocco di quasi un secondo ritengo sia utile in ogni contesto), occupa solo 1KB in piu', oltre ad avere uno sketch pulito e semplice

per lo sketch il problema non è la pulizia, essendo facilemente riscrivibile in classe/funzioni separate. Nota che il mio codice può leggere MAX_DS1820_SENSORS sensori, non so se è bloccante (credo di sì)

il tuo non e' bloccante perche' togliendo il delay lo sketch continua (logicamente resti su errore 85, ma quello e' un altro discorso)

non so, le read nel for non sono bloccanti? o esiste qualcosa tipo timeout? in tal caso non ho gestito il fatto di accorgermi del valore ritornato inatteso (che immagino sia il codice 85 che nomini). E quindi a mio parere il mio codice non è adatto. Tra l'altr oora qul codice è in parallelo con una sonda K (da calibrare), ed oggi volevo iniziare a salvare i valori su SD.. peccatto che non ho transistor NON sd e nessin diodo tranne gli zener... mannaggia a me.

no, nel for non ci sono blocchi, perche' e' rnomale sia cosi'
e'il ds.reade (0x44) che e' bloccante se non si usa la funzione Async, quindi il +85C a te appare perche' non aspetti i 750ms necessari per la lettura (res 12bit)
Eliminando il delay infatti fai ripartire a palla, non essendo appunto bloccante il codice, il comando 0x44

Come procede il progetto?

Io non lo so perché non.lo sto facendo, però sto lavorando ad un progetto do motivo e mi ero intromesso visto che uso alcuni sensori uguali. Sul 18b20 ti posso confermare che la cosa migliore è usare l ultima versione Dallas in modalità async, per un solo K in più hai un lavoro funzionante e testato da tempo

Ciao a tutti,
anche io sto preparando una centralina di gestione per l'acquario. Ho seguito una strada un po' diversa ed infatti non ho usato gpio expander ma degli shift register anche per pilotare il display LCD. Ho praticamente sfruttato tutte le risorse hardware dell' Atmega e mi manca solo lo sbroglio del pcb XD. Ho già preparato la scheda relè anche se è pronta una revisione... ho modificato le piste lato 220Volt (le ho fatte più grandi) e ho deciso di usare almeno una presa sul normalmente chiuso dei relè dove collegare la pompa.
Infatti in acquario il sistema di filtrazione è l'unica cosa in funzione 24h/24 7gg./7. Lavorando col NC eviterò spegnimenti anche quando la centralina dovesse per qualche motivo impallarsi o andare giù. Nel mio acquario fare innescare la pompa è abbastanza fastidioso e se sono fuori casa potrebbe essere un vero problema.
Volevo aggregarmi comunque al progetto perché alcune esperienze saranno comuni come la necessità di leggere i valori chimici dell'acqua (vedi ph). Volevo infatti chiedervi :

  1. Avrei intenzione di usare questa scheda http://www.robot-italy.com/it/1130-ph-orp-adapter.html col relativo elettrodo. Qualcuno ha avuto modo di provarla?
  2. Come dicevo prima ho esaurito tutte le risorse Hw dell'atmega, la ram ormai è poca e faccio ormai fatica ad implementare altre funzioni... avrei intenzione, per un futuro aggiornamento, usare due ATmega uno da dedicare al Display, tastiera, temperatura stanza, buzzer, e l'altro alle funzioni di gestione dell'acquario. Sono indeciso se utilizzare I2C o una seriale software (dimenticavo la mia centralina usa la seriale per collegarsi con Xbee al PC). Cosa mi consigliate? E chiaro che usare Gpio expander non risolvono il problema di risorse come RAM e Flash.

Grazie in Anticipo a tutti

Passa alla MEGA.

Il problema è come fare la versione stand-alone?

lexip:
Il problema è come fare la versione stand-alone?

Ciò non toglie che tu non la possa usare 8)
Che funzioni hai gA implementato nel tuo progetto?

Ciao Riccardo

lexip:
Il problema è come fare la versione stand-alone?

non e' obbligatorio farla, invece di fare uno standalone fai una shield

non e' obbligatorio farla, invece di fare uno standalone fai una shield

e' chiaro... :astonished: ma ingombri e costi maggiori! $) Metti che ad ogni progetto metto un Arduino Mega non ne veniamo più fuori!
ma è così impossibile usare due Arduino Uno...?

Che funzioni hai già implementato nel tuo progetto?

Misura Tempertura stanza, Misura Temperatura H20, Eventuale PH (da implemenatre), Eventuale Aereatore o Pompa rabbocco, Luci ON/OFF (il timer e configurabile da PC), Effetto alba tramonto e simulazione luce lunare (con delle semplici strip led), Termoriscaldatore con isteresi, Allarmi per alta/bassa temperatura e per Ph fuori range, 3 tasti su display per modificare i Set-point velocemente, sempre con gli stessi tasti è possibile mettere in manutezione/cambio acqua (si stacca pompa, luci e termoriscaldatore). Comunicazione con PC per configurazione e acquisizione dati.

il discorso e' diverso secondo me, se stai facendo un progetto tuo personale, che farai in una, due, anche tre copie, il costo della singola Mega e' basso perche' se vuoi comprare tutti i componenti sciolti, piu' spese postali, piu' tempo per fare il pcb, sempre che ti venga bene, piu' tempo per il montaggio (sei capace di saldare il micro della mega ?) benedici mille volte la mega gia' pronta.
dall'altro lato invece, se stai facendo un progetto che andra' in produzione allora il pcb e se vuoi anche il montaggio, lo farai fare a ditta esterna, e quindi non ci sono problemi per fare la mega.
Poi se vuoi puoi voler fare una mega standalone per lo sfizio di farla, ed allora provaci, non e' impossibile, e' solo difficile e ti costera' piu' della mega stessa, perche' per saldare quella roba ad esempio e' necessario un solder mask, se mandi in stampa a service professionali poche copie di pcb per avere il solder mask ed altro, ti costa piu' della mega

Altrimenti se vuoi restare sul DIP, puoi vedere se ti basta l'Atmega1284P...

altrimenti esistono tanti siti tipo batchPBC e altri che in pratica ti fanno il PBC, però per evitare di farti pagare una piasta aspettano abbastanza ordini.. in generale in 2 o 3 settimane hai il tuo PCB a casa, però poi a saldare devi fare da solo.