aiuto ! software che smette di funzionare a temperature alte è lui?

ho fatto un accrocchio che tengo in macchina un modulo led a 8 cifre
dopo qualche tempo di funzionamento la temperatura non viene più aggiornata
il modulo visualizza nelle due cifre centrali e nelle 2 di destra visualizzano la temperatura delle sonde in gradi

tutto funziona correttamente ma a volte le temperature si “bloccano” sul display che può essere?

arduino uno, sonde DS18B20

#include <OneWire.h>
#include <DallasTemperature.h>
#include "LedControl.h"
#include <EEPROM.h>

LedControl lc = LedControl(10, 12, 8, 1);

#define ONE_WIRE_BUS 2  // Data wire is plugged into pin 2 on the Arduino 
OneWire oneWire(ONE_WIRE_BUS); 
DallasTemperature sensors(&oneWire);
DeviceAddress tmp_address;
int numberOfDevices = 2 ;
int temp_iniettori ;
int temp_riduttore;
 
unsigned long previousMillis = 0;   

const long interval_press = 1000;
int pressione = 1; 



int prima_cifra_da_destra_sonda;
int seconda_cifra_da_destra_sonda;
int terza_cifra_da_destra_sonda;
int quarta_cifra_da_destra_sonda;
int quinta_cifra_da_destra_sonda;
int sesta_cifra_da_destra;
int settima_cifra_da_destra;
int ottava_cifra_da_destra;


int lettura_sonda_i = 0;
int lettura_sonda_r = 0;
int lettura_pressione;
int basso_luminosita = 0;
void setup() {

   sensors.begin();
lc.shutdown(0, 1);
     delay (11);

pinMode (5, OUTPUT);  // spegnimento sens temp
pinMode (7, INPUT);  //pulsante 
     digitalWrite (7,HIGH);
     lc.shutdown(0, 0);

       lc.setChar(0,7,'-',false),
       lc.setChar(0,6,'-',false),
       lc.setChar(0,5,'-',false),
       lc.setChar(0,4,'-',false),
       lc.setChar(0,3,'-',false),
       lc.setChar(0,2,'-',false),
       lc.setChar(0,1,'-',false),
       lc.setChar(0,0,'-',false),
       delay (600);
       lc.setChar(0,7,' ',false),
       lc.setChar(0,6,' ',false),
       lc.setChar(0,5,' ',false),
       lc.setChar(0,4,' ',false),
       lc.setChar(0,3,' ',false),
       lc.setChar(0,2,' ',false),
       lc.setChar(0,1,' ',false),
       lc.setChar(0,0,' ',false);
     
     delay (6);
     digitalWrite (5,HIGH); //accensione sens temperatura
basso_luminosita =  EEPROM.read(777) ;
  lc.setIntensity(1,basso_luminosita);

}

void loop() {

if (digitalRead (7)  == LOW && basso_luminosita >1)
    basso_luminosita = 0,
    lc.setIntensity(0,basso_luminosita),
    EEPROM.write(777,0),
    delay (300);
if (digitalRead (7)  == LOW && basso_luminosita == 0)
    basso_luminosita = 9,
    lc.setIntensity(0,basso_luminosita),
    EEPROM.write(777,9),
    delay (300);
   
    
    lc.shutdown(0, 0);
    lc.setIntensity(0,basso_luminosita);
 sensors.requestTemperatures(); // Comando per misurare la temp.

    delay (1);
  unsigned long currentMillis = millis();

    if (pressione == 0 && currentMillis - previousMillis >= interval_press)
     pressione = 1,
    previousMillis = currentMillis;
////////// 2 cifre sx  /////////////////////////
   if (pressione == 1 ){
    lettura_pressione = analogRead(3);
    lc.shutdown(0, 0);
  lettura_pressione = map(lettura_pressione, 0, 1023, 0, 50);
    lettura_pressione = lettura_pressione / 2 - 1;

  settima_cifra_da_destra = lettura_pressione % 10;

  lettura_pressione = lettura_pressione / 10;
  ottava_cifra_da_destra = lettura_pressione % 10;
  
// lc.setChar(0,7,' ',false);
// lc.setChar(0,6,' ',false);
// lc.setChar(0,5,' ',false);

  lc.setDigit(0, 7, (byte)ottava_cifra_da_destra , true);
  lc.setDigit(0, 6, (byte)settima_cifra_da_destra , false);
  pressione = 0;
}
  //////////////////////////////////////////////////////
////////// 2 cifre centrali  /////////////////////////


 temp_riduttore = sensors.getTempCByIndex(1);
 quarta_cifra_da_destra_sonda = lettura_sonda_r % 10;

  lettura_sonda_r = lettura_sonda_r / 10;
  quinta_cifra_da_destra_sonda = lettura_sonda_r % 10;
 
  lettura_sonda_r = temp_riduttore;//temperatura riduttore
// lc.setChar(0,4,' ',false);
// lc.setChar(0,3,' ',false);
  lc.setDigit(0, 4, (byte)quinta_cifra_da_destra_sonda , false);
  lc.setDigit(0, 3, (byte)quarta_cifra_da_destra_sonda, false);

/////////////////////////////////////////



 temp_iniettori = sensors.getTempCByIndex(0);
  prima_cifra_da_destra_sonda = lettura_sonda_i % 10;

  lettura_sonda_i = lettura_sonda_i / 10;
  seconda_cifra_da_destra_sonda = lettura_sonda_i % 10;
 
  lettura_sonda_i = temp_iniettori;//temperatura riduttore

  lc.setDigit(0, 1, (byte)seconda_cifra_da_destra_sonda , false);
  lc.setDigit(0, 0, (byte)prima_cifra_da_destra_sonda, false);

}

ciao,

confermi che quanto scritto ad inizio loop è quello che vuoi veramente fare!?

if (digitalRead (7)  == LOW && basso_luminosita >1)
    basso_luminosita = 0,
    lc.setIntensity(0,basso_luminosita),
    EEPROM.write(777,0),
    delay (300);
if (digitalRead (7)  == LOW && basso_luminosita == 0)
    basso_luminosita = 9,
    lc.setIntensity(0,basso_luminosita),
    EEPROM.write(777,9),
    delay (300);
   
   
    lc.shutdown(0, 0);
    lc.setIntensity(0,basso_luminosita);
 sensors.requestTemperatures(); // Comando per misurare la temp.

    delay (1);
  unsigned long currentMillis = millis();

    if (pressione == 0 && currentMillis - previousMillis >= interval_press)
     pressione = 1,
    previousMillis = currentMillis;

Non capisco questo calcolo:

  temp_riduttore = sensors.getTempCByIndex(1);
  quarta_cifra_da_destra_sonda = lettura_sonda_r % 10;          // ma viene scritto sotto !!!
  lettura_sonda_r = lettura_sonda_r / 10;
  quinta_cifra_da_destra_sonda = lettura_sonda_r % 10;
  lettura_sonda_r = temp_riduttore;//temperatura riduttore

Lavori su lettura_sonda_r ma gli assegni il valore da temp_riduttore ma DOPO i calcoli ??

P.S. che bruttura l'uso delle virgole per evitare le graffe.

>elrospo: ... anche se il compilatore accetta un obbrobbrio del genere, se non sistemi il codice togliendo quelle virgole, che NON si possono vedere, e metti le graffe ... ti BANNO a vita ... :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

Guglielmo

Altro suggerimento, usa i cicli for (cosi levi anche quelle altre virgole brutte)
invece di 8 righe:

       lc.setChar(0,7,'-',false),
       ...
       lc.setChar(0,0,'-',false),

solo 1 riga:

  for(int i=7;i<=0;i--) lc.setChar(0,i,'-',false);

ORSO2001:
ciao,

confermi che quanto scritto ad inizio loop è quello che vuoi veramente fare!?

if (digitalRead (7)  == LOW && basso_luminosita >1)

basso_luminosita = 0,
    lc.setIntensity(0,basso_luminosita),
    EEPROM.write(777,0),
    delay (300);
if (digitalRead (7)  == LOW && basso_luminosita == 0)
    basso_luminosita = 9,
    lc.setIntensity(0,basso_luminosita),
    EEPROM.write(777,9),
    delay (300);
 
 
    lc.shutdown(0, 0);
    lc.setIntensity(0,basso_luminosita);
sensors.requestTemperatures(); // Comando per misurare la temp.

delay (1);
  unsigned long currentMillis = millis();

if (pressione == 0 && currentMillis - previousMillis >= interval_press)
    pressione = 1,
    previousMillis = currentMillis;

in caso non fosse chiaro, ovviamente sull'accrocchio ho messo un pulsante (digitalRead (7) )

che se viene premuto memorizza 9 oppure 0 sulla memoria 777 che poi viene letta e imposta la luminosità del display MA QUESTO NON DA NESSUN PROBLEMA

il problema e che dopo ore di funzionamento le temperature si bloccano, ma se resetto il micro
tutto riprende a funzionare :o

nid69ita:
Non capisco questo calcolo:

  temp_riduttore = sensors.getTempCByIndex(1);

quarta_cifra_da_destra_sonda = lettura_sonda_r % 10;          // ma viene scritto sotto !!!
  lettura_sonda_r = lettura_sonda_r / 10;
  quinta_cifra_da_destra_sonda = lettura_sonda_r % 10;
  lettura_sonda_r = temp_riduttore;//temperatura riduttore



Lavori su lettura_sonda_r ma gli assegni il valore da temp_riduttore ma DOPO i calcoli ??


.

che ci vedi di sbagliato?

elrospo:
che ci vedi di sbagliato?

prendi la quarta e quinta cifra di una variabile che viene assegnata DOPO
quindi così x me ha senso

temp_riduttore = sensors.getTempCByIndex(1);

 lettura_sonda_r = temp_riduttore;   // spostato qui

 quarta_cifra_da_destra_sonda = lettura_sonda_r % 10;         
 lettura_sonda_r = lettura_sonda_r / 10;
 quinta_cifra_da_destra_sonda = lettura_sonda_r % 10;

P.S. e non serve a nulla avere quel doppio passaggio.
Tanto vale usare una variabile sola, locale, che non occupa memoria globale:

  int lettura_sonda_r  = sensors.getTempCByIndex(1);
  quarta_cifra_da_destra_sonda = lettura_sonda_r % 10;         
  lettura_sonda_r = lettura_sonda_r / 10;
  quinta_cifra_da_destra_sonda = lettura_sonda_r % 10;

Per il blocco, non sono esperto di collegamento sensori Dallas, ma sulla lettura analogRead la fai solo ogni 1 secondo,
(che sensore c'e' collegato ?? di pressione ? quale ?) mentre i dallas li leggi di continuo, senza pause.
Non è che a forza di fare letture senza pausa i Dallas si rompono i maroni ? ;D

Ma basso_luminosita o è 9 oppure 0 nel programma.
Quindi metti a posto quel doppio if, primo con le virgole è difficile da leggere e poi avendo solo 2 stati/valori:

if (digitalRead (7)  == LOW )
{ basso_luminosita = (basso_luminosita>0 ? 0 : 9);   // se >0 assegni 0 else 9
  lc.setIntensity(0,basso_luminosita);
  EEPROM.write(777,basso_luminosita);
  delay (300);
}

nid69ita:
Per il blocco, non sono esperto di collegamento sensori Dallas, ma sulla lettura analogRead la fai solo ogni 1 secondo,
(che sensore c'e' collegato ?? di pressione ? quale ?) mentre i dallas li leggi di continuo, senza pause.
Non è che a forza di fare letture senza pausa i Dallas si rompono i maroni ? ;D

adesso ho modificato in modo che tutti i sensori vengono letti una volta al secondo che basta e avanza,
vediamo un po che succede,

il micro deve fare solo questo sketch,

per le virgole non so perche adesso sono diventate indigeste :o ho sempre fatto cosi

elrospo:
.. per le virgole non so perche adesso sono diventate indigeste :o ho sempre fatto cosi

... posso essere sincero? Sono un'emerita porcheria e ti sconsiglio caldamente di usarle! Impara a scrivere il codice come si deve e come gli standard insegnano e lascia stare queste forme molto poco usate ed, in alcuni ambienti, proprio proibite. La leggibilità del codice ne guadagna e si riduce la possibilità di errori.

Guglielmo