LENTEZZA HC-06

salve a tutti, ho preparato questo programma che funziona alla meraviglia, ma come potete capire dal titolo il modulo BT che uso reagisce veramente male

ecco il programma

#include <SoftwareSerial.h>
#include <Servo.h> 
#define echoPin 2                            
#define trigPin 3
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

 LiquidCrystal_I2C lcd(0x27,16,2);
 SoftwareSerial BluetoothSerial = SoftwareSerial(0, 1); //si richiama il modulo bluetooth
 Servo myservo;
 
 
 const int input1m1 = 9; //input1 per il motore 1
 const int input2m1 = 10;//input2 per il motore 2
 const int enablem1 = 11;//regolatore motore 1
 char marcia;
 int velmotore = 0;
 int i;
 float temp;
 int tempPin = 0;
 
void setup() {
   Serial.begin(9600);
   BluetoothSerial.begin(9600);
   pinMode(echoPin, INPUT);
   pinMode(trigPin, OUTPUT);
   pinMode(input1m1, OUTPUT);
   pinMode(input2m1, OUTPUT);
   pinMode(enablem1, OUTPUT);
   pinMode(4, OUTPUT);                   //FRECCE SX
   pinMode(5, OUTPUT);                   //FRECCE DX
   pinMode(6, OUTPUT);                   //LUCI
   pinMode(7, OUTPUT);                   //CLACSON
   myservo.attach(13); 
   myservo.write(120);
   lcd.init();  
   lcd.backlight();
}

void loop() {
 if (BluetoothSerial.available()){
    marcia=BluetoothSerial.read(); 
    
if(marcia=='1'){velmotore = 25;}         //VENGONO LETTE LE MARCE E SI IIMPOSTA LA VELOCITA'
if(marcia=='2'){velmotore = 51;}
if(marcia=='3'){velmotore = 76;}
if(marcia=='4'){velmotore = 102;}
if(marcia=='5'){velmotore = 127;}
if(marcia=='6'){velmotore = 153;}
if(marcia=='7'){velmotore = 178;}
if(marcia=='8'){velmotore = 204;}
if(marcia=='9'){velmotore = 229;}
if(marcia=='q'){velmotore = 254;}

    
if(marcia== 'U'){                      //MODALITA' AUTOMATICA
do
{
 digitalWrite(trigPin, LOW);           // si imposta il trigpin spento per 2 microsecondi
 delayMicroseconds(2);
 digitalWrite(trigPin, HIGH);          //invia per 10 microsecondi un segnale
 delayMicroseconds(10);
 digitalWrite(trigPin, LOW);           // si spegne il trigpin
 int tempo=pulseIn(echoPin, HIGH);     // si legge il segnale (distanza in tempo <x>)
 int distance= tempo/58;                   // si usa la formula s= v * t/2 (v è la velocità del suono= 0.343 cm/microsecondo)
                                       //(si usa t/2 perchè t è il tempo impiegato per giungere sull’oggetto e tornare al sensore quindi il valore di t ottenuto deve essere diviso per 2)

if((distance>30)&&(distance!=0)){      //CAMPO LIBERO  (a volte arrivano degli zeri e quelli non li devo prendere in considerazione)
 digitalWrite(input1m1,HIGH);          // l' auto procede
 digitalWrite(input2m1,LOW);
 analogWrite(enablem1, 125);
 myservo.write(120);            }
   
if((distance<30)&&(distance!=0)){      //CAMPO OSTACOLATO: il motore va avanti cambiando direzione
 digitalWrite(input1m1, HIGH); 
 digitalWrite(input2m1, LOW);
 analogWrite(enablem1, 125);
 myservo.write(190);
 digitalWrite(7,HIGH);
 delay(500);
 digitalWrite(7,LOW);
 delay(500);                     }
 
if(BluetoothSerial.available()&&BluetoothSerial.read()=='u') //CONDIZIONE DI USCITA DALLA MODALITA' AUTOMATICA
 {goto fuori;}

} while(marcia=='U');                 //CONDIZIONE NECESSARIA PER IL PROSEGUO DELLA MODALITA' AUTOMATICA
}
fuori:


if(marcia=='W'){                     //LUCI
 digitalWrite(6,HIGH);
               }  
if(marcia=='w'){
 digitalWrite(6,LOW);
               }

if(marcia=='V'){                    //CLACSON
 digitalWrite(7,HIGH);
               }  
if(marcia=='v'){
 digitalWrite(7,LOW);
               }  
   
if(marcia=='X'){                   //4 FRECCE
                                //il comando persiste finchè non giunge il comando di uscita
 digitalWrite(4,HIGH);             //freccia sx
 digitalWrite(5,HIGH);             //freccia dx
}
if(marcia=='x'){ 
  digitalWrite(4,LOW);
 digitalWrite(5,LOW);
}

if(marcia=='F'){                   //AVANTI
 digitalWrite(input1m1, HIGH);     //vengono impostati i valori per i quali il motore va avanti
 digitalWrite(input2m1, LOW);
 analogWrite(enablem1, velmotore); //si imposta la velocità grazie al pin PWM
 Serial.print("avanti");
               }
else{
   analogWrite(enablem1, 0);       //senza comando il motore si ferma
    }
  
if(marcia=='B'){                   //INDIETRO
 digitalWrite(input1m1, LOW); //vengono impostati i valori per i quali il motore va indietro
 digitalWrite(input2m1, HIGH);
 analogWrite(enablem1, velmotore); //si imposta la velocità grazie al pin PWM
               }
               
if(marcia=='L'){                   //SINISTRA
 myservo.write(70);
               }
else{                              //senza comando il servomotore non sterza
 myservo.write(120);
 
    }
    
 if(marcia=='R'){                  //DESTRA
 myservo.write(190);

                }
     
if(marcia=='G'){                   //AVANTI A SINISTRA
 digitalWrite(input1m1, HIGH);
 digitalWrite(input2m1, LOW);
 analogWrite(enablem1, velmotore);
 myservo.write(70);
  }
  
if(marcia=='I'){                   //AVANTI A DESTRA
 digitalWrite(input1m1, HIGH);     //vengono impostati i valori per i quali il motore va avanti
 digitalWrite(input2m1, LOW);
 analogWrite(enablem1, velmotore); //si imposta la velocità grazie al pin PWM
 myservo.write(190);
               }
  
if(marcia=='H'){                   //INDIETRO A DESTRA
 digitalWrite(input1m1, LOW);
 digitalWrite(input2m1, HIGH);
 analogWrite(enablem1, velmotore);
 myservo.write(190);
  }
  
if(marcia=='J'){                  //INDIETRO A SINISTRA
 digitalWrite(input1m1, LOW);     //vengono impostati i valori per i quali il motore va indietro
 digitalWrite(input2m1, HIGH);
 analogWrite(enablem1, velmotore); //si imposta la velocità grazie al pin PWM
 myservo.write(70);
               }
temp = analogRead(tempPin);
temp = temp * 0.48828125;
lcd.setCursor(0, 0);
lcd.print("Progetto ROVER");
lcd.setCursor(0, 1);
lcd.print("Temper.: ");
lcd.print(temp);
lcd.print((char)223);
lcd.print("C");
 }
 else{
  lcd.clear;
  lcd.setCursor(0, 0);
  lcd.print("Progetto ROVER");
  lcd.setCursor(0, 1);
  lcd.print("no conessione");
 }
}

in pratica le ultime funzioni che ho aggiunto sono: LCD e Sens.Temperatura
prima dell aggiunta di queste due il programma era perfetto, e reagiva subito (quando era lento aveva 0.5 sec di ritardo) ora invece se invio un impulso parte dopo 4/5 sec

come mai? ho sovraccaricato troppo il programma?
ci sono possibili soluzioni che non prevedano eliminare le ultime due funzioni?
grazie

scusate l'up, ma nessuno sa come aiutarmi?

I pin 0 e 1 sono occupati dalla seriale hardware, evita di usarli se possibile. Usa altri pin per il Bluetooth.

ok ma ho sempre usato quelli ed è sempre stato veloce, come mai ora è rallentato di colpo?

comunque se non avete nulla in contrario lo scrivo anche nella sezione hardware, magari loro ne sanno qualcsa in piu

Clash230: in pratica le ultime funzioni che ho aggiunto sono: LCD e Sens.Temperatura prima dell aggiunta di queste due il programma era perfetto, e reagiva subito (quando era lento aveva 0.5 sec di ritardo) ora invece se invio un impulso parte dopo 4/5 sec

Innanzi tutto è meglio capire quali di quelle 2 cose che hai aggiunto da problemi. Quindi prova a togliere la parte lcd e lasciare il sensore e poi il contrario e quindi discriminare "quale" dei due da problemi.

AGGIORNAMENTO: ho fatto delle prove, e ho notato che il rallentamento si verifica quando sta questo codice

temp = analogRead(tempPin);
   temp = temp * 0.48828125;
   lcd.setCursor(0, 0);
   lcd.print("Progetto ROVER");
   lcd.setCursor(0, 1);
   lcd.print("Temper.: ");
   lcd.print(temp);
   lcd.print((char)223);
   lcd.print("C");

come mai?

Li ci sono lcd e lettura analogica. Cosa ti ho suggerito ? Escludi uno dei due per discriminare. Altrimenti che ti possiamo dire ? Mica siamo li con te per poter fare prove.

Clash230: comunque se non avete nulla in contrario lo scrivo anche nella sezione hardware, magari loro ne sanno qualcsa in piu

No, è proibito aprire più thread relativi allo stesso argomento e ... chi legge li legge anche qui!

Guglielmo

Clash230: magari loro ne sanno qualcsa in piu

Siamo sempre gli stessi. :)

ho visto rallenta con la parte di codice dell LCD

E' un lcd I2C. L'utente Testato ha modificato quella libreria per renderla più veloce. Se cerchi un suo post, in calce c'e' il link alla sua libreria. Non è detto che funzioni.

mi puoi mettere il link gentilmente?

Sarà anche più veloce, ma in ogni caso quelle righe non dovrebbero impiegare più di una frazione di secondo...

Comunque hai dimenticato delle parentesi, anche se non è certo questo che causa la lentezza:

lcd.clear;

deve essere:

lcd.clear();

Questo invece che senso ha???

lcd.print((char)223);

Clash230: mi puoi mettere il link gentilmente?

http://forum.arduino.cc/index.php?action=profile;u=30421

Questo invece che senso ha??? Code: [Select] lcd.print((char)223);

questo è il codic per il segno dei gradi

comunque ho provato la libreria di testato, la pcf.....

niente stesso problema