Salve a Tutti, premetto che sono nuovo del forum, quindi se sto sbagliando qualcosa Vi prego di scusarmi.
Premetto che non sono molto bravo nella programmazione (ho fatto vari progetti semplici ma ancora niente con sensori apparte qualche datalogger). Mi sono avventurato nel provare a far accendere un led ad una determinata altitudine con BMP280 e Arduino Mega; il problema che riscontro è che nonostante la variabile "if" il led si accende e si spegne come se l'if non esistesse per niente, cosa sto sbagliando?
Vi ringrazio in anticipo per l'aiuto,
Lucio.
P.S.
Se esiste un modo di fare la stessa azione senza EEPROM sono anche più felice!
Componenti:
Arduino Mega (Atmel AtMega 2560)
BMP280
Buongiorno,
prima di tutto ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post ...
... poi, essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentartiIN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione il su citato REGOLAMENTO ... Grazie.
Guglielmo
P.S.: Il tuo post è già stato spostato nell'opportuna sezione del forum "Italiano”dove puoi proseguire la discussione. P.P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto.
Perdona ma quel codice è ... da buttare e riscrivere ...
La EEPROM non c'entra nulla, va usata quando si devono conservare dei valori anche spegnedo Arduino e ... NON è il tuo caso (oltretutto ha una vita limitata e quindi è bene usarla quando veramente serve e con cognizione di causa).
Se ho ben capito tu vuoi che arrivati ad una certa altezza si accenda un LED mentre al disotto il LED deve stare spento, quindi ...
nel setup inizializzi quello che c'è da inizializzare e null'altro
nel loop leggi in una normale variabile float il valore della pressione e: se è superiore al valore voluto, più un piccolo delta per creare un'isteresi, accendi il LED, mentre se il valore letto è inferiore al valore voluto meno un piccolo delta (sempre per avere una certa isteresi), spegi il LED.
Alla fine del loop() metti un piccolo delay() per evitare che il ciclo si ripeta troppo in fretta (il BMP NON ama letture così frequenti ... quindi ritardale)
Ok, ho riscritto il codice, adesso funziona tutto, grazie!
Dopo aver fatto ciò ho voluto aggiornare il tutto mettendo un accelerometro analogico basato su MMA7361 che quando rileva una determinata accelerazione sull'asse Z fa partire il BMP280 che comincia a controllare l'altitudine fino a quando non rileva di essere al di sotto di una soglia minima e quindi accende il led e poi ferma l'esecuzione del codice.
Per conoscere la pressione di base da cui determinare l'altezza all'inizio del codice ho inserito un'array che fa 100 campionamenti a distanza di 1 secondo l'uno dall'altro e poi calcola la media, proprio nel ciclo "for" usato per riempire l'array mi esce fuori questo errore "*expected unqualified-id before 'for' *ma non ho la più pallida idea del perchè. Potreste darmi una mano?
Grazie in anticipo,
Lucio.
P.S.
Hardware:
Arduino Mega 2560
BMP280
MMA7361 su Breakout Board
Prova a cambiare nome alla variabile "array", anche se da una veloce ricerca non sembra essere una parola riservata, ma ci sta che Arduino la ridefinisca da qualche parte.
Quando posti il codice, se come nel tuo caso è di dimensioni più che accettabili, includilo nel messaggio usando i tag , così:
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp;
Adafruit_Sensor *bmp_temp = bmp.getTemperatureSensor();
Adafruit_Sensor *bmp_pressure = bmp.getPressureSensor();
float array[100];
for (int i = 0; i < 100; i++) {
array[i] = bmp.readPressure();
delay(1000);
}
float media = 0.0;
for (int i = 0; i < 100; i++) {
media = (media + array[i]) / 2;
}
media = media / 100.0;
Serial.println(media);
void setup() {
pinMode(3, OUTPUT);
Serial.begin(9600);
bmp.begin();
}
void loop() {
int accz = analogRead(A3);
float zg = (accz * 1.5) / 245;
if (zg < 0.3) {
label:
float alt = bmp.readAltitude(media);
if (alt <= 1) {
digitalWrite(3, HIGH);
delay(1000);
digitalWrite(3, LOW);
delay(1000);
while (1);
}
goto label;
}
}
No scusa Ale ... sembra sfuggito anche a te ... più che il nome variabile ...
... che ci stanno a fare ben DUE cicli FOR ed una serie di istruzioni buttate li così, all'inizio del codice, dopo le include e NON racchiusi in alcuna funzione ? ? ? :o :o :o
... beh ... il compilatore dove dovrebbe infilare quelle righe ? ? ? :o
Ricorda che dietro, nascosto, tu hai un main() che chiama la funzione setup() e poi chiama, in un for(; ;), la funzione loop() quindi, nel .ino si aspetta di trovare solo o delle include e delle variabili o delle funzioni complete, perché, per il resto, non saprebbe dove infilare il codice
Calma, calma, calma.
Intanto grazie Ale per il suggerimento dei tag.
Poi, Guglielmo, il secondo for serviva a riprendere i valori dall'array e sommarli ogni volta alla media ma adesso ho modificato e ho inserito tutto nello stesso ciclo, grazie!
Adesso ho spostato tutto nel setup e non da più l'errore del for, il problema è che nel loop non ritrova la variabile con la pressione perchè è inserita nel setup, come posso fare?
UPDATE: Problema Risolto, ho spostato il FOR nel Setup ma ho lasciato prima di questo la variabile Media, adesso funziona tutto, grazie mille per l'aiuto!
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp;
Adafruit_Sensor *bmp_temp = bmp.getTemperatureSensor();
Adafruit_Sensor *bmp_pressure = bmp.getPressureSensor();
float valore[100];
void setup() {
pinMode(3, OUTPUT);
Serial.begin(9600);
bmp.begin();
float media = 0.0;
for (int i = 0; i < 100; i++) {
valore[i] = bmp.readPressure();
media = (media + valore[i]) / 2;
delay(1000);
}
media = media / 100;
}
void loop() {
int accz = analogRead(A3);
float zg = (accz * 1.5) / 245;
if (zg < 0.3) {
label:
float alt = bmp.readAltitude(media);
if (alt <= 1) {
digitalWrite(3, HIGH);
delay(1000);
digitalWrite(3, LOW);
delay(1000);
while (1);
}
goto label;
}
}
Allora, risolto questo problema ho voluto aggiungere l'ennesima complicazione :D, mettere un lettore sd che prenda il valore di altezza a cui accendere il led da un numero in un file .json e lo salvi in una string poi convertita in int.
Ho provato a leggere i dati sia con file.read() sia con file.readString(), file.read mi restituisce sempre -1 e file.readString non mi funziona per niente, suggerimenti?
Grazie in anticipo,
Lucio