Arduino I2C Test mit LM92 Temperatursensor

Zum testen der I2C Verbindung mit einem Sensor habe ich einen LM92 Temperatursensor angeschlossen und die Geschwindigkeit und Auslesegeschwindigkeit getestet.

Der Sensor gibt die Werte im Bereich von etwa 30°C mit einer Genauigkeit von 0.33°C an, hat aber eine Auflösung von 0.0625°C.

Für den Sensor habe ich eine kleine Testanwendung geschrieben, die die Temperatur als Graph auf einem LCD display ausgibt und die aktuelle Temperatur sowie den Durchschnitt angibt.

lm92_graphIm ersten Teil ist gut zu sehen, dass die Ausgabewerte sehr konstant sind.

Code für das Beispiel Programm mit 320×480 Adafruit TFT Display:

#include <Wire.h>
#include <SPI.h>
#include "Adafruit_GFX.h"
#include "Adafruit_HX8357.h"

#define TFT_CS 10
#define TFT_DC 9
#define TFT_RST -1

#define COL_BG HX8357_BLACK
#define COL_TEXT HX8357_BLUE
#define COL_UI HX8357_BLUE
#define COL_GRAPH HX8357_YELLOW

Adafruit_HX8357 tft = Adafruit_HX8357(TFT_CS, TFT_DC, TFT_RST);

const int w = 480;
const int h = 360;

int temp[w];

int lastItemp = 0;
int lastAVG = 0;

void setup()
{
  Wire.begin();
  Serial.begin(9600);

  tft.begin(HX8357D);

  tft.setRotation(1);
  tft.setTextSize(3);
  tft.setTextWrap(false);

  tft.fillScreen(COL_BG);

  //UI
  tft.setTextColor(COL_TEXT);
  tft.setCursor(3,3);
  tft.print("Avg:          Temp:");
  for(int i = 0; i < 4; i++)
  {
    tft.drawFastHLine(0, 32+i, w, COL_UI);
  }
  
  Serial.println("Init fertig!");
}

int getYforX(int x)
{
  return 10*(-getTemp(temp[x])+50);
}

float getTemp(int itemp)
{
  return itemp*0.0625;
}

void pixel(int x, int y, int color)
{
  tft.drawPixel(x,y,color);
  tft.drawPixel(x,y+1,color);
  tft.drawPixel(x,y-1,color);
}

void loop()
{
  if(Wire.requestFrom(0x48,2)==2)  //0x4B für A0/A1 high
  {
    unsigned long startMillis = millis();
    
    byte b1 = Wire.read();
    byte b2 = Wire.read(); 

    //Temperatur berechnen
    int itemp = ((b1 << 5) + (b2 >> 3));
    Serial.print(getTemp(itemp),3);
    Serial.print(" C in  ");

    long sum = 0;
    int num = 0;
    for(int x = 0; x < w; x++)
    {
      //alten Farbwert löschen
      pixel(x,getYforX(x),COL_BG);

      //Neue hinzufügen
      if(x+1 < w)
      {
        temp[x] = temp[x+1];
      }
      else
      {
        temp[x] = itemp;
      }

      //Durchschnitt berechnen
      sum += temp[x];
      if(temp[x] != 0)
      {
        num++;
      }

      //neuen Farbwert setzen
      pixel(x,getYforX(x),COL_GRAPH);
    }
    int avg = round((sum/num));

    //Text Durchschnitt
    tft.setTextColor(COL_BG);
    tft.setCursor(90,3);
    tft.print(getTemp(lastAVG),3);
    tft.setTextColor(COL_TEXT);
    tft.setCursor(90,3);
    tft.print(getTemp(avg),3);

    //Text Temp
    tft.setTextColor(COL_BG);
    tft.setCursor(365,3);
    tft.print(getTemp(lastItemp),3);
    tft.setTextColor(COL_TEXT);
    tft.setCursor(365,3);
    tft.print(getTemp(itemp),3);

    lastItemp = itemp;
    lastAVG = avg;

    //Dauer
    Serial.print("  Fertig in ");
    Serial.print(millis()-startMillis);
    Serial.println("ms  ");

    
     delay(500-(millis()-startMillis));
  }
  else
  {
    delay(100);
  }
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert