Lettura ingresso arduino

Pubblicità

tynco

Nuovo Utente
Messaggi
6
Reazioni
0
Punteggio
3
sono straniero e scusate se sbaglio a scrivere ,
Sto scrivendo un codice per leggere impulsi tipo onda quadra , a presenza di questi che mi resta ingresso alto fin che arrivano segnali appena si interrompe arrivo di segnali deve andare in allarme e poi girare in aspetto.
invece succede che va subito in allarme , non so dove sbaglio se ce qualcuno a dare una mano che posso sistemare codice .
Grazie.


ecco il code:

C:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define BUZZER 9                 
#define ALARME   10
#define STBY   11
#define LAVORO  12
#define START  13
#define RUOTA    2




int start = 0;
LiquidCrystal_I2C lcd (0x27, 20, 4);

int stato;
#define ASPETTO    0
#define LAVORARE    1
#define ST1_ERROR  2

#define STOP1      9

#define ST_END    99


byte ruota;

long t1 = 3000;
long t2 = 0;

void setup() {

  pinMode(RUOTA, INPUT_PULLUP);

  pinMode(BUZZER, HIGH);
  pinMode(ALARME, OUTPUT);
  pinMode(STBY, OUTPUT);
  pinMode(LAVORO, OUTPUT);
  pinMode(START, INPUT);



  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print(" >        *        <");
  

  //delay(2000);


  lcd.clear();
}
void loop() {
  while (!digitalRead(START)) {
    delay(3000);
    stato = LAVORARE;
  }

  int ruota = digitalRead(RUOTA);
  


  switch (stato) {


    case ASPETTO:


      lcd.setCursor (0, 0);
      lcd.print   ("RUOTA ");
      lcd.print   (ruota);
      lcd.print   (" ");
      ruota = 0;
      lcd.setCursor (0, 3);
      lcd.print (">>>   ASPETO   <<<");
      digitalWrite(BUZZER, HIGH);
      digitalWrite(ALARME, HIGH);
      digitalWrite(STBY, HIGH);
      digitalWrite(LAVORO, HIGH);


      break;

    case LAVORARE:

      
      lcd.setCursor (0, 0);
      lcd.print   ("RUOTA ");
      lcd.setCursor (3, 0);
      lcd.print   (" ");
      lcd.print   (ruota);
      lcd.setCursor (0, 3);
      lcd.print ("**LAVORO IN CORSO**");
      digitalWrite(BUZZER, HIGH);
      digitalWrite(ALARME, HIGH);
      digitalWrite(STBY, LOW);
      digitalWrite(LAVORO, LOW);
;

      if (ruota != 0)                         // penso che qui sbaglio
        ruota = 0;
      else {
        stato = ST1_ERROR;
      }
     
      break;

    case ST1_ERROR:
      lcd.clear();
      lcd.print(" >> ALARME: RUOTA << ");
      lcd.setCursor(0, 1);
      lcd.print("      NON CONTA      ");
      digitalWrite(BUZZER, LOW);
      digitalWrite(ALARME, LOW);
      digitalWrite(STBY, HIGH);
      digitalWrite(LAVORO, HIGH);
      delay (2000);
      stato = STOP1;



      break;

    case STOP1:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(" LA RUOTA NON GIRA ");
      digitalWrite(BUZZER, HIGH);
      digitalWrite(ALARME, LOW);
      digitalWrite(STBY, HIGH);
      digitalWrite(LAVORO, HIGH);
      delay(6000);
      stato = ST_END;
      break;
   
    case ST_END:
      lcd.clear();
      digitalWrite(BUZZER, HIGH);
      delay(100);
      stato = ASPETTO;
      break;
  }
}
 
Ultima modifica da un moderatore:
Ma ruota non dovrebbe essere un segnale alto? da quello che ho capito finchè leggi un segnale alto(1) su ruota niente allarme e se ruota passa a basso(0) allora attiva l'allarme. In quel caso si hai sbagliato proprio dove hai messo il commento di possibile errore. Dovrebbe essere:
C:
if (ruota != 1)                         // penso che qui sbaglio
       stato = ST1_ERROR;
 
eventualmente,. la parte di lettura dell'inoput non lo fare sempre, ma solo in stati ASPETTA e LAVORARE
 
Ultima modifica:
per chiarire ' segnale che arriva sul pin 2 e un segnale alternato tipo onof 010101 e un treno di segnali vuol dire che la ruota gira ,appena non arriva nessun segnale ad esempio 0000 scatta allarme "la ruota non gira"
bigendian si e vero solamente e importante sul LAVORO
fandango ho fatto le prove comunque allarme scatta subito appena si cambia stato di segnale , penso che si deve fare qualcosa tipo rising , grazie tante , se ce qualche idea e benvenuta
 
Capire se c'e' o non c'e' il treno, dipende dalla logica che vuoi utilizzare-.
Un allarme dovrebbe gia scattare anche con 010001 ? Oppure, se per un certo tempo resta a 0 ?
In ogni caso devi conoscere il periodo del treno di impulsi.

Un modo per farlo e' con interrupt, incrementando un contatore nell'interrupt, e nel main loop,
controllare di tanto in tanto, ad un delta t costante, il counter.
 
Concordo a pieno con @bigendian devi calcolare il tempo tra un alto e basso e creare una logica che confronti questi segnali con una coincidenza di tempo, in pratica finchè i tempi sono uguali niente allarme, se cambia l'intervallo del tempo allarme.
Per esempio potresti assegnare a 0 e 1(1__t__0__t__1__t__0) il tempo che trascorre tra quest'ultimi, finchè sarà uguale ninte allarme.
 
vi ringrazio a tutti due , ma adesso penso che e meglio controllare il tempo che resta a 0 , per che potrebbe essere che treno puo avere variazioni di durata di alto ed il basso livello segnale.
 
un altra idea e' banalmente con un interrupt "change", nel main loop se mplicemente incrementi un systick++, nell'interrupt controlli che il systick "delta" sia costante. Per capire se una ruota gira piu che suff
Variazione di velocita' ... beh, controlli un range di delta come validi. Questo senza entrare in algoritmi troppo complessi..

Conviene capire subito cosa sono e come utilizzare gli interrupt. Sono fondamentali.
 
Pubblicità
Pubblicità
Indietro
Top