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.
Im 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); } }