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!
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?
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 - 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
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!
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)
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);
}
}