Salve a tutti, sto riscontrando un problema con arduino mega, devo fare un plastico di casa domotica.
Sono partito dall'automazione del cancello, fin qui sono riuscito con lo sketch, ma quando devo effettuare due operazioni diverse frà di loro come si fa?
Ho quindi aggiunto un crepuscolare allo sketch, con fotoresistenza e un led, (per l'accensione luci giardino) ma come giusto sia, lo sketch viene eseguito cosi come è scritto, come risolvo ed eseguo le due operazioni in contemporanea?
(quando lo sketch va avanti con l'apertura e poi chiusura del cancello, il valore della fotoresistenza non viene più rilevato ovviamente - e ugual situazione, al contrario quando è nel breve lasso di tempo del delay di pausa del crepuscolare non esegue l'apertura del cancello tramite pulsante come è giusto che sia)
Allego quindi lo sketch
const int pulsante=5; //pulsante apertura cancello
const int finecorsa1=6; //finecorsa di chiusura
const int finecorsa2=7; //finecorsa d'apertura
const int IN1=8;
const int IN2=9;
const int IN3=10;
const int IN4=11;
int luce; //valore fotoresistenza
const char tab1[] =
{
0x01, 0x03, 0x02, 0x06, 0x04, 0x0c, 0x08, 0x09
};
const char tab2[] =
{
0x01, 0x09, 0x08, 0x0c, 0x04, 0x06, 0x02, 0x03
};
enum tipo_stato {CancelloChiuso=0, CancelloAperto=1};
tipo_stato stato=CancelloChiuso;
void setup()
{
pinMode(pulsante, INPUT);
digitalWrite(pulsante, HIGH); //resistenza di pullup interna
pinMode(finecorsa1, INPUT);
digitalWrite(finecorsa1, HIGH); //resistenza di pullup interna
pinMode(finecorsa2, INPUT);
digitalWrite(finecorsa2, HIGH); //resistenza di pullup interna
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
Serial.begin(9600);
pinMode(53, OUTPUT); //led illuminazione giardino
}
void loop() {
// ---- inizio crepuscolare ---- //
luce = analogRead(A3);
if(luce < 50)
digitalWrite(53,HIGH);
else
digitalWrite(53,LOW);
Serial.println(luce);
delay(500);
// ---- fine crepuscolare ---- //
// ---- inizio cancello ---- //
switch(stato)
{
case CancelloChiuso:
if(digitalRead(pulsante)==LOW && digitalRead(finecorsa1)==LOW && digitalRead(finecorsa2)==HIGH)
{
stato=CancelloAperto;
AvvioMotore();
}
else
{
StopMotore();
}
break;
case CancelloAperto:
if(digitalRead(finecorsa1)==HIGH && digitalRead(finecorsa2)==LOW)
{
delay(5000);
stato=CancelloChiuso;
AvvioMotore();
}
break;
}
// ---- fine cancello ---- //
}
void AvvioMotore()
{
for (int j = 0; j < 1 ; j)
{
if (stato==0)
{
for (int i = 0; i < 8; i++)
{
digitalWrite(IN1, ((tab1[i] & 0x01) == 0x01 ? true : false));
digitalWrite(IN2, ((tab1[i] & 0x02) == 0x02 ? true : false));
digitalWrite(IN3, ((tab1[i] & 0x04) == 0x04 ? true : false));
digitalWrite(IN4, ((tab1[i] & 0x08) == 0x08 ? true : false));
delay(1);
}
}
else
{
for (int i = 0; i < 8 ; i++)
{
digitalWrite(IN1, ((tab2[i] & 0x01) == 0x01 ? true : false));
digitalWrite(IN2, ((tab2[i] & 0x02) == 0x02 ? true : false));
digitalWrite(IN3, ((tab2[i] & 0x04) == 0x04 ? true : false));
digitalWrite(IN4, ((tab2[i] & 0x08) == 0x08 ? true : false));
delay(1);
}
}
if(digitalRead(finecorsa1)==LOW && stato==0)
{
StopMotore();
break;
}
if(digitalRead(finecorsa2)==LOW && stato==1)
{
StopMotore();
break;
}
}
}
void StopMotore()
{
digitalWrite(IN1, 0);
digitalWrite(IN2, 0);
digitalWrite(IN3, 0);
digitalWrite(IN4, 0);
}
(ho bisogno di una mano pure con la riga 79, il ciclo for in loop che non so come rimuoverlo per avere comunque un loop)
Test_Domotica.ino (2.77 KB)