Dunque, dopo qualche prova, ancora al banco ho elaborato un codice piuttosto semplice che sembra funzionare.
Praticamente aziono 4 elettrovalvole e la pompa idraulica premendo un tasto. Laddove fossero premuti due tasti in contemporanea la pompa deve bloccarsi. Ho ottenuto ciò con degli if.
Ora dovrei inserire un altra condizione...ovvero, dovendo montare anche un modulo radiocomandato con cui vorrei attivare i medesimi relé (in parallelo) vorrei escludere la sovrapposizione dei tasti e del radiocomando.
A livello di codice ho pensato di monitorare "semplicemente" la pompa idraulica.
La logica sarebbe questa.
Pigio il pulsante sulla tastiera...se il motore sta già girando (telecomando azionato) NON DEVE accadere nulla.
Diversamente si attiva quello che deve attivarsi.
Stessa cosa per il telecomando...arriva l'impulso ma se il motore sta già girando (TASTO pigiato) NON deve accadere nulla.
Vi sembra relaizzabile?
Cmq ecco il codice attuale.
const byte btnStateUp = 2;
const byte btnStateDown = 3;
const byte btnStateOut = 4;
const byte btnStateIn = 5;
long previousMillis = 0;
long interval = 0;
// int pausa = 500; // attendi x durata time
void setup() {
Serial.begin(9600);
pinMode(btnStateUp, INPUT); // pulsante ALZO
pinMode(btnStateDown, INPUT); // pulsante ABBASSA
pinMode(btnStateOut, INPUT); // pulsante ALLUNGA
pinMode(btnStateIn, INPUT); // pulsante ACCORCIA
pinMode(7, OUTPUT); // valvola POMPA
pinMode(8, OUTPUT); // valvola ALZO
pinMode(9, OUTPUT); // valvola ABBASSA
pinMode(10, OUTPUT); // valvola ALLUNGA
pinMode(11, OUTPUT); // valvola ACCORCIA
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
}
void loop() {
// ------------- ALZO ----------------
{
if (digitalRead (btnStateUp) == LOW && digitalRead (btnStateDown) == HIGH && digitalRead (btnStateOut) == HIGH && digitalRead (btnStateIn) == HIGH)
{
digitalWrite (7, LOW); // aziono POMPA
// delay (pausa);
// ---------------- ritardo -----------------
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
digitalWrite (8, LOW); // aziono valvo
Serial.println ("alzo");
}
// ---------------------------------------------
//digitalWrite (8, LOW); // aziono valvola ALZO
}
else
{
digitalWrite(7, HIGH); //spegne POMPA
digitalWrite(8, HIGH); //spegne ALZO
}
}
{
// ----------- ABBASSO ----------------
if (digitalRead (btnStateDown) == LOW && digitalRead (btnStateUp) == HIGH && digitalRead (btnStateOut) == HIGH && digitalRead (btnStateIn) == HIGH)
{
digitalWrite(7, LOW); // aziona POMPA
// delay (pausa);
// ---------------- ritardo -----------------
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
digitalWrite (9, LOW);
Serial.println ("abbasso");
}
// ---------------------------------------------
// digitalWrite (9, LOW);
}
else
{
digitalWrite(7, HIGH); //spegne POMPA
digitalWrite(9, HIGH); //spegne ABBASSO
}
}
{
// ------------ ALLUNGO ------------------
if (digitalRead (btnStateOut) == LOW && digitalRead (btnStateUp) == HIGH && digitalRead (btnStateDown) == HIGH && digitalRead (btnStateIn) == HIGH)
{
digitalWrite (7, LOW);
// delay (pausa);
// ---------------- ritardo -----------------
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
digitalWrite (10, LOW);
Serial.println ("allungo");
}
// ---------------------------------------------
}
else
{
digitalWrite(7, HIGH); //spegne POMPA
digitalWrite(10, HIGH); //spegne ALLUNGO
}
}
{
// ---------------- ACCORCIO --------------------
if (digitalRead (btnStateIn) == LOW && digitalRead (btnStateUp) == HIGH && digitalRead (btnStateDown) == HIGH && digitalRead (btnStateOut) == HIGH)
{
digitalWrite (7, LOW);
// delay (pausa);
// ---------------- ritardo -----------------
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
digitalWrite (11, LOW);
Serial.println ("accorcio");
}
// ---------------------------------------------
}
else
{
digitalWrite(7, HIGH); //spegne POMPA
digitalWrite(11, HIGH); //spegne ACCORCIO
}
}
}
/*
switch (pushBtn) {
case (pushBtn == ALZA):
//do something when var equals 1
digitalWrite(1, LOW); // aziona pompa
delay(pausa); // ritardo
digitalWrite(2, LOW); // aziona valvola
delay(pausa); // pausa
break;
case 2:
//do something when var equals 2
digitalWrite(1, LOW); // aziona pompa
delay(pausa); // ritardo
digitalWrite(2, LOW); // aziona valvola
delay(pausa); // pausa
}
break;
default:
// if nothing else matches, do the default
// default is optional
break;
}
*/