Buongiorno,
sperando che la sezione sia giusta, sono qui a presentarvi il mio ultimo progetto: Datalogger di pressione.
Apro questo post per tenere traccia dei miei progressi e ricevere consigli.
La realizazione si tratta di un registratore atto a tenere traccia del valore di pressione e temperatura (in modo da emulare un manodensostato) di interruttori AT
Come da regolamento non verrà trattata la parte di installazione in impianto, ma solo la parte riguardante la bassa tensione percui a valle del convertitore isolato 110VDC -> 24VDC (successivamente regolati in 5VDC).
Questo circuito non avrà nessuna funzione salvavita/protezione (apertura interruttore in caso di bassa pressione ecc), ma solo di monitoraggio per successive analisi.
Sarà galvanicamente isolato da qualsiasi potenziale pericoloso
HW as is:
- Arduino nano
- SD shield (Adattatore per SD) + microSD 4Gb
- DHT22 (Sensore di temperatura)
- DS3231 (RTC)
- ADS1115
- Potenziometro (atto a simulare i valori del manodensostato)
- Relè (Non in foto)
HW to be:
Mantenendo l'interfaccia IDE di arduino si va a rimuovere tutte le componenti superflue trasformando il tutto in un circuito stampato SMD con componenti solo da un lato.
Al momento sono ancora in fase di selezione dei componenti riguardanti la parte di alimentazione e la parte di misura di temperatura (sto valutando una termocoppia da posizionare al'esterno del quadro).
Software as is: al momento si tratta solamente di qualche linea di codice mal scritta e mal commentata atta a controllare se effetivamente tutti i componenti funzionano.
#include <DHT.h>
#include <DHT_U.h>
#include <ADS1115_WE.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include "RTClib.h"
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
#define I2C_ADDRESS 0x48 //definisce indirizzo ADC
const int PIN_Temp = 7; //definisce pin per il sensore di temoperatura
const int PIN_Int = 5; //definisce pin per Allarme RTC DS3231
const int CS = 4; //Definisce il pin per il CS
const int LED_PIN = 13; //led interno arduino
DHT dht(PIN_Temp, DHTTYPE);
RTC_DS3231 rtc;
ADS1115_WE adc = ADS1115_WE(I2C_ADDRESS);
void setup() {
pinMode(LED_PIN, OUTPUT); //setta il led come uscita
digitalWrite(LED_PIN, HIGH);//accende il led
Serial.begin(9600); //avvia la seriale a 9600
while (!Serial) { } ; // wait for serial port to connect. Needed for native USB port only
while (!SD.begin(CS)) //attende che la SD si inizializzi
{
Serial.println("Card failed, or not present");
Serial.flush();
delay(3000);
}
Serial.println("card initialized.");
while (!rtc.begin()) //aspetta che RTC Risponda
{
Serial.println(("Unable to find DS3231MM. Checking again in 3s."));
Serial.flush();
delay(3000);
}
Serial.println("RTC OK");
dht.begin();
delay(100);
Serial.println("DHT22 OK");
Wire.begin();
while (!adc.init()) //aspetta che ADC Risponda
{
Serial.println(("Unable to find ADC. Checking again in 3s."));
Serial.flush();
delay(3000);
}
}
void loop() {
DateTime now = rtc.now();
File dataFile = SD.open("datalog.txt", FILE_WRITE);
adc.setVoltageRange_mV(ADS1115_RANGE_6144); //setta lettura +/- 6.114v
adc.setMeasureMode(ADS1115_SINGLE); //single shot
if (dataFile) {
dataFile.print(now.day(),DEC);
dataFile.print("/");
dataFile.print(now.month(),DEC);
dataFile.print("/");
dataFile.print(now.year(),DEC);
dataFile.print(" ");
dataFile.print(now.hour(),DEC);
dataFile.print(".");
dataFile.print(now.minute(),DEC);
dataFile.print(" ");
delay(2000);
dataFile.print(dht.readHumidity());
dataFile.print("% ");
dataFile.print(dht.readTemperature());
dataFile.print("°C ");
float voltage = 0.0;
voltage = readChannel(ADS1115_COMP_0_GND);
dataFile.print(voltage);
dataFile.println("V");
dataFile.close();
Serial.println("scrittura file completata");
}
else {
Serial.println("error opening datalog.txt");// if the file isn't open, pop up an error:
}
delay(100);
Serial.println("tutto ok");
digitalWrite(LED_PIN, LOW);
abort();
}
float readChannel(ADS1115_MUX channel) {
float voltage = 0.0;
adc.setCompareChannels(channel);
adc.startSingleMeasurement();
while(adc.isBusy()){}
voltage = adc.getResult_V(); // alternative: getResult_mV for Millivolt
return voltage;
}
Software to be: il software dovrà cosi comportarsi
Inizializazione -> Set allarme ds3231 -> Sleep ........Interupt generato dal ds3231 -> lettura e conversione valori di pressione e temperatura -> scrittura su SD -> set nuovo allarme -> Sleep ..... Interupt -> lettura ecc
Includera anche qualche led per eseguire un primo debug visivo e Watchdog per evitare il blocco del micro.
Spero di riuscire a compattare il tutto all'interno del 328P, in caso contrario passerò al 32U4.
L'estrazione dei dati avverà con lo spegnimento del circuito e l'estrazione della SD. Una volta inserita nel PC tramite EXCEL i valori verranno convertiti in forma grafica per la consultazione.
Mi potete confermare che passare dal 328P al 32U4 sarà quasi "indolore" ? eventualmente consgiliate un altra tipologia di micro ?
EDIT: Controllando le specifiche ho visto che il 328P e il 32U4 hanno la stessa memoria, a questo punto dovrei passare ad un 2560, la domanda rimane invariata: é tanto il lavoro (SW + HW) per implementare un 2560 al posto di un 328P
Quale è il miglior modo per "fare perdere" tempo ad arduino in attesa del interupt (Circa 1 ogni ora), ritengo inproponibile usare delay() ?
Come faccio a compattare le immagini ? non ho trovato nulla a riguardo.....
Spero di non avervi annoiato con questa lunga presentazione
Saluti
ThEnGI (Davide)