Non ho la possibilità di provarlo e trovare gli errori CHE SICURAMENTE CI SONO.
Però ho modificato il codice per farti vedere cosa intendevo, non bloccare il programma quando si aziona il motore, e fare lampeggiare, e la chiusura temporizzata attiva con un flag.
Sicuramente non funziona, ma per mostrarti il concetto e poi puoi correggere gli errori.
// ---- inizio cancello ---- //
//comandi
const int pulsante=5; //pulsante apertura cancello
const int finecorsa1=6; //finecorsa di chiusura
const int finecorsa2=7; //finecorsa d'apertura
//motore passo passo
const int IN1=8;
const int IN2=9;
const int IN3=10;
const int IN4=11;
const char tab1[] =
{
0x01, 0x03, 0x02, 0x06, 0x04, 0x0c, 0x08, 0x09
};
const char tab2[] =
{
0x01, 0x09, 0x08, 0x0c, 0x04, 0x06, 0x02, 0x03
};
//lampeggiante
#define Lamp_pin 12
const unsigned long tempo_commutazione = 500; // qui salvo e decido quanto tempo deve restare off/on il lampeggiante
unsigned long tempo = 0; // qui salvo l'istante di tempo nel quale è cambiato lo stato del lampeggiante
byte flag_led=false;
byte stato_led=LOW;
byte flag_chiusuraTemporizzata=1;
unsigned long attesa;
//stato del cancello
enum tipo_stato {CancelloChiuso=0, CancelloAperto=1};
tipo_stato stato=CancelloChiuso;
unsigned long previousMillis1 = 0;
unsigned long tempo_attesa = 2000;
// ---- fine cancello ---- //
void setup()
{
delay(1000);
Serial.begin(9600);
pinMode(pulsante, INPUT_PULLUP);
pinMode(finecorsa1, INPUT_PULLUP);
pinMode(finecorsa2, INPUT_PULLUP);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(Lamp_pin, OUTPUT); //lampeggiante cancello
}
void loop() {
GestioneCancello();
}
void GestioneCancello()
{
if(millis() - previousMillis1 >= 16)// che senso ha attendere 16 millesecondi ?
{
previousMillis1 = millis();
switch(stato)
{
case CancelloChiuso:
if(digitalRead(pulsante)==LOW && digitalRead(finecorsa1)==LOW && digitalRead(finecorsa2)==HIGH)
{
stato=CancelloAperto;
AvvioMotore();
}
break;
case CancelloAperto:
if(digitalRead(finecorsa1)==HIGH && digitalRead(finecorsa2)==LOW)
{
if(flag_chiusuraTemporizzata){
attesa=millis();
flag_chiusuraTemporizzata=0; // Chiamo la prima volta la funzione e acquisisco il tempo di
}
}
break;
}
}
ChiusuraTemporizzata();
}
void ChiusuraTemporizzata(){
if(f(flag_chiusuraTemporizzata) return;
if(millis() - attesa >= tempo_attesa)//Attendo un intervallo di tempo e eseguo
{
//delay(3000);
stato=CancelloChiuso;
AvvioMotore();
flag_chiusuraTemporizzata=1; // una volta chiuso il cancello ricalcolo il tempo
}
}
void LampCancello()
{
if(!flag_led) return;
if (millis() - tempo >= tempo_commutazione)
{
tempo = millis();
digitalWrite(Lamp_pin,!digitalRead(Lamp_pin));
}
}
void AvvioMotore()
{
for (int j = 0; j < 1 ; j)
{
if (stato==0)
{
for (int i = 0; i < 8; i++)
{
//if(millis() - timer >= 1)
//{
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));
GestioneCancello();
LampCancello()
if(digitalRead(finecorsa1)==LOW ){ // METTERE IL GIUSTO FINECORSA
StopMotore();
return;
}
delay(1);
//timer=millis();
//}
}
}
else
{
for (int i = 0; i < 8; i++)
{
//if(millis() - timer2 >= 1)
//{
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));
GestioneCancello();
LampCancello()
if(digitalRead(finecorsa2)==LOW ){ // METTERE IL GIUSTO FINECORSA
StopMotore();
return;
}
delay(1);
//timer2=millis();
//}
}
}
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);
}