Buonasera,
dopo vari test non sono riuscito a trovare una soluzione quindi chiedo aiuto a voi. L'algoritmo è molto semplice, un cronometro e delle letture di temperatura, ma arduino "freeza" in modo random
Hardware Utilizzato:
- Arduino Nano;
- Ssd1309 (libreria ssd1306, modalità i2c);
-ds18b20;
-max31855 (rimosso);
leggendo sul forum ho testato varie soluzioni come :
- Dividere il main loop in varie funzioni;
- Evitare la classe string;
- Ottimizzare il codice;
inoltre, ho testato il codice su diversi arduino nano ed uno, oltre a cambiare schermo (ssd1309 con libreria ssd1306, utilizzato in modalità i2c). Ovviamente ho provato il tutto senza componenti, ovvero solo con arduino, e sono incappato nello stesso problema. Per scrupolo, ho testato un semplice algoritmo che stampa millis() sull'ssd1309 per vedere se il problema fosse a livello di librerie, ma testato per oltre un'ora non ha dato problemi.
L'
questo è il codice, ci sono variabili inutilizzate che provengono dal codice completo che ho cercato di ottimizzare.
#include <Adafruit_SSD1306.h>
#include <splash.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 4
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature temp(&oneWire);
DeviceAddress tempDeviceAddress;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
volatile float t1=0;
volatile float tlast=0;
volatile float tbest=0;
volatile float x0=0;
volatile int giro=0;
float lastTime= millis();
float tempc=0;
float x=0;
int y=0;
float x1=0;
int y1=0;
float x2=0;
int y2=0;
float flag=0;
void setup() {
delay(100);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
attachInterrupt(0, tempo, FALLING);
temp.begin();
temp.setResolution(tempDeviceAddress, 9);
temp.setWaitForConversion(false);
temp.requestTemperatures();
display.setTextWrap(false);
display.setTextColor(WHITE);
display.setTextSize(1);
display.clearDisplay();
display.display();
delay(1000);
}
void loop() {
display.setCursor(0,4);
display.print(F("LAP"));
if(giro<10){
display.setCursor(6,13);
}else{
display.setCursor(3,13);
}
display.print(giro);
display.drawLine(0,24,128,24,WHITE);
display.drawLine(0,25,128,25,WHITE);
display.setCursor(18,30);
display.print(F("BEST:"));
display.setCursor(82,30);
display.print(F("LAST:"));
display.setTextSize(2);
display.setCursor(16,4);
display.print(F(":"));
display.setCursor(30,4);
timer();
if(giro==0){
display.print(F("0.0.000"));
}else{
display.print(x,3);
}
display.setTextSize(1);
tempi();
display.setCursor(10,42);
display.print(x1,3);
display.setCursor(75,42);
display.print(x2,3);
display.drawLine(64,26,64,64,WHITE);
if(millis()-lastTime>1000){
tempc=temp.getTempCByIndex(0);
temp.requestTemperatures();
lastTime = millis();
}
display.drawLine(0,52,128,52,WHITE);
display.setCursor(0,57);
display.println(tempc);
display.drawLine(0,52,128,52,WHITE);
display.display();
delay(10);
display.clearDisplay();
}
void tempi(){
float ses= 60;
y1=tbest/ses;
x1=tbest-(ses*y1);
y2=tlast/ses;
x2=tlast-(ses*y2);
}
void timer(){
float mille=1000;
float ses=60;
x=((millis()/mille)-flag)-x0;
if(x>60){
y=y+1;
flag=flag+ses;
}
}
void tempo() {
float mille=1000;
float ses= 60;
float t2=millis()/mille;
tlast=t2-t1;
t1=t2;
if(tbest==0){
tbest=tlast;
}
if(tlast<tbest){
tbest=tlast;
}
x0=x0+(tlast-(ses*y));
y=0;
if(giro==0){
tbest=0;
tlast=0;
}
giro=giro+1;
}