progetto esame, auto controllata con applicazione(aiuto)

ciao a tutti, ho un problema con il mio progetto di esame...innanzitutto esso consiste nella realizzazione di una macchina comandata tramite un'applicazione android, creata da me con App Inventor...la macchina funzionava bene fino a quando non ho aggiunto la parte di programma per il sensore di parcheggio che monterà....ora esegue i comandi lentamente, in modo ritardato e confusionario....qualcuno sa dirmi il motivo? grazie.

Certo! Hai inserito un pezzo di programma che la rallenta!

Come posso fare per risolvere?

Ti faccio una domanda io: prima stavo bene, ora ho fatto qualcosa e mi sento male. Come posso fare per risolvere?

grazie lo stesso...

qualcun altro sa dirmi di più? grazie...

Essere permalosi non aiuta, visto che è come se tu andassi dal dottore dicendogli che stai male e poi non volessi farti visitare

qualcun altro sa dirmi di più? grazie…

Sukkopera ti ha fatto la diagnosi e l’ha sicuramente centrata
Quindi se vuoi una cura forse non è il caso che tu ci faccia vedere il malato ?

Possibile che non ha capito? :) Facci vedere sto sketch! Che c ha i copyright?

allora provo ad indovinare. Hai preso un sensore a ultrasuoni e controlli la distanza con pulseIn()?

Ciao Uwe

o togli il delay ;)

ecco lo sketch…

#include <LiquidCrystal.h> 
LiquidCrystal lcd(28,30,32,34,36,38);
const int motorP1  = 5;  
const int motorP2  = 6;  
const int motorA1  = 10; 
const int motorA2  = 9; 
const int lucipost = 12;
const int luciant = 13;
const int buzzer = 3 ; 
int trigger=24,echo=26,led=22;
long tempo=0,velocita,distanza=0; 
int state; 
int vSpeed=200;   
void setup() 
{ 
pinMode(motorP1, OUTPUT);
pinMode(motorP2, OUTPUT);
pinMode(motorA1, OUTPUT);
pinMode(motorA2, OUTPUT);
pinMode(lucipost, OUTPUT); 
pinMode(luciant, OUTPUT); 
pinMode(echo,INPUT); // setto il pin del ricevitore del impulso
pinMode(trigger,OUTPUT); // setto il pin del trasmettitore del impulso 
digitalWrite(trigger,LOW); // porto il pin del trasmettitore allo stato basso
pinMode(buzzer,OUTPUT); // setto il pin del buzzer
pinMode(led,OUTPUT); // setto il pin del led
lcd.begin(16,2); // inizializzo il display specificandone il tipo  
Serial.begin(9600);    // inizializzo la comunicazione seriale a 9600 bits al secondo
lcd.setCursor(0,0);    // posizionati alla colonna,riga
lcd.print("Distanza"); // visualizza sul display "Distanza"
lcd.setCursor(0,1);    // posizionati alla colonna,riga
lcd.print("Misurata:  "); // visualizza sul display "Misurata"
}

void loop() {
   // istruzioni sensore di parcheggio
 if(distanza<10000)      // se la distanza è minore di 10000
{
 lcd.setCursor(12,1); // posizionati colonna,riga
 lcd.print("    ");   // visualizza a video "    "
 lcd.setCursor(14,1); // posizionati colonna,riga
 lcd.print("cm");     // visualizza sul display "cm"
}
else  if(distanza<1000)  //altrimenti se la distanza è minore di 1000
 {
   lcd.setCursor(12,1); // posizionati colonna,riga
   lcd.print("    ");   // visualizza sul display "    "
   lcd.setCursor(14,1); // posizionati colonna,riga
   lcd.print("cm");     // visualizza sul display "cm"
 }
 else if(distanza<100) //altrimenti se la distanza è minore di 100
  {
    lcd.setCursor(12,1);  // posizionati colonna,riga
    lcd.print("    ");    // visualizza sul display "    "
    lcd.setCursor(13,1);  // posizionati colonna,riga
    lcd.print("cm");      // visualizza sul display "cm"
  }
   else  if(distanza<10)  //altrimenti se la distanza è minore di 10
     {
       lcd.setCursor(12,1);  // posizionati colonna,riga
       lcd.print("   ");     // visualizza sul display "    "
       lcd.setCursor(12,1);  // posizionati colonna,riga
       lcd.print("cm");      // visualizza sul display "cm"
     }         
if(tempo<38000)       // se il tempo è minore di 38000
{
lcd.setCursor(0,1);    // posizionati colonna,riga
lcd.print("Misurata:"); // visualizza sul display "Misurata:"
lcd.setCursor(11,1);   // posizionati colonna,riga
lcd.print(distanza);  // visualizza sul display la distanza misurata(durata del impulso equivale ad una distanza)    
}
else
{
 lcd.setCursor(0,1);   // posizionati colonna,riga
 lcd.print("  ");      // visualizza sul display "  "
 lcd.setCursor(1,1);   // posizionati colonna,riga
 lcd.print("Fuori Portata  "); // visualizza sul display "Fuori Portata  "
 delay(1000); // ritardo di 1000 millisecondi = 1 secondo
}
digitalWrite(trigger,HIGH); // porta il trigger allo stato alto(invio un impulso)
delayMicroseconds(10);      // durata impulso 10uS microsecondi
digitalWrite(trigger,LOW);  // porta il trigger allo stato basso
tempo=pulseIn(echo,HIGH);   // ricevi l'impulso del trigger 
velocita=(tempo*0.034)/2;   // la velocita è uguale al tempo(il tempo del impulso a tornare indietro)*la temperatura/2(diviso 2 è l'impulso che fa 2 volte lo stesso traggito cioe una volta viene inviato e una volta viene ricevuto) 
distanza=tempo/58;   // la distanza è il tempo/58
if(velocita>3&&velocita<=25)    // se la velocità è > di 3 e valocità <= 200
{
  digitalWrite(led,HIGH);      // porta il led verde allo stato alto (led verde acceso)
  delay(velocita*10);            // ritardo è uguale alla velocita del impulso * 10
  digitalWrite(buzzer,HIGH);     // porta il buzzer allo stato alto (buzzer acceso)
  delay(velocita*10);            // ritardo è uguale alla velocita del impulso * 10
}
  if(velocita<=3)
  {
    digitalWrite(led,HIGH);     // porta il led allo stato alto 
    digitalWrite(buzzer,HIGH);    // porta il buzzer allo stato alto (buzzer suona)
    delay(1000);                  // ritardo di 1000 millisecondi = 1 secondo
  }
  digitalWrite(led,LOW);         // porta il led allo stato basso
  digitalWrite(buzzer,LOW);        // porta il buzzer allo stato basso (buzzer spento)
  delay(10);                       // ritardo di 10 millisecondi = 0.1 secondi
   
// se ricevi dei dati salvali inella variabile state
if(Serial.available() > 0){  
state = Serial.read();   
}
// cambia velocità se la variabile state ha un valore compreso tra 0 e 4. Il valore della velocità potrà essere da 0 a 255 (PWM)
if (state == '0'){
  vSpeed=0;
}
else if (state == '1'){
  vSpeed=100;
}
else if (state == '2'){
  vSpeed=180;
}
else if (state == '3'){
  vSpeed=200;
}
else if (state == '4'){
  vSpeed=255;
}

// istruzioni avanti
// se la variabile state conterrà la lettera 'F', la macchina andrà avanti
if (state == 'F') {
 analogWrite(motorP1, vSpeed); analogWrite(motorP2, 0);
    analogWrite(motorA1, 0);      analogWrite(motorA2, 0); 
}
// istruzioni avanti-sinistra
// se la variabile state conterrà la lettera 'G', la macchina andrà avanti-sinistra
else if (state == 'G') {
 analogWrite(motorP1, vSpeed); analogWrite(motorP2, 0);  
    analogWrite(motorA1, 200);    analogWrite(motorA2, 0); 
}
// istruzioni avanti-destra
// se la variabile state conterrà la lettera 'I', la macchina andrà avanti-destra
else if (state == 'I') {
   analogWrite(motorP1, vSpeed); analogWrite(motorP2, 0); 
    analogWrite(motorA1, 0);      analogWrite(motorA2, 200); 
}
// istruzioni indietro
// se la variabile state conterrà la lettera 'B', la macchina andrà indietro
else if (state == 'B') {
 analogWrite(motorP1, 0);   analogWrite(motorP2, vSpeed); 
    analogWrite(motorA1, 0);   analogWrite(motorA2, 0); 
    }
// istruzioni indietro-sinistra 
// se la variabile state conterrà la lettera 'H', la macchina andrà indietro-sinistra
else if (state == 'H') {
 analogWrite(motorP1, 0);   analogWrite(motorP2, vSpeed); 
    analogWrite(motorA1, 200); analogWrite(motorA2, 0); 
}
// istruzioni indietro-destra 
// se la variabile state conterrà la lettera 'J', la macchina andrà indietro-destra
else if (state == 'J') {
 analogWrite(motorP1, 0);   analogWrite(motorP2, vSpeed); 
    analogWrite(motorA1, 0);   analogWrite(motorA2, 200); 
}
// istruzioni sinistra
// se la variabile state conterrà la lettera 'L', le ruote anteriori gireranno a sinistra
else if (state == 'L') {
 analogWrite(motorP1, 0);   analogWrite(motorP2, 0); 
    analogWrite(motorA1, 200); analogWrite(motorA2, 0); 
}
// istruzioni destra
// se la variabile state conterrà la lettera 'R', le ruote anteriori gireranno a destra
else if (state == 'R') {
 analogWrite(motorP1, 0);   analogWrite(motorP2, 0); 
    analogWrite(motorA1, 0);   analogWrite(motorA2, 200); 
}

// istruzioni luci anteriori
// se la variabile conterrà la lettera 'W'/ 'w', si accenderranno/spegneranno le luci anteriori
else if (state == 'W') {
    digitalWrite(luciant, HIGH); 
     }
  else if (state== 'w'){
     digitalWrite(luciant, LOW); 
      }
// istruzioni luci posteriori
// se la variabile conterrà la lettera 'U'/ 'u', si accenderranno/spegneranno le luci posteriori
else if (state == 'U') {
    digitalWrite(lucipost, HIGH); 
     }
  else if (state== 'u'){
     digitalWrite(lucipost, LOW); 
      }

// istruzioni buzzer
// se la variabile state conterrà la lettera 'V'/ 'v' il buzzer emetterà/non emetterà un suono
else if (state == 'V'){
   tone(buzzer, 1000);
    }
  else if (state == 'v'){
     noTone(buzzer); 
  }

// istruzioni stop
// se la variabile state conterrà la lettera 'S', la macchina si stopperà
else if (state == 'S'){
    analogWrite(motorP1, 0);  analogWrite(motorP2, 0); 
    analogWrite(motorA1, 0);  analogWrite(motorA2, 0);
}
}

@gabbomrc: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More → Modify) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Guglielmo

Scusate ma, essendo nuovo su questo forum, non sapevo di questa cosa..

gabbomrc:
Scusate ma, essendo nuovo su questo forum, non sapevo di questa cosa…

Si, ok, ma … il REGOLAMENTO dovresti averlo letto !!!

Guglielmo

Qualcuno che mi aiuti per favore...

La pulseIn() che usi ... è come la delay() ... finché NON ha finito la misura blocca il programma, quindi, in funzione della distanza, è come se avessi una delay() variabile che ti blocca il programma.

Guglielmo

ah okay grazie! consigli per risolvere?

Ciao, non ho mai provato ma potresti utilizzare l'interrupt: imposti un interrupt sul cambiamento del pin. Nella routine di interrupt se lo stato del pin è alto setti una variabile unsigned long tempoOld= millis() ed azzeri tempo , se invece il pin è a livello basso, tempo = millis() - tempoOld Nella routine principale (loop) quando trovi zero non hai la misura, altrimenti hai l'ultima misura disponibile.

Occhio, è un'idea da verificare bene poichè non l'ho mai provata.....

Stefano

Innanzi tutto, con la pulseIn (link) si può impostare un Timeout e visto che quello di default è di un secondo, tutte le volte che il sensore non legge la risposta devi attendere questo tempo. Scegli quindi un valore di distanza che ti pare ragionevole ( e' inutile in un modellino leggere distanze di svariati metri ) , diciamo come esempio un valore in µS di 10.000 che corrisponde circa a 1.70m

tempo=pulseIn(echo,HIGH,10000);

Poi devi controllare che il risultato NON sia Zero, che equivale a una non lettura

Poi sistema quegli IF(distanza.. perche' praticamente se è bassa, te li fai tutti e una scrittura su LCD rallenta il tutto