Buonasera ragazzi, oggi vi chiedo una mano ad ottimizzare il mio codice, premetto che alcune cose non sono state testata (sd card) e quindi chiedo perdono per eventuali errori. Il problema sta nel fatto che le variabili G occupano 89% di memoria, lasciando cosi una situazione ambigua. Le possibilità sono 3 a mio avviso :
1---->eliminare la libreria sd card ed usare la eeprom (ha lo svantaggio che a causa dell'eccessivo accesso la memoria si "consuma")
2---->ottimizzare il codice in termini di variabili/algoritmi ( sarebbe necessaria una spiegazione più avanzata di quello che voglio fare )
3----->idea folle... mettere in comunicazione 2 Arduini con una software serial e con uno eseguire l'algoritmo e con l'altro leggere/scrivere i file sulla sd.
ciò che non si capisce dal codice è la seguente cosa:
io voglio mettere in high la "valvola" ogni tot tempo, ma a causa di una serie di cose Arduino potrebbe bloccarsi e qui entra in gioco il WD che riavvia tutto, ora se Arduino si dovesse bloccare almeno una volta prima di questo tot tempo... succede che la "valvola" non andrà in high, o meglio andrà in high (se non si blocca) dopo tot.tempo+t_v con t_v il tempo passato prima del primo blocco. Allora ho pensato che se salvassi il t_v anche dopo il riavvio della scheda (dovuta a WD) usare dopo per ripristinare i tempi e mettere il high la "valvola" dopo esattamente quel tot.tempo, come se non fosse successo nulla... spero di essere stato chiaro.
// Arduino con pid+sht31+dimmer+lcd+ricezione seraile
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <RBDdimmer.h>
#include <Arduino.h>
#include "Adafruit_SHT31.h"
#include <avr/wdt.h>
#include <PID_v1.h>
#include <SD.h>
#define dimmerPin 3
#define ventola 7
#define vapore 8
#define valvola 9
#define ONE_WIRE_BUS 4
#define CS_pin 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sonda(&oneWire);
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
dimmerLamp dimmer(dimmerPin);
Adafruit_SHT31 sht3x_s = Adafruit_SHT31();
Adafruit_SHT31 sht3x_i = Adafruit_SHT31();
double Setpoint = 37.7, Output, t1, t2, h_s, h_i, Sp_s = 80;;
PID cont_t(&t2, &Output, &Setpoint, 1000, 0, 0, DIRECT);
float conv_t;
unsigned long tmr,t, s, c;
boolean frist = true;
File myFile;
void setup() {
wdt_disable();
Serial.begin(9600);
sonda.begin();
sonda.setResolution(12);
delay(500);
sht3x_s.begin(0x44);
sht3x_i.begin(0x45);
delay(500);
lcd.begin(20, 4);
delay(500);
dimmer.begin(NORMAL_MODE, ON);
cont_t.SetMode(AUTOMATIC);
delay(500);
pinMode(ventola, OUTPUT);
pinMode(valvola, OUTPUT);
pinMode(vapore, OUTPUT);
pinMode(CS_pin, OUTPUT);
delay(500);
tmr = millis();
SD.begin(CS_pin);
wdt_enable(WDTO_8S);
delay(1000);
myFile = SD.open("test.txt", FILE_READ);
if (myFile) {
while (myFile.available()) {
c = myFile.read();
}
myFile.close();
}
}
void loop() {
if (frist == true){
s= millis() - t + c ;
frist = false;
}else{
s= millis() - t ;
}
h_s = sht3x_s.readHumidity();
h_i = sht3x_i.readHumidity();
sonda.requestTemperatures();
t1 = sonda.getTempCByIndex(0);
t2 = sonda.getTempCByIndex(1);
cont_t.Compute();
conv_t = map(Output, 0, 255, 13, 90 );
myFile = SD.open("test.txt", FILE_WRITE);
if (myFile) {
myFile.println(s);
myFile.close();
}
if (h_s >= Sp_s && conv_t == 13 ) {
digitalWrite(valvola, LOW);
digitalWrite(ventola, LOW);
digitalWrite(vapore, LOW);
dimmer.setState(OFF);
}
if (h_s < Sp_s && conv_t == 13) {
digitalWrite(valvola, LOW);
digitalWrite(ventola, HIGH);
digitalWrite(vapore, HIGH);
dimmer.setState(OFF);
if( s > 1800000){
t = millis();
digitalWrite(valvola, HIGH);
digitalWrite(ventola, LOW);
digitalWrite(vapore, LOW);
dimmer.setState(OFF);
delay(5000);
}
}
wdt_reset();
if (h_s >= Sp_s && conv_t != 13 ) {
digitalWrite(valvola, LOW);
digitalWrite(vapore, LOW);
digitalWrite(ventola, HIGH);
dimmer.setState(ON);
dimmer.setPower(conv_t);
}
wdt_reset();
if (h_s < Sp_s && conv_t != 13) {
digitalWrite(valvola, LOW);
digitalWrite(ventola, HIGH);
digitalWrite(vapore, HIGH);
dimmer.setState(ON);
dimmer.setPower(conv_t);
if( s > 1800000){
t = millis();
digitalWrite(valvola, HIGH);
digitalWrite(ventola, LOW);
digitalWrite(vapore, LOW);
dimmer.setState(OFF);
delay(5000);
}
}
wdt_reset();
if (millis() - tmr > 2000) {
// Serial.print(h_s);
// Serial.print(" ");
// Serial.print(t2);
// Serial.print(" ");
// Serial.print(h_i);
// Serial.print(" ");
// Serial.println(80);
// Serial.print(" ");
//Serial.print(37.7);
// Serial.print(" ");
// Serial.print(50);
// Serial.print(" ");
// Serial.print(t1);
// Serial.print(" ");
tmr = millis();
lcd.setCursor(0,0); lcd.print("Arduino ON ");lcd.print("T_i:"); lcd.print(t1);
lcd.setCursor(0, 1); lcd.print("T_s:"); lcd.print(t2);
lcd.setCursor(9, 1); lcd.print(" P_c: "); lcd.print(conv_t);
lcd.setCursor(0, 2); lcd.print("U_s:"); lcd.print(h_s);
lcd.setCursor(9, 2); lcd.print(" Sp: "); lcd.print(Sp_s);
lcd.setCursor(0, 3); lcd.print("U_i:"); lcd.print(h_i);
lcd.setCursor(9, 3); lcd.print(" ");
}
wdt_reset();
}