Sketch nastro trasportatore-tappatore

Salve ragazzi,
volevo un'opinione su questo codice molto semplice che ho scritto.
è il primo che compilo da solo quindi vorrei avere dei consigli!
Grazie per la disponibilità
Gio

const int MotAvantiPin = 11; // USCITA DIGITALE: relè motore collegato a "OUTPUT 0" (pin 11) 
const int Tappata = 12;
const int buttonPin = 3;
const int tx = 2;
const int rx = 1;
 
int sensorValue; // valore letto dal sensore: 0...1023  
int buttonState = 0; 

// la routine 'setup' viene eseguita per PRIMA e una sola volta, all'avvio 
 void setup() 
 { 
 pinMode(buttonPin, INPUT);
 pinMode(Tappata, OUTPUT);
 pinMode(MotAvantiPin, OUTPUT);
 pinMode (tx,OUTPUT);
 pinMode (rx,INPUT); 
 
 Serial.begin(9600); // inizializza la comunicazione seriale a 9600 bps  
 digitalWrite(tx,HIGH);
 digitalWrite(Tappata,LOW);
 digitalWrite(MotAvantiPin, HIGH); // Nastro avanti 
 Serial.println("Nastro AVANTI"); 
 delay(1000);
 digitalWrite(MotAvantiPin, LOW);
 Serial.println("Posizionare pezzo in mezzo al nastro"); 
 } 
 
// la routine 'loop' viene eseguita all'infinito 
 void loop() { 
  
 buttonState = digitalRead(buttonPin);
  
  if (buttonState == HIGH)  
 { digitalWrite(MotAvantiPin, HIGH); 
 sensorValue = analogRead(rx); // legge ricevente fotocellula
 if (analogRead(rx) >500)
 { // Barriera infrarossi interrotta (presenza oggetto)  
 
 digitalWrite(MotAvantiPin, LOW); // Nastro stop 
 Serial.println("Raggiunto tappatore"); 
 delay(5000); 
 digitalWrite(Tappata, HIGH);
 delay(1000);
 digitalWrite(Tappata, LOW);
 delay(3000);
 Serial.println("Nastro Avanti-nuova bottiglia"); 
 digitalWrite(MotAvantiPin, HIGH); // Nastro avanti
 } 
 } 
 
 else {
    // If button not pressed Motor is off:
    digitalWrite(MotAvantiPin, LOW); 
  }
 }

Ciao!
da inesperto quale sono il primo consiglio che ti darei è di togliere tutti i delay ed utilizzare il millis() come nell'esempio del "blink without delay" altrimenti il tuo bottone e la fotocellula non la leggi durante il delay... inoltre usa un filtro antirimbalzo per leggere la pressione del bottone.
due cose così al volo visto che sarei al lavoro! :smiley:

Manca il pulsante di emergenza!

Quindi filtro antirimbalzo, pulsante emergenza e millis al posto del delay?
Per i primi due riuscite a spiegarmi un pò meglio come fare?
Cioè come faccio a integrarli?

Per il secondo ci provo e vediamo cosa mi viene fuori!!
Ma è un problema anche se si ferma la lettura? Secondo me no..mi spiego:
-I sensori rilevano un cambiamento nell'ambiente quindi parte il comando che ferma il motore.
-I delay entrano in gioco ora..quando i due comandi (bottone e motore) sono già in "memoria"
Interferiscono lo stesso?

Purtroppo ci sono alcuni errori:

1 - meglio cambiare il pin 1 (rx) con il pin A1: i pin 0 (RX) ed 1 (TX) sono riservati alla comunicazione del serial monitor;
2 - hai dimenticato di inserire uno stop di emergenza che è meglio sia un ingresso a parte;
3 - non hai inserito un anti rimbalzo per il tasto di start (e di stop);
4 - non comprendo perché leggi lo stato del sensore come analogico caricandolo sulla variabile sensorValue e poi non la utilizzi.

In qualsiasi caso è meglio che tu fornisca anche lo schema elettrico.

cyberhs:
Purtroppo ci sono alcuni errori:

1 - meglio cambiare il pin 1 (rx) con il pin A1: i pin 0 (RX) ed 1 (TX) sono riservati alla comunicazione del serial monitor;
2 - hai dimenticato di inserire uno stop di emergenza che è meglio sia un ingresso a parte;
3 - non hai inserito un anti rimbalzo per il tasto di start (e di stop);
4 - non comprendo perché leggi lo stato del sensore come analogico caricandolo sulla variabile sensorValue e poi non la utilizzi.

In qualsiasi caso è meglio che tu fornisca anche lo schema elettrico.

1-Grazie per il consiglio
2-Il pulsante di stop lo metto elettricamente prima di arduino..così lo spegne proprio
3-riusciresti a darmi una mano o dei link sul come farlo? Non capisco proprio
4-la variabile sensor value la uso per determinare se la barriera ad infrarossi è interrotta o meno..almeno penso :slight_smile:

Per il punto 4:

sensorValue = analogRead(rx); // legge ricevente fotocellula
 if (analogRead(rx) >500)

in realtà leggi 2 volte il segnale analogico, la prima volta lo salvi nella variabile, la seconda lo usi per il confronto. Sarebbe da correggere così(se vuoi usare la variabile):

sensorValue = analogRead(rx); // legge ricevente fotocellula
 if (sensorValue >500)

ma se ti serve una sola volta per il confronto, a questo punto farei a meno anche di usarla proprio!

Benvenuto @gogiovanni
Ti invito a presentarti qui: Re: Presentazioni nuovi iscritti, fatevi conoscere da tutti! (Part 1) - Generale - Arduino Forum

Per postare il codice dovresti fare come spiegato nella sezione 7 del regolamento:
http://forum.arduino.cc/index.php?topic=149082.0
Come hai fatto tu, c'e' la possibilità che alcune parti del codice non siano ben visibili (quando ad esempio ci sono le parentesi quadre)

per quanto riguarda il punto 3 ti consiglio di leggere in reference:

ciao

Allora..
grazie a tutti per la disponibilità!
Ho corretto il pin e il sensorValue e..
..ho provato a inserire il debounce per il pulsante..ho adattato il link di tapirinho..
mi date un'occhiata?

/* 
Uscite: 
 pin 11: motore nastro trasp. avanti (uscita digitale: HIGH/LOW) 
 pin 12: tappatore pneumatico

Ingressi: 
 pin 1: ricevente fotocellula

Il programma dovrebbe far lavorare in questo modo un tappatore pneumatico
comandato da elettrovalvola, un motore e una barriera a infrarossi.
1)Premendo un bottone il motore si accende, altrimenti no
2)Premuto il bottone il motore parte e si ferma solo nel caso venga 
interrotta la barriera ad infrarossi
3)Quando viene interrotta la barriera, si ferma il motore e arduino 
da il segnale all'elettrovalvola che entra in funzione per un secondo
4)Si riparte dal punto 2 ma non è necessario premere alcun bottone

 

*/ 

const int MotAvantiPin = 11; // USCITA DIGITALE: relè motore collegato a "OUTPUT 0" (pin 11) 
const int Tappata = 12;
const int buttonPin = 3;
const int tx = 2;
const int rx = A1;
 
int sensorValue; // valore letto dal sensore: 0...1023  
int buttonState; 
int lastButtonState = LOW;

long lastDebounceTime = 0;
long debounceDelay = 50;

// la routine 'setup' viene eseguita per PRIMA e una sola volta, all'avvio 
 void setup() 
 { 
 pinMode(buttonPin, INPUT);
 pinMode(Tappata, OUTPUT);
 pinMode(MotAvantiPin, OUTPUT);
 pinMode (tx,OUTPUT);
 pinMode (rx,INPUT); 
 
 Serial.begin(9600); // inizializza la comunicazione seriale a 9600 bps  
 digitalWrite(tx,HIGH);
 digitalWrite(Tappata,LOW);
 digitalWrite(MotAvantiPin, HIGH); // Nastro avanti 
 Serial.println("Nastro AVANTI"); 
 delay(1000);
 digitalWrite(MotAvantiPin, LOW);
 Serial.println("Posizionare pezzo in mezzo al nastro"); 
 } 
 
// la routine 'loop' viene eseguita all'infinito 
 void loop() { 
  
 int reading = digitalRead(buttonPin);
  
  if (reading != lastButtonState)  
  {
    lastDebounceTime = millis(); }
     if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer
    // than the debounce delay, so take it as the actual current state:

    // if the button state has changed:
    if (reading != buttonState);
    {
      buttonState = reading;

      // only toggle the LED if the new button state is HIGH
      if (buttonState == HIGH); 
  
 { digitalWrite(MotAvantiPin, HIGH); 
 sensorValue = analogRead(rx); // legge ricevente fotocellula
 if (sensorValue >500)
 { // Barriera infrarossi interrotta (presenza oggetto)  
 
 digitalWrite(MotAvantiPin, LOW); // Nastro stop 
 Serial.println("Raggiunto tappatore"); 
 delay(5000); 
 digitalWrite(Tappata, HIGH);
 delay(1000);
 digitalWrite(Tappata, LOW);
 delay(3000);
 Serial.println("Nastro Avanti-nuova bottiglia"); 
 digitalWrite(MotAvantiPin, HIGH); // Nastro avanti
 } 
 } 
 }
 }
 else {
    // If button not pressed Motor is off:
    digitalWrite(MotAvantiPin, LOW); 
  }
 }