problema software Centralina meteo Esame di stato

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h> // libreria sensori generale adafruit
#include <Adafruit_TSL2561_U.h> // libreria per TSL
#include <Adafruit_GFX.h> // libreria display generale
#include <Adafruit_PCD8544.h> // libreria per il 5110
#include <Adafruit_BME280.h> // libreria del bme280
#include "Adafruit_SI1145.h" // libreria si1145

#define SEALEVELPRESSURE_HPA (1001.25) // dichiarazione del valore di pressione al livello del mare giornagliera ( oppure ogni ora)
//tsl
Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345);
//si
Adafruit_SI1145 uv = Adafruit_SI1145();
//display
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3); // dichiarazione pin software spi da usare per il display
//bme280
Adafruit_BME280 bme; // I2C
/*=======================================================*/
// variabili globali da poter usare in altre funzioni
byte secondi = 0; // secondi del interupt
byte minuti = 0;  // minuto del interupt
byte humid;  // umidita 0..256
byte UV;  // uv 0..256
float temp; 
unsigned int Slm=0,IR,Vis;
unsigned long int LUX; // lux deve arrivare ad un massimo di 65556
unsigned int pressure; // arriva a massimo 1100 e minimo 300
/*========================================================*/
void configtimer_1(void) {  // può essere sostituita da queste funzioni nel setup :  Timer1.initialize() e nel setup Timer1.attachInterrupt( timerIsr )
  cli();//stop timer        // inserendo nelle parentresi del Timer1.inizialize il tempo in microsecondi.

  //SET TIMER1 A 1HZ
  TCCR1A = 0; // SET REGISTER TCCR1a TO 0
  TCCR1B = 0;
  TCNT1 = 0;
  //SET COMPARE MATCH REGISTER PER 1HZ
  OCR1A = 15624; // (16*10^6) / (1*1024) - 1
  //TURN ON CTC MODE
  TCCR1B |= (1 << WGM12);
  //SET CS10 AND CS12 BITS FOR 1024 PRESCALLER
  TCCR1B |= (1 << CS12) | (1 << CS10);
  // ENABLE TIMER COMPARE INTERRUPT
  TIMSK1 |= (1 << OCIE1A);

  sei();//start timer
}
/*========================================================*/
//configurazione tsl2561 luxmetro
void configureSensorTSL2561(void)
{
  /* You can also manually set the gain or enable auto-gain support */
  // tsl.setGain(TSL2561_GAIN_1X);      /* No gain ... use in bright light to avoid sensor saturation */
  // tsl.setGain(TSL2561_GAIN_16X);     /* 16x gain ... use in low light to boost sensitivity */
  tsl.enableAutoRange(true);            /* Auto-gain ... switches automatically between 1x and 16x */
  /* Changing the integration time gives you better sensor resolution (402ms = 16-bit data) */
  //tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS);      /* fast but low resolution */
  tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_101MS);  /* medium resolution and speed   */
  //tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_402MS);  /* 16-bit data but slowest conversions */
}// fine funzione configurazione sensore tsl2561

/*========================================================*/
void inizializzazione_sensori_e_controllo(void) { //funzione per il controllo dei sensori a bordo ed il loro corretto funzionamento
  display.display();  // funzione display
 // display.clearDisplay();// pulisce schermo
  if (!tsl.begin())
  {
    display.println("Didn't find tsl2561");//mostro sul display
    delay(1000);
    display.clearDisplay();// pulisce schermo
    //while (1);
  }
  if (!uv.begin()) {
    display.println("Didn't find Si1145");// mostro sul display
    delay(1000);
    display.clearDisplay();// pulisce schermo
    //while (1);
  }
  if (!bme.begin()) {
    display.println("Didn't find bme280");// mostro sul display
    delay(1000);
    display.clearDisplay();// pulisce schermo
    //while (1);
  }
}// fine funzione inizializzazione
/*========================================================*/
void config_display(void) {
  display.begin();
  display.setContrast(50);
  display.setTextSize(1);
  display.setTextColor(BLACK);
  display.clearDisplay();// pulisce schermo
}// funzione configurazioen display
/*========================================================*/
void rilevazione_valori() {
  temp = (bme.readTemperature());
  pressure = (bme.readPressure() / 100.0F);
  Slm = (bme.readAltitude(SEALEVELPRESSURE_HPA));
  humid = bme.readHumidity();
  
  //generazione dato tsl2561/ generazione dati luxmetro
  sensors_event_t event;
  tsl.getEvent(&event);
  LUX = (event.light);

  UV = (uv.readUV() / 100); //generazione dato uv
  Vis = (uv.readVisible()); // generazione dato vis nm
  IR = (uv.readIR());  // generazione dato IR nm
}
/*========================================================*/
void show_value_on_display(float temp, unsigned int pressure, byte humid, unsigned long int LUX, byte UV, unsigned int Slm, unsigned int IR, unsigned int Vis) {
  display.display();     // VA USATA PRIMA DI USARE FUNZIONI DISPLAY
  display.clearDisplay();// pulisce schermo
  display.print("T="); display.print(temp,1);  //valori bme280
  display.print(" P="); display.println(pressure);  //valori bme280
  display.print("H%="); display.print(humid,1);  //valori bme280
  display.print("LX="); display.println(LUX);    // printo valore lux
  display.print("UV="); display.print(UV);      // printo valore uv
  display.print(" Slm="); display.println(Slm);  // altezza sul livello del mare
  display.print("Vi="); display.print(Vis);// printo valore lunghezzo d'onda del visibile (nM)
  display.print("IR="); display.println(IR);
}//fine show display
/*========================================================*/
void elaborazione_dati(float temp, unsigned int pressure, byte humid, unsigned long int LUX, byte UV) {

  // elaborazione valori umidità
  int controll = humid; // assegno a controll il valore di humid
  if (controll <= 35) display.print("Sec/");
  if (controll >= 40 && controll <= 60) display.print("Con/");
  if (controll >= 65 && controll <= 100) display.print("Umi/");
  else if ( (controll > 60 && controll < 65) || ( controll > 35 && controll < 40) ) display.print("XX/");
  // elaborazione valori presisone
  controll = pressure; //assegno a controll il valore di pressione rilevato
  if (controll <= 950) display.print("Pio/");
  if (controll >= 980 && controll <= 1000) display.print("Var/");
  if (controll >= 1020) display.print("BelT/");
  else if ( (controll > 950 && controll < 980) || (controll > 1000 && controll < 1020) ) display.println("XX");
  //elaborazione valori temperatura immessi su riga nuova
  controll = temp; // assegno a controll il valore di temp rilevato
  if (controll < 0 ) display.println("Vcold");
  if (controll < 20) display.println("Cold");
  if (controll > 25) display.println("Hot");
  if (controll > 20 && controll <= 25) display.println("OkT/");
  //elaborazione valore UV
  controll = UV; // assegno a controll il valore di UV rilevato
  if (controll <= 4) display.print("NoSSneed/");
  if (controll >= 5 && controll <= 7) display.print("PutSoSS/");
  if (controll > 7) display.print("PUT SS!/");
  //elaborazione dati lux
  controll = LUX; // assegno a controll il valore di LUX rilevato
  if (controll >= 6 && controll <= 40 ) display.println("SunR");
  if (controll > 40) display.println("Sun");
  if (controll < 6) display.println("Night");
}// fine funzione elaborazione
/*========================================================*/

void setup() {

  Serial.begin(9600);  // avvio la seriale tx rx
  config_display();   //inizializzazione display;
  inizializzazione_sensori_e_controllo();  //setup controllo sensori e avvio.
  configureSensorTSL2561();// configurazione tsl2561
  configtimer_1();    // il timer funziona 1hz = acquisizione ogni secondo
}
/*========================================================*/
void loop() {
  rilevazione_valori();
  show_value_on_display(temp, pressure, humid, LUX, UV, Slm, IR, Vis); //mostro sul display i valori
  elaborazione_dati(temp, pressure, humid, LUX, UV); // elaborazione dati
  delay(200);
}
/*========================================================*/
ISR(TIMER1_COMPA_vect) { // timer 1 interupt

  secondi = secondi + 1;
  if (secondi == 60) {
    secondi = 0;
    //Serial.print(minuti); Serial.println("minuti");   // funziona!
    // manda dati via seriale  // testato funziona
    Serial.print(temp);
    Serial.print(pressure);
    Serial.print(humid);
    Serial.print(LUX);
    Serial.println(UV);
  }// if secondi
}//fine interupt

/*========================================================*/

qualche foto :

Buonasera, essendo il tuo primo post, ti chiederei cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Nel regolamento è spiegato come "allegare" le foto ... che nel tuo post NON si vedono (in quel modo non puoi mettere quelle che hai nella tua macchina, ma solo quelle che sono in rete)

Ad un post come il tuo difficilmente risponderà qualcuno, dato che qui nessuno ha "la palla di vetro" ...

... quindi, vedi di descrivere quale problema riscontri, su che Arduino, su che sistema operativo, con che versione dell'IDE, ecc. ecc.

Guglielmo

scusate il fatto che non mi sono presentato, ma sono davvero un po alterato in quanto il limite dei 9mila caratteri è in primis una restrizione enorme e non ho potuto postare il mio messaggio oltre al codice.

secondo: ho usato la funzione id condivisione del link di Gdrive, e dunque ho usato la funzione di ''condivisione delle foto tramite link'' del forum, ed esse non vengono comunque visualizzate. ( ovviamente non ho provato a caricare foto dal desktop.. avendo tutto online)

il problema che ho è il seguente:

pur copiando bene le istruzioni per il ''controllo '' del sensore, ovvero quelle istruzioni che verificano il corretto avviamento del sensore e quindi la sua presenza nel circuito, esse vengono ignorate ed il programma invece di fermarsi e ''printare'' sul display il messaggio di errore, procede come nulla fosse ( pur essendo la funzione di controllo nel ''setup'' ed ho provato anche a farla girare nel loop)

indicandomi o il valore massimo ( nel caso del tsl2561 luxmetro) oppure valore 0 .

ho provato diversi modi per ''interrompere '' il programma usando ad esempio un ciclo while(1) dopo che è entrato nella condizione di ''if''

esempio:

if (!bme.begin){ whille(1){... } } senza successo, ho provato a farla girare nel loop, sperando me lo ripetesse ( pensando fosse il fatto che viene eseguito una sola volta nel setup) ma senza successo .

poi ho provato anche con un inserendo subito nella condizione di ''if'' un delay molto grande in modo che potessi vederlo sullo schermo nel caso apparisse, ma niente.

qualcuno ha gia avuto questo problema sui moduli adafruit?

Potresti vedere cosa ritorna il metodo begin() di quei sensori, creare delle variabili e mettere il valore in esse e, prima del IF, stampare detto valore così da capire cosa veramente accade.

Guglielmo

ho provato piu semplicemente ad associare ad ogni ''!='' di ogni if per ogni sensore, un errore proprio esempio

if(!=bme.begin){ errore=1; }

andando a modificare una variabile globale , per 1 volta soltanto con un delay di 500 , ho visto sullo schermo che ha printato ''errore bme'' , poi mai più.

il bello è che il programma di test dei sensori funziona, ma nella funzione dove testo i sensori non ho strane ''clearDisplay'' che mi vadano a cancellare prima di poter vedere il messaggio di errore.

poi nel main ho messo:

if(errore!=0){

if(errore==1) printa errore di... if(errore==2) printa errore di... if(errore==3) printa errore di... } else if( errore ==0){

la roba del loop e funzioni varie..

}

e comunque non mostra nulla pur dovendo controllare il valore di ''errore'' ogni volta ( ed avevo un modulo staccato)

  1. prima di continuare a scrivere fai quanto ti ho chiesto nel mio primo post

  2. allega tutto il programma come ti ho già detto

Guglielmo

quello è gia tutto il programma, e posso rispondere stranamente soltanto ogni 5 minuti ( veramente una brutta cosa.. )

l'ho allegato nel primo messaggio.

è la versione 4, una versione priva di modifiche essenziali ma dove è comunque presente anche cosi il problema del controllo dei sensori.

ho evitato di postare la versione 5 poiche avevo fatto modifiche senza commenti e non volevo rischiare che qualcuno non capisse il codice.

Come spiegato ... ... i limiti di dimensione sono fissati a 9K per il post, 1.5K per allegati e, fino a quando NON raggiungi un certo numero di post, per limitare gli spammer, hai anche dei limiti temporali.

Detto questo ... o fai quanto richiesto nel post #1 (... il tempo lo hai avuto) o mi vedo costretto a bloccare questo ed altri thread fino a quando non verrà rispettato il regolamento.

Guglielmo

ma guardi, con tutto il rispetto, se un forum deve rispettare ste regole preistoriche possiamo anche salutarci qui, queste regole c'erano quando ero piccolo io / 16 anni fa, pensavo si fosse passato ad una piu rapida e completa interazione tra gli utenti che cosi A QUANTO PARE NON è

può anche metterselo su per il sedere questo post ^^ con TUTTO IL RISPETTO SI INTENDE

.....

pippopippo95: se un forum deve rispettare ste regole preistoriche possiamo anche salutarci qui...

Che io sappia le regole date dall'EDUCAZIONE non vanno in "prescrizione".

Ci salutiamo qui.

addio pippo72

Mah, che dire ... ... utente bannato, thread chiuso.

Guglielmo