Max31850 & 7segments blinka

Ciao a tutti ,
sono alle prese con un display led 7segment per visializzare una temperatura da una sonda K utiluizzando come convertitore il MAX31850.
Il problema ce sto avendo è che quando richiedo la temperatura al sensore il 7segment smette gi aggiornarsi e blinka.
C'è un modo per velocizzare o per non far smettere di far aggiornare il display?

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
#include "SevSeg.h"
SevSeg sevseg;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire); 
DeviceAddress airtemp;

int temp;

void setup(){
  

  
    sensors.begin();
    
sensors.getAddress(airtemp, 0);
sensors.setResolution(airtemp, 9); 

  byte numDigits = 4;
  byte digitPins[] = {6, 5,3,4}; //Digits: 1,2,3,4 <--put one resistor (ex: 220 Ohms, or 330 Ohms, etc, on each digit pin)
  byte segmentPins[] = {8,7,11,12,13,10,9,A0}; //Segments: A,B,C,D,E,F,G,Pd
  bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
  byte hardwareConfig = COMMON_ANODE; // See README.md for options
  bool updateWithDelays = false; // Default. Recommended
  bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays, leadingZeros);
  sevseg.setBrightness(100);
 
}


void loop(void)
{ 

 sensors.requestTemperatures();// richiedo temperatura da max31850   

 temp=sensors.getTempC(airtemp),0;
 
 sevseg.setNumber(temp); 
sevseg.refreshDisplay(); 
  
}

Mi sembra di ricordare che quella libreria prevede una funzione di lettura "bloccante"
Ecco la ragione dello stop al display

Non ci sono soluzioni semplici, è un limite dello hardware che hai scelto

Però mi sembra anche che quella libreria prevede una funzione (io la ricordo come sperimentale) che prevede la lettura in due passaggi, entrambi asincroni e non bloccanti
Ti tocca di guardare un po' di documentazione

In alternativa bisognerebbe misurare la durata della lettura per vedere se è compatibile con il tempo di multiplex, in tal caso basterebbe riscriversi il multiplex a mano (senza usare la SevSeg) sincronizzandolo con le letture del sensore.

Vero
Ma io mi ricordo che sono proprio tanti millisecondi....

Ma come ho detto uno sguardo a datasheet e documentazione e si capisce tutto

Quindi il problema sta nella libreria sevenseg.h?

Scusa

Ma secondo quale principio, secondo te, se la 'lettura' della temperatura è bloccante il problema sarebbe nella libreria del display?

ok, avevo capito male, quindi il problema sta nel max 31850.
suppongo stia nel metodo di interrogazione impostato nella libreria.

Sto collegando 2 arduino per avere una visione ottimale.
il master invia in I2c il valore allo slave.
per il master sto usando questa sequenza di invio:

Wire.beginTransmission(2);
Wire.write(temp2 >> 8);
  Wire.write(temp2 );
  Wire.endTransmission();

e questa per lo slave:

int temp1 = Wire.read();
 int temp2 = Wire.read();
temp = (int16_t)temp1 | int16_t(temp2 << 8); 

ma non ricevo il valore corretto.
mi sta sfuggendo qualcosa nel "Bitwise Operators"

In trasmissione usi 2 volte la stessa variabile...
E il codice va mese nei tag code.

Codice sistemato tra i tag.

in trasmissione sto inviando si lo stesso valore ma shiftato.
ho trovato un altro esempio sul forum è ho fatto questo per la trasmissione:

Wire.beginTransmission(2);
Wire.write(0x00FF&temp2);             
Wire.write(0x00FF&temp2>>8); 
  Wire.endTransmission();

e questo in rx:

 char temp2 = Wire.read();
 char temp1 = Wire.read();
temp = temp1<<8|temp2;

che è migliore del precedente ma alcuni valori li ricevo negativi

Se non costruisci un minimo di protocollo e non metti un terminatore ( o uno start) non ne esci

trovata soluzione qui:Gammon Forum : Electronics : Microprocessors : I2C - Two-Wire Peripheral Interface - for Arduino

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