Arduino con servo barometro

Grazie Guglielmo, cosi dovrebbe andare bene.

Ribuonasera a tutti, confido di trovare il questo forum, come sempre la mano per farmi uscire dalla buca che mi sono cacciato.
Sto realizzando un barometro a servo, un progetto preso in rete dall'autore Plavescki, portroppo dopo molte sere non sono ancora riuscito, ho sostituito il sensore con l'attuale BMP180, cambiato libreria, righe di programma ma purtroppo ancora nulla da fare per portare a compimento il progetto, lo skecht gira ma il servo e sempre piantato a fine corsa
Non capisco dove mi incarto
Grazie della collaborazione
Franco

#include <Wire.h>
#include <Servo.h>
#include <Adafruit_BMP085.h>

Adafruit_BMP085 mySensor;  // create sensor object called mySensor

float pressure;
Servo barServo;



void setup() 
{

     barServo.attach(9);
     mySensor.begin();   //initialize mySensor
    
}

void loop()
{

pressure=mySensor.readPressure(); //Read Pressure

if (pressure < 90135) pressure = 90135;
else if (pressure > 95653) pressure = 95653;

int press = 2450 - (int) (( pressure - 90135) / 3.06);
barServo.writeMicroseconds(press);
delay(50);
}

Ciao, non so cosa volesse fare l'autore con quelle righe di codice che ti sto dicendo, ma non credo che ce ne siano per un servo comune, per vedere se questo altro codice fa quello che vuoi.

#include <Wire.h>
#include <Servo.h>
#include <Adafruit_BMP085.h>

Adafruit_BMP085 mySensor;  // create sensor object called mySensor

float pressure;
Servo barServo;
void setup(){
  barServo.attach(9);
  mySensor.begin();   //initialize mySensor
}

void loop() {

  pressure = mySensor.readPressure(); //Read Pressure

  if (pressure < 90135) pressure = 90135;
  else if (pressure > 95653) pressure = 95653;//5500

  //int press = 2450 - (int) (( pressure - 90135) / 3.06);
  //barServo.writeMicroseconds(press);
  int press =  pressure;
  barServo.write(map(press, 90135, 95653, 0, 180));
  delay(50);
}

Pdta: Modifica il tuo codice secondo le regole del forum con "<>"

@iz3ggl : Fosse anche una sola riga, il codice va racchiuso negli appositi tag ... :roll_eyes:

... cortesemente, quindi, edita il tuo post più sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post), seleziona la parte di codice e premi l'icona </> nella barra degli strumenti per contrassegnarla come codice. Così com'è non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac all'intero del IDE). Grazie. :slight_smile:

Guglielmo

Grazie gonpezzi del tuo report, scusate ho dimenticato di inserire il link dell'autore
https://create.arduino.cc/projecthub/mircemk/arduino-servo-barometer-with-bmp085-sensor-880228?ref=user&ref_id=168805&offset=73
Grazie

@iz3ggl : Ti pregerei di fare quanto ti ho chiesto alcuni post sopra (post #3). Grazie.

Guglielmo

Ciao, ho già letto il progetto e ancora non capisco cosa vuoi fare con quelle righe commentate. Hai provato il codice che ti ho proposto?

Si, anche se ... le indentature lasciano ancora piuttosto a desiderare :grin:

Guglielmo

Ciao gonpezzi, intanto grazie per il tuo interessamento e pazienza.
Il progetto è un barometro con sensore BMP080 che utilizza come visualizzatore un servo da modellismo con scala graduata.
Ho sostituito il sensore e libreria con il BMP 180 e anche BMP280 ma lo skecth gira solo che il servo si pianta a fondo scala e li finisce.
Ho provato le tue righe ma mi da errore, no ho grandissima pratica ovviamente ho fatto altri progetti e sono sempre piu o meno andati, qui sono inchiodato
di suigito la riga di errore

barServo.write(map(press, 90135, 95653, 0, 180));

Io proverei a stampare il valore di "pressure" e verificare che sia quello che ti aspetti, solo DOPO penserei al movimento del servo ... :roll_eyes:

Inoltre, perché pressure lo dichiari float ? ? ? Nel .h della libreria, la funzione che legge la pressione è così definita:

/*!
   * @brief Gets the pressure over I2C from the BMP085
   * @return Returns the pressure
   */
  int32_t readPressure(void);

... quindi, come vedi, ti torna un 'int32_t' che, probabilmente, sei abituato a vedere come 'long', ovvero un intero a 32 bit segnato e NON un float (oltretutto la funzione map() NON funziona con i float).

Guglielmo

Oltre a quello che dice @ gpb01, sono una bestia e avevo caricato la variabile perss dalla funzione map, ecco perché ti ha dato l'errore durante la compilazione. Ho corretto il codice sopra. Ritenta.
Saluti.

ma se non erro, quella libreria che gestisce il sensore restituisce valori differenti, del tipo 99500 - 103500 rispettivamente valori che a spanna sono di minima e alta pressione (dipende dall'altitudine e dalla previsione) che vanno divisi per 100 per riportarli ai valori che usualmente trovi sulle cartine barometriche cioè in hPa.

Prova a fare la lettura / 100.

Ciao

Grazie a tutti per la collaborazione, lo sketch e partito come da vostri consigli ma il sistema a servo è troppo poco preciso e leggibile, avendo nella stessa consolle la velocita e l'angolo di rotta a big display provo a realizzare la soluzione del barometro con il max 7219 e display 7 caratteri.
Come consigliato da gpb01 ho estratto il dato dal sensore BMP180 e adesso cerco di visualizzarlo sul display, purtroppo in rete non ho trovato nulla di copiabile
Sicuramente mi incarto e vi chiedero ancora aiuto
Grazie
Franco

Dai un'occhiata qua e qua.

Ciao,
P.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.