Link scheda: https://a.aliexpress.com/_EG4gZL3
Codice
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define pompa1 4
#define pompa2 5
#define pompa3 6
#define pompa4 7
#define segnale1 8
#define segnale2 9
#define segnale3 10
#define segnale4 12
#define segnale5 14
#define LED_PIN 11
bool lcd_attesa = true;
bool lcd_errore = false;
bool lcd_fine_prodotto1 = false;
bool lcd_fine_prodotto2 = false;
bool lcd_fine_prodotto3 = false;
bool lcd_fine_prodotto4 = false;
bool lcd_interrotta = false;
bool spegni = false;
bool consenso_prodotto1 = false;
bool consenso_prodotto2 = false;
bool consenso_prodotto4 = false;
bool conteggio_prodotto1 = false;
bool conteggio_prodotto2 = false;
bool conteggio_prodotto4 = false;
bool conteggio_prodotto3 = false;
bool avvio_programma = false;
bool interrotto_programma = false;
bool tempolow = true;
bool tempohigh = false;
unsigned long inizio_prodotto1 = 0;
unsigned long inizio_prodotto2 = 0;
unsigned long inizio_prodotto4 = 0;
unsigned long inizio_prodotto3 = 0;
unsigned long rimbalzo1 = 2000;
unsigned long rimbalzo = 200;
unsigned long premuto = 0;
unsigned long inizio_schermo = 0;
unsigned long fine_schermo = 1500;
unsigned long timer_acceso = 10;
int durata_prodotto1 = 0; //variabile
int durata_prodotto2 = 0; //60 grammi
int durata_prodotto4 = 0; //30 grammi
int durata_prodotto3 = 0; //50 grammi
int fine_prodotto1 = 0;
int fine_prodotto2 = 0;
int segnale = 0;
void setup() {
Serial.begin(9600);
pinMode(pompa1, OUTPUT);
pinMode(pompa2, OUTPUT);
pinMode(pompa3, OUTPUT);
pinMode(pompa4, OUTPUT);
digitalWrite(pompa4, LOW);
digitalWrite(pompa1, LOW);
digitalWrite(pompa3, LOW);
digitalWrite(pompa2, LOW);
pinMode(LED_PIN, OUTPUT);
pinMode(13, OUTPUT);
pinMode(segnale1, INPUT_PULLUP);
pinMode(segnale2, INPUT_PULLUP);
pinMode(segnale3, INPUT_PULLUP);
pinMode(segnale4, INPUT_PULLUP);
pinMode(segnale5, INPUT_PULLUP);
lcd.init();
lcd.backlight();
analogWrite(LED_PIN, 40);
}
void loop() {
if (digitalRead(segnale1) == LOW && (digitalRead(segnale2) == HIGH && digitalRead(segnale3) == HIGH && digitalRead(segnale4) == HIGH && digitalRead(segnale5) == HIGH)) {
if (tempolow) {
avvio_programma = true;
premuto = millis();
tempolow = false;
}
if (avvio_programma && ((millis() - premuto) > rimbalzo1)) {
consenso_prodotto1 = true;
durata_prodotto1 = 9500;
durata_prodotto3 = 10000;
tempohigh = true;
segnale = 1;
avvio_programma = false;
}
if (segnale == 1) prodotto1();
} else if (digitalRead(segnale1) == LOW && (digitalRead(segnale2) == LOW || digitalRead(segnale3) == LOW || digitalRead(segnale4) == LOW || digitalRead(segnale5) == LOW)) {
lcd_errore = true;
errore();
} else if ((digitalRead(segnale1) == HIGH && segnale == 1) && (conteggio_prodotto1 || conteggio_prodotto3)) {
if (tempohigh) {
interrotto_programma = true;
premuto = millis();
tempohigh = false;
}
if (interrotto_programma && ((millis() - premuto) > rimbalzo)) {
lcd_interrotta = true;
erogazione_interrotta();
interrotto_programma = false;
}
}
if (digitalRead(segnale2) == LOW && (digitalRead(segnale1) == HIGH && digitalRead(segnale3) == HIGH && digitalRead(segnale4) == HIGH && digitalRead(segnale5) == HIGH)) {
if (tempolow) {
avvio_programma = true;
premuto = millis();
tempolow = false;
}
if (avvio_programma && ((millis() - premuto) > rimbalzo1)) {
consenso_prodotto1 = true;
durata_prodotto1 = 6500; //DOSAGGIO
durata_prodotto3 = 10000;
tempohigh = true;
segnale = 2;
avvio_programma = false;
}
if (segnale == 2) prodotto1();
} else if (digitalRead(segnale2) == LOW && (digitalRead(segnale1) == LOW || digitalRead(segnale3) == LOW || digitalRead(segnale4) == LOW || digitalRead(segnale5) == LOW)) {
lcd_errore = true;
errore();
} else if ((digitalRead(segnale2) == HIGH && segnale == 2) && (conteggio_prodotto1 || conteggio_prodotto3)) {
if (tempohigh) {
interrotto_programma = true;
premuto = millis();
tempohigh = false;
}
if (interrotto_programma && ((millis() - premuto) > rimbalzo)) {
lcd_interrotta = true;
erogazione_interrotta();
interrotto_programma = false;
}
}
if (digitalRead(segnale3) == LOW && (digitalRead(segnale1) == HIGH && digitalRead(segnale2) == HIGH && digitalRead(segnale4) == HIGH && digitalRead(segnale5) == HIGH)) {
if (tempolow) {
avvio_programma = true;
premuto = millis();
tempolow = false;
}
if (avvio_programma && ((millis() - premuto) > rimbalzo1)) {
consenso_prodotto1 = true;
durata_prodotto1 = 17000; //DOSAGGIO
durata_prodotto3 = 10000;
tempohigh = true;
segnale = 3;
avvio_programma = false;
}
if (segnale == 3) prodotto1();
} else if (digitalRead(segnale3) == LOW && (digitalRead(segnale1) == LOW || digitalRead(segnale2) == LOW || digitalRead(segnale4) == LOW || digitalRead(segnale5) == LOW)) {
lcd_errore = true;
errore();
} else if ((digitalRead(segnale3) == HIGH && segnale == 3) && (conteggio_prodotto1 || conteggio_prodotto3)) {
if (tempohigh) {
interrotto_programma = true;
premuto = millis();
tempohigh = false;
}
if (interrotto_programma && ((millis() - premuto) > rimbalzo)) {
lcd_interrotta = true;
erogazione_interrotta();
interrotto_programma = false;
}
}
if (digitalRead(segnale4) == LOW && (digitalRead(segnale1) == HIGH && digitalRead(segnale2) == HIGH && digitalRead(segnale3) == HIGH && digitalRead(segnale5) == HIGH)) {
if (tempolow) {
avvio_programma = true;
premuto = millis();
tempolow = false;
}
if (avvio_programma && ((millis() - premuto) > rimbalzo1)) {
consenso_prodotto2 = true;
durata_prodotto2 = 9500;
durata_prodotto3 = 8000;
tempohigh = true;
segnale = 4;
avvio_programma = false;
}
if (segnale == 4) prodotto2();
} else if (digitalRead(segnale4) == LOW && (digitalRead(segnale1) == LOW || digitalRead(segnale2) == LOW || digitalRead(segnale3) == LOW || digitalRead(segnale5) == LOW)) {
lcd_errore = true;
errore();
} else if ((digitalRead(segnale4) == HIGH && segnale == 4) && (conteggio_prodotto2 || conteggio_prodotto3)) {
if (tempohigh) {
interrotto_programma = true;
premuto = millis();
tempohigh = false;
}
if (interrotto_programma && ((millis() - premuto) > rimbalzo)) {
lcd_interrotta = true;
erogazione_interrotta();
interrotto_programma = false;
}
}
if (digitalRead(segnale5) == LOW && (digitalRead(segnale1) == HIGH && digitalRead(segnale2) == HIGH && digitalRead(segnale3) == HIGH && digitalRead(segnale4) == HIGH)) {
if (tempolow) {
avvio_programma = true;
premuto = millis();
tempolow = false;
}
if (avvio_programma && ((millis() - premuto) > rimbalzo1)) {
consenso_prodotto4 = true;
durata_prodotto4 = 4000;
tempohigh = true;
segnale = 5;
avvio_programma = false;
}
if (segnale == 5) prodotto4();
} else if (digitalRead(segnale5) == LOW && (digitalRead(segnale1) == LOW || digitalRead(segnale2) == LOW || digitalRead(segnale3) == LOW || digitalRead(segnale4) == LOW)) {
lcd_errore = true;
errore();
} else if ((digitalRead(segnale5) == HIGH && segnale == 5) && conteggio_prodotto4) {
if (tempohigh) {
interrotto_programma = true;
premuto = millis();
tempohigh = false;
}
if (interrotto_programma && ((millis() - premuto) > rimbalzo)) {
lcd_interrotta = true;
erogazione_interrotta();
interrotto_programma = false;
}
}
if ((digitalRead(segnale1) == HIGH && digitalRead(segnale2) == HIGH && digitalRead(segnale3) == HIGH && digitalRead(segnale4) == HIGH
&& digitalRead(segnale5) == HIGH && conteggio_prodotto4 == false && conteggio_prodotto3 == false && conteggio_prodotto2 == false && conteggio_prodotto1 == false)
|| (segnale == 0)) {
attesa();
}
}
void prodotto1() {
if (consenso_prodotto1) {
analogWrite(LED_PIN, 40);
digitalWrite(pompa4, HIGH);
inizio_prodotto1 = millis();
digitalWrite(pompa2, HIGH);
inizio_prodotto3 = millis();
digitalWrite(13, HIGH);
Serial.println("Erogo prodotto1");
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("EROGAZIONE");
lcd.setCursor(4, 1);
lcd.print("PRODOTTI");
conteggio_prodotto1 = true;
conteggio_prodotto3 = true;
consenso_prodotto1 = false;
}
if (conteggio_prodotto1 && (millis() - inizio_prodotto1 >= durata_prodotto1)) { //conto il tempo trascorso, quindi blocco l'erogazione
digitalWrite(pompa4, LOW);
Serial.println("prodotto1 OK");
lcd.setCursor(0, 0);
lcd.print("prodotto1 OK ");
fine_prodotto1++;
conteggio_prodotto1 = false;
}
if (conteggio_prodotto3 && (millis() - inizio_prodotto3 >= durata_prodotto3)) { //conto il tempo trascorso
digitalWrite(pompa2, LOW);
Serial.println("prodotto3 OK");
lcd.setCursor(0, 1);
lcd.print("prodotto3 OK ");
fine_prodotto1++;
conteggio_prodotto3 = false;
}
if (fine_prodotto1 >= 2) {
digitalWrite(13, LOW);
digitalWrite(pompa2, LOW);
digitalWrite(pompa4, LOW);
lcd_fine_prodotto1 = true;
if (lcd_fine_prodotto1) {
Serial.println("PRODOTTI EROGATI");
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("PRODOTTI");
lcd.setCursor(4, 1);
lcd.print("EROGATI");
lcd_fine_prodotto1 = false;
}
lcd_attesa = true;
inizio_schermo = millis();
segnale = 0;
fine_prodotto1 = 0;
}
}
void prodotto2() {
if (consenso_prodotto2) {
analogWrite(LED_PIN, 40);
digitalWrite(pompa1, HIGH);
inizio_prodotto2 = millis();
digitalWrite(pompa2, HIGH);
inizio_prodotto3 = millis();
digitalWrite(13, HIGH);
Serial.println("Erogo prodotto2");
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("EROGAZIONE");
lcd.setCursor(4, 1);
lcd.print("PRODOTTI");
conteggio_prodotto2 = true;
conteggio_prodotto3 = true;
consenso_prodotto2 = false;
}
if (conteggio_prodotto2 && (millis() - inizio_prodotto2 >= durata_prodotto2)) { //conto il tempo trascorso, quindi blocco l'erogazione
digitalWrite(pompa1, LOW);
Serial.println("prodotto2 OK");
lcd.setCursor(0, 0);
lcd.print("prodotto2 OK ");
fine_prodotto2++;
conteggio_prodotto2 = false;
}
if (conteggio_prodotto3 && (millis() - inizio_prodotto3 >= durata_prodotto3)) { //conto il tempo trascorso
digitalWrite(pompa2, LOW);
Serial.println("prodotto3 OK");
lcd.setCursor(0, 1);
lcd.print("prodotto3 OK ");
fine_prodotto2++;
conteggio_prodotto3 = false;
}
if (fine_prodotto2 >= 2) {
digitalWrite(13, LOW);
digitalWrite(pompa2, LOW);
digitalWrite(pompa1, LOW);
lcd_fine_prodotto2 = true;
if (lcd_fine_prodotto2) {
Serial.println("PRODOTTI EROGATI");
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("PRODOTTI");
lcd.setCursor(4, 1);
lcd.print("EROGATI");
lcd_fine_prodotto2 = false;
}
lcd_attesa = true;
inizio_schermo = millis();
segnale = 0;
fine_prodotto2 = 0;
}
}
void prodotto4() {
if (consenso_prodotto4) {
analogWrite(LED_PIN, 40);
digitalWrite(pompa3, HIGH);
inizio_prodotto4 = millis();
digitalWrite(13, HIGH);
Serial.println("Erogo prodotto4");
lcd.clear();
lcd.setCursor(5, 0);
lcd.print("EROGO");
lcd.setCursor(2, 1);
lcd.print("prodotto4");
conteggio_prodotto4 = true;
consenso_prodotto4 = false;
}
if (conteggio_prodotto4 && (millis() - inizio_prodotto4 >= durata_prodotto4)) { //conto il tempo trascorso
digitalWrite(pompa3, LOW);
digitalWrite(13, LOW);
lcd_fine_prodotto4 = true;
if (lcd_fine_prodotto4) {
Serial.println("prodotto4 erogato");
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("prodotto4");
lcd.setCursor(4, 1);
lcd.print("EROGATO");
lcd_fine_prodotto4 = false;
}
lcd_attesa = true;
inizio_schermo = millis();
segnale = 0;
conteggio_prodotto4 = false;
}
}
void erogazione_interrotta() {
digitalWrite(13, LOW);
digitalWrite(pompa4, LOW);
digitalWrite(pompa1, LOW);
digitalWrite(pompa3, LOW);
digitalWrite(pompa2, LOW);
if (lcd_interrotta) {
Serial.println("EROGAZIONE INTERROTTA");
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("EROGAZIONE");
lcd.setCursor(3, 1);
lcd.print("INTERROTTA");
lcd_interrotta = false;
}
conteggio_prodotto1 = false;
conteggio_prodotto2 = false;
conteggio_prodotto4 = false;
conteggio_prodotto3 = false;
tempolow = true;
lcd_attesa = true;
inizio_schermo = millis();
segnale = 0;
}
void errore() {
digitalWrite(pompa4, LOW);
digitalWrite(pompa1, LOW);
digitalWrite(pompa3, LOW);
digitalWrite(pompa2, LOW);
if (lcd_errore) {
analogWrite(LED_PIN, 40);
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("CONFLITTO");
lcd.setCursor(4, 1);
lcd.print("SEGNALI");
lcd_errore = false;
}
lcd_attesa = true;
inizio_schermo = millis();
}
void attesa() {
digitalWrite(pompa4, LOW);
digitalWrite(pompa1, LOW);
digitalWrite(pompa3, LOW);
digitalWrite(pompa2, LOW);
if (lcd_attesa) {
if ((millis() - inizio_schermo) > fine_schermo) {
Serial.println("Attendo un segnale");
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("ATTENDO UN");
lcd.setCursor(4, 1);
lcd.print("SEGNALE");
lcd_attesa = false;
spegni = true;
}
}
if (spegni) {
if ((millis() - inizio_schermo > (timer_acceso * 1000))) {
analogWrite(LED_PIN, 0);
spegni = false;
}
}
tempolow = true;
lcd_errore = true;
}
Schema molto semplice
Pin 4, 5, 6 e 7 escono da arduino e vanno ad ogni ingresso della scheda assieme alla massa.
Massa comune per i 4 pin che chiude a gnd di arduino.
I “segnali” sono 5 rele con contatto pulito di una scheda di un macchinario alla quale mi sono interfacciato con arduino ed uso il PULLUP interno di arduino.
Se serve, disegno uno schema.
P.S. ho mentito sul “semplice if” hahahaha