DIY Arduino temperaturgivare (3 / 7 steg)
Steg 3: Koden
Här är koden:
/*
Termometer baserat på Maxims DS600u + chip
*/
#include "U8glib.h"
#include < math.h >
U8GLIB_ST7920_128X64_4X u8g (8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); 8 bitars Com: D0... D7: 8,9,10,11,4,5,6,7 sv = 18, di = 17, rw = 16
void u8g_prepare(void) {
U8G.setFont(u8g_font_6x10);
U8G.setFontRefHeightExtendedText();
U8G.setDefaultForegroundColor();
U8G.setFontPosTop();
}
void setup(void) {
Flip skärmen, om det behövs
U8G.setRot180();
tilldela färg standardvärde
om (u8g.getMode() == U8G_MODE_R3G3B2)
U8G.setColorIndex(255); vit
annat if (u8g.getMode() == U8G_MODE_GRAY2BIT)
U8G.setColorIndex(3); Max intensitet
annat if (u8g.getMode() == U8G_MODE_BW)
U8G.setColorIndex(1); pixel på
U8G.setContrast(0x30);
pinMode (13, OUTPUT);
digitalWrite 13, hög.
u8g_prepare();
}
void draw(void) {
flyta leverans = 4,91; Här måste vara in uppmätta matningsspänningen av arduino styrelsen
Läs sensor utspänningen
int läsa = analogRead(0);
flyta v_out = (läst * leverera) /1,024;
Visa på LCD-temperaturen
flyta temperatur = (v_out - 509) / 6,45;
char temp [5].
dtostrf(temperature,5,1,temp);
U8G.drawStr(4,24,"temperature:");
U8G.drawStr(76,24,temp);
U8G.drawStr (108,24,"\260C");
}
void loop(void) {
bild loop
U8G.firstPage();
göra {
draw();
} medan (u8g.nextPage());
återskapa bilden efter viss fördröjning
Delay(1000);
}
Det finns några knepiga punkter i koden.
Jag har lagt dem i fetstil.
1) eftersom den inre Atmega ADC använder som referens matningsspänningen för att mäta analog spänning potentiella, som är inte förhållandet mellan metriska att matningsspänningen, men fast av sensor chip, om matningsspänningen varierar, kan uppstå ett fel. Grov beräkning säger att 50mV strömförsörjningen variation kan orsaka 1 grad temperatur fel. Lösningen för att förbättra noggrannheten är att mäta den exakta spänningen på Arduino styrelsen på det sätt det bör användas - om du tänker använda Arduino termometern av USB, måste du mäta matningsspänningen styrelsen i detta fall; och respektive, om du tänker använda termometern som fristående enhet av nätadapter - sedan, matningsspänningen av styrelsen + shield skall mätas i detta tillstånd. I mitt fall enheten får ström från USB, och jag har mätt 4.91V på "5V" Arduino stiften. Så jag satte detta värde i skissen.
2) det är trevligt att du kan se Gradsymbolen "°" på LCD-skärmen. Problemet här är att de olika skärmarna har olika ASCII-tabeller, och vad exakt är det oktala tal som motsvarar symbolen är svårt att säga. Det finns två möjliga lösningar:
A) att läsa databladet för LCD-modulen / drivrutin om det ges alla ASCII-tabeller
B) att skriva en skiss för att visa hela ASCII tabellen skriven i LCD-ROM, se där symbolen visas och att beräkna/se decimaltal motsvarar det. Vidare att konvertera värdet till oktalt tal och sätta i skissen.
Jag har använt den andra strategin... och i det enklaste sättet :-) - finns "Exempel" i biblioteket u8glib. Programmet "GraphicsTest" ut både ASCII-tabell som lagras i drivrutinen chip ROM. Där hittade jag att den behövs symbolen har det 260 oktala motsvarande tal.
Killar, som vill genomföra detta projekt på Arduino Due, jag skulle råd om du vill infoga i koden också följande rad:
analogReadResolution(12);
i installationsproceduren, och sedan i stället dela upp på 1,024 att dela på 4.096. Detta kommer att förbättra ADC resolutionen och på något sätt också termometern är korrekta.