Leggere lo stato di un pulsante all'interno di un ciclo While

Ciao a tutti sono Stefano, sono un novellino di Arduino, fino a poco tempo fa ho "smanettato" un pò con i pic ma mi sono fermato a piccoli progetti perchè ho trovato delle difficoltà in quelli più avanzati... :(

Veniamo a noi, sto scrivendo il codice per l'automazione di un cancello ad anta battente per solo scopo di studio ed ho trovato difficolta' nel leggere lo stato di un pulsante che fa le veci di una fotocellula ed appena passa dallo stato HIGH allo stato LOW blocca entrambe le ante, il problema è che per far lampeggiare il led giallo che non è altro che il lampeggiante del cancello ho dovuto scrivere un ciclo while che lo fa lampeggiare finchè non si aprono completamente le ante. All'interno dello stesso ciclo while partono anche le ante una a distanza di 2 secondi dall'altra. Se premo il pulsante della fotocellula prima di premere quello del comando di apertura funziona bene, non parte niente e rimane in standby ma se inserisco lo stesso controllo tramite un IF all'interno del ciclo while i led dei motori rimangono accesi e quindi non si bloccano (ho fatto una prova anche tramite serial.println(statopulsante) inserito anch'esso all'interno del ciclo while e lo stato del pulsante è sempre = 1. Adesso sto scrivendo con un altro pc e non ho lo sketch qui con me ma domani pomeriggio lo posto, nel frattempo vorrei chiedere come posso fare per far leggere ad Arduino il cambio di stato della fotocellula all'interno del ciclo while. La stessa riga di codice che è prima del ciclo e che funziona l'ho copiata e incollata dentro il ciclo ma fuori va e dentro no... :( Grazie in anticipo a chiunque possa e voglia darmi una mano.

Stefano_Baiocco: Ciao a tutti sono Stefano, sono un novellino di Arduino,

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni e a leggere il regolamento: Regolamento - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - qui le pinout delle varie schede by xxxPighi: Pinout - qui una serie di link [u]generali[/u] utili: Link Utili

Tutto fatto! :) Chiedo scusa ma sono in piedi dalle 5 di stamattina e sono praticamente cotto... :)

Comunque possiedo un Arduino UNO R3.

Grazie a tutti.

Hai già un ciclo loop che ti può controllare tutto quello che vuoi, perchè un while dentro? ... Durante il movimento delle ante hai molte cose da tenere sotto controllo, fotocellule, impulsi da telecomando, correnti di assorbimento motore per normale arresto o quello di emergenza rilevato da sforzo, lampeggiatori, coste pneumatiche .... io toglierei quell'while mettendo dei flag controllando ciclicamente tutto.

ciao

Ci potresti dare lo sketch??? Forse potremo dirti qualcosa.

Ciao Uwe

Ciao Uwe, si, l'ho scritto anche ieri sera, stavo usando un'altro pc e non avevo lo sketch con me, ora sto lavorando ma appena torno a casa lo copio-incollo. Grazie a tutti per il momento.

//Automazione Cancello Autometico con ante a battente
//Autore Baiocco Stefano
//26-11-2014
//Guidonia

int LAMPEGGIATORE = 8;
int ANTADXCHIUDI = 3;
int ANTADXAPRI = 9;
int ANTASXCHIUDI = 4;
int ANTASXAPRI = 2;
int FOTOCELLULAINTERNA = 6;
int FOTOCELLULAESTERNA = 5;
int COMANDO = 7;
int TEMPOAPERTURA = 20;
int TEMPOATTESA = 10;
int CONTATORELAMPEGGI = 0;


void setup ()
{
  Serial.begin(9600);
  pinMode(ANTADXAPRI ,OUTPUT);
  pinMode(ANTADXCHIUDI ,OUTPUT);
  pinMode(ANTASXCHIUDI,OUTPUT);
  pinMode(LAMPEGGIATORE,OUTPUT);
  pinMode(ANTASXAPRI,OUTPUT);
  pinMode(13,OUTPUT);
  pinMode(FOTOCELLULAESTERNA,INPUT);
  pinMode(FOTOCELLULAINTERNA,INPUT);
  pinMode(COMANDO,INPUT);
  
  }
  
  void loop() {
    
    
    int APRI = digitalRead(COMANDO);
    int ANTADXCH = digitalRead(ANTADXCHIUDI);
    int ANTADXAP = digitalRead(ANTADXAPRI);
    int ANTASXCH = digitalRead(ANTASXCHIUDI);
    int ANTASXAP = digitalRead(ANTASXAPRI);
    int FOTOCINT = digitalRead(FOTOCELLULAINTERNA);
    int FOTOCEST = digitalRead(FOTOCELLULAESTERNA);
    
    
    if (APRI == HIGH) {
    
      while (CONTATORELAMPEGGI < TEMPOAPERTURA) {
        
        Serial.println(FOTOCINT);
        Serial.println(CONTATORELAMPEGGI);
        if (FOTOCINT ==HIGH) {

      digitalWrite(LAMPEGGIATORE, HIGH);
      digitalWrite(13,HIGH);
      delay(50);
      digitalWrite(LAMPEGGIATORE, LOW);
      digitalWrite(13,LOW);
      delay(1000);
      digitalWrite(ANTASXAPRI, HIGH);
      delay(2000);
      digitalWrite(ANTADXAPRI, HIGH);
      CONTATORELAMPEGGI ++;
      delay(250);
      digitalRead(FOTOCINT);
      Serial.println(FOTOCINT);
      } 
      }
      digitalWrite(ANTASXAPRI,LOW);
      delay(2000);
      digitalWrite(ANTADXAPRI, LOW);
      digitalWrite(LAMPEGGIATORE, HIGH);
      delay(250);
      digitalWrite(LAMPEGGIATORE, LOW);
      CONTATORELAMPEGGI = 0;
      
    }
    
    }

Ecco una prima bozza di codice di prova… Non riesco a capire perchè non mi legge la variazione di stato del pulsante all’intern del ciclo While…
Grazie.

Il delay come rinomato, blocca lo sketch per il tempo impostato, tu hai 3,3 secondi di pausa durante i cicli while, se lo premi entro quel periodo non lo legge, è anche evidente che non hai mai seguito il forum e non hai fatto ricerche. il led lo fai lampeggiare con "Blink Without Delay" nel loop che trovi negli esempi dell'ide usando come detto prima un flag per attivare il digital write.

flag (informatica) http://it.wikipedia.org/wiki/Flag

Blink Without Delay http://arduino.cc/en/Tutorial/BlinkWithoutDelay

debounce software per pulsanti (antirimbalzo) http://arduino.cc/en/Tutorial/Debounce

debounce hardware per pulsanti (antirimbalzo) http://it.wikipedia.org/wiki/Circuito_anti-rimbalzo

tipo di variabili BOOLEAN-BYTE-INT-LONG-FLOAT .... http://polinienrico.altervista.org/index.php?option=com_content&view=article&id=57&Itemid=66

Ciao Pablos, grazie delle dritte! :) In effetti nel forum sono arrivato poco fa, ho acquistato un arduino la settimana scorsa ma non ho avuto molto tempo a disposizione da dedicargli :( Per quanto riguarda l'antirimbalzo con i pic lo realizzavo tramite un doppio IF intervallato da un delay molto basso e funzionava bene, il linguaggio di Arduino mi è nuovo, quindi dovrò studiarci un pò su... :) Grazie ancora per il momento, appena avrò più tempo a disposizione lo dedicherò allo studio di tutti gli esempi ;)