Salve a tutti vi spiego in breve cosa ho fatto ed il problema che ho.
Il programmino è una base di partenza che ho scritto e sto testando, ed ha la funzione di gestire delle utenze, e cioè, io ho dei sensori capacitivi, che al momento dell'abilitazione, da programma mi chiudono un relè e nello stesso tempo mi fanno il passaggio di stato di 1 led ws2812b da bianco a verde, poi quando sulla suddetta utenza ho un assorbimento letto da un sensore 30 Ah il led passa a colore blù per segnalare l'utilizzo, inoltre ho scritto 2 righe anche per avere il valore di lettura (errato perchè manca ancora il calcolo della media) del sensore di assorbimento, inoltre se l'assorbimento diviene eccessivo cioè raggiunge e o supera 7Ah il relè viene spento ed il led passa in Rosso, sul display appare l'informazione di assorbimento eccessivo ed il valore, nel caso di spegnimento del sistema tramite capacitivo tutti i valori vengono riportati a 0 compresi gli errori.
Ora il problema è il seguente, funziona tutto a meraviglia ad eccezione del display, che nella fase di lettura d'assorbimento (stato blu del led) spesso ritarda di qualche secondo e più...
codice... ovviamente un sacco di roba commentata in test
/* Start of Code */
#include <FastLED.h> //Libreria Ws2812
//Librerie I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// inizializzo la libreria
//LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address
LiquidCrystal_I2C lcd(0x3f, 16, 2);
//LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
// How many leds are connected?
#define NUM_LEDS 4
// Define the Pins
#define DATA_PIN 2
// Define the array of leds
CRGB leds[NUM_LEDS];
// Define Sensor pin
#define sens1 3 //Sensore Capacitivo
//Define Hall Sensor Pin
#define hall1 A0
//Define Relay Pin
#define relay1 4
//Delay whit millis function
int previousMillis = 0;
int currentMillis = 0;
int interval = 1000;
int interval2 = 200;
//Controllo Assorbimento
int check1 = 0;
int errorval = 0;
int mAh = 0;
int zero = 0; //Variabile mappa mAh
// Put color values in arrays
long invader1a[] =
{
0x008000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x008000,
0x008000, 0xFFFF00, 0x0000FF, 0xFFFF00, 0xFFFF00, 0x0000FF, 0xFFFF00, 0x008000,
0x008000, 0x000000, 0xFFFF00, 0x800080, 0x800080, 0xFFFF00, 0x000000, 0x008000,
0x000000, 0x000000, 0x000000, 0xFF0000, 0xFF0000, 0x000000, 0x000000, 0x000000
};
long invader1b[] =
{
0x000000, 0x000000, 0x0000FF, 0xFFFF00, 0xFFFF00, 0x0000FF, 0x000000, 0x000000,
0x000000, 0x008000, 0xFFFF00, 0x800080, 0x800080, 0xFFFF00, 0x008000, 0x000000,
0x008000, 0x000000, 0x000000, 0xFFFF00, 0xFFFF00, 0x000000, 0x000000, 0x008000,
0x000000, 0x008000, 0x000000, 0xFF0000, 0xFF0000, 0x000000, 0x008000, 0x000000
};
void setup() {
FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
Serial.begin(9600); // open the serial port at 9600 bps:
pinMode(sens1, INPUT);
pinMode(relay1, OUTPUT);
// inizializzo il display
//lcd.begin(16,2);
// accendo il LED che illumina il display
lcd.backlight();
lcd.init();
//Bozza azzeramento variabile mappatura "mAh"
digitalWrite(relay1, HIGH);
delay(500);
zero = analogRead(hall1);
delay(10);
}
void loop() {
mAh = map(analogRead(hall1), 0, zero, 300, 0); //Mappo Variabile "mAh"
currentMillis = millis();
//Se Sensore Capacitivo ON
if (digitalRead(sens1) == 1) {
//Se Assorbimento Inferiore a 7Ah
if (mAh <= 70) {
if (errorval < mAh) errorval = mAh; //Assegno valore Ah massimi a variabile "errorval"
if (check1 == 0) {
digitalWrite(relay1, LOW);
if (mAh < 10) {
leds[0] = CRGB::Green;
leds[1] = CRGB::Black;
leds[2] = CRGB::Black;
leds[3] = CRGB::Black;
FastLED.setBrightness(10);
FastLED.show();
}
//Lettura Valore Assorbimento
if (mAh > 15 && mAh < 70) {
leds[0] = CRGB::Blue;
leds[1] = CRGB::Black;
leds[2] = CRGB::Black;
leds[3] = CRGB::Black;
FastLED.setBrightness(10);
FastLED.show();
//Funzione delay senza fermare il programma
//currentMillis = millis();
if (currentMillis - previousMillis >= interval2) {
previousMillis = currentMillis;
//Imposto la prima riga
lcd.clear();
lcd.setCursor(0, 0);
//Scrivo
lcd.print(mAh);
lcd.print("00mAh Bagno");
//Imposto la seconda riga
lcd.setCursor(0, 1);
//Scrivo
lcd.print("Catamarano");
}
}
else {
lcd.clear();
}
//Fine Lettura
}
}
//Se Assorbimento Superiore a 7 Ah
else {
check1 = 1;
digitalWrite(relay1, HIGH);
leds[0] = CRGB::Red;
leds[1] = CRGB::Black;
leds[2] = CRGB::Black;
leds[3] = CRGB::Black;
FastLED.setBrightness(10);
FastLED.show();
//Funzione delay senza fermare il programma
//currentMillis = millis();
//if (currentMillis - previousMillis >= interval2) {
//previousMillis = currentMillis;
//Imposto la prima riga
//lcd.clear();
lcd.setCursor(0, 0);
//Scrivo
lcd.print(errorval);
lcd.print("00mAh");
//Imposto la seconda riga
lcd.setCursor(0, 1);
//Scrivo
lcd.print("Catamarano Errore");
//}
//Fine Lettura
}
}
//Se Sensore Capacitivo OFF
else {
lcd.clear();
errorval = 0;
check1 = 0;
digitalWrite(relay1, HIGH);
leds[0] = CRGB::White;
leds[1] = CRGB::Black;
leds[2] = CRGB::Black;
leds[3] = CRGB::Black;
FastLED.setBrightness(10);
FastLED.show();
}
//Funzione delay senza fermare il programma
//currentMillis = millis();
//if (currentMillis - previousMillis >= interval) {
//previousMillis = currentMillis;
//Fine Funzione
if (check1 == 1) {
Serial.print("Assorbimento ");
Serial.print(errorval);
Serial.println("00 mAh");
}
Serial.println(digitalRead(sens1));
Serial.println(analogRead(hall1));
Serial.print("Valore Relay ");
Serial.print(mAh);
Serial.println("00 mAh");
//}
}
/* End of Code */
nello specifico la sezione che da problemi
//Lettura Valore Assorbimento
if (mAh > 15 && mAh < 70) {
leds[0] = CRGB::Blue;
leds[1] = CRGB::Black;
leds[2] = CRGB::Black;
leds[3] = CRGB::Black;
FastLED.setBrightness(10);
FastLED.show();
//Funzione delay senza fermare il programma
//currentMillis = millis();
if (currentMillis - previousMillis >= interval2) {
previousMillis = currentMillis;
//Imposto la prima riga
lcd.clear();
lcd.setCursor(0, 0);
//Scrivo
lcd.print(mAh);
lcd.print("00mAh Bagno");
//Imposto la seconda riga
lcd.setCursor(0, 1);
//Scrivo
lcd.print("Catamarano");
}
}
else {
lcd.clear();
}
//Fine Lettura