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? :slight_smile:
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 :wink:

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