Salve ragazzi, sto facendo la miniatura di una casa e ora sto programmando il cancello, dato che ho altri pin disponibili volevo sostituire i delay con i millis per poter eseguire altre operazioni senza dover freezzare niete. Ho provato ad utilizzare i millis in mille modi ma non riesco a sostituirli ai delay che ho usato per gestire il motore. Una fuzione millis è utilizzata nel programma per far blinkare il led mentre il motore è in movimento.
byte fcIndietro = 2; //pin 2 = fine corsa (indietro)
byte fcAvanti = 5; //pin 5 = fine corsa (avanti)
byte hBridge1 = 3; //pin 3 = 1A (ponte H)
byte hBridge2 = 10; //pin 4 = 2A (ponte H)
byte hBridgeEn = 9; //pin 9 = enable (ponte H)
byte fotocellula = 6; //pin 6 = fotocellula
byte ledSegnalazione = 4; //pin 4 = led di stato funzionamento cancello
int ledState = 0; // ledState used to set the LED
unsigned long previousMillis = 0; //will store last time LED was updated
unsigned long interval = 1000; //interval at which to blink (milliseconds)
void setup() {
pinMode(fcIndietro, INPUT);
pinMode(fcAvanti, INPUT);
pinMode(hBridge1, OUTPUT);
pinMode(hBridge2, OUTPUT);
pinMode(hBridgeEn, OUTPUT);
pinMode(fotocellula, INPUT);
pinMode(ledSegnalazione, OUTPUT);
//inizializzo il motore sempre spento
digitalWrite(hBridge1, LOW);
digitalWrite(hBridge2, LOW);
digitalWrite(hBridgeEn, HIGH);
//inizializzo il Serial monitor
Serial.begin(9600);
}
void loop() {
if ((digitalRead(fotocellula) == HIGH) && (digitalRead(hBridge2) == HIGH)) { //se leggo che il cancello si sta chiudendo e la fotocellula viene interotta
fermaCancello(); //fermo il cancello
digitalWrite(ledSegnalazione, LOW);
delay(5000); //per 5 secondi
apriCancello(); //e lo faccio riaprire facendogli eseguire la funzione del finecorsa
}
if (digitalRead(hBridge1)==HIGH){
ledFunzionamento();
}
if (digitalRead(hBridge2)==HIGH){
ledFunzionamento();
}
if (digitalRead(fcIndietro) == HIGH) { // se il cancello tocca il finecorsa (indietro)
fermaCancello(); // fermo il motore
digitalWrite(ledSegnalazione, LOW);
delay(10000); // attendo 10 sec.
chiudiCancello(); // chiudo camcello
}
if (digitalRead(fcAvanti) == HIGH) { // se il cancello tocca il finecorsa (avanti)
fermaCancello(); // ferma motore
digitalWrite(ledSegnalazione, LOW);
}
//attendi un comando dalla serial
if ( Serial.available()) {
byte DataRX = Serial.read();
if (DataRX == 49) { // carattere 1 avvia il motore a SX, il cancello si apre
apriCancello();
}
if (DataRX == 50) { // carattere 2 avvia il motore a DX,
chiudiCancello(); // il cancello si chiude (ad esempio se aperto a mano)
}
if (DataRX == 48) {
fermaCancello(); // Carattere 0 ferma il motore in caso
// di guasti o malfunzionamenti
}
}
}
void apriCancello() {
digitalWrite(hBridge1, HIGH);
digitalWrite(hBridge2, LOW);
Serial.println("apertura");
}
void chiudiCancello() {
digitalWrite(hBridge1, LOW);
digitalWrite(hBridge2, HIGH);
Serial.println("chiusura");
}
void fermaCancello() {
digitalWrite(hBridge1, LOW);
digitalWrite(hBridge2, LOW);
Serial.println("fermo");
}
void ledFunzionamento() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis; //save the last time you blinked the LED
//if the LED is off turn it on and vice-versa:
ledState ^= 1;
digitalWrite(ledSegnalazione, ledState);
}
}