SODAQ (Arduino kompatibel) öl temperaturvakt (2 / 2 steg)
Steg 2: Koden
Det visar processen för att mäta temperaturen och Visa det på OLED display.
När temperaturen sjunker under 8 grader Celcius (idealisk temperatur för öl), skickar ett SMS med hjälp av GPRSbee.
#include < OneWire.h >
#include < Wire.h >
#include < SeeedOLED.h >
#include < GPRSbee.h >
#define GPRSBEE_PWRPIN 7
#define XBEECTS_PIN 8
OneWire ds(2); på pin 2
int sent_sms = 0; Vi vill bara skicka ett sms en gång
float beertemp;
bool smsSent;
void setup() / *---(SETUP: kör en gång)---* /
{
Serial.BEGIN(9600); Serial1 är ansluten till SIM900 GPRSbee
gprsbee.init (serienummer, XBEECTS_PIN, GPRSBEE_PWRPIN);
gprsbee.off();
Wire.BEGIN();
SeeedOled.init(); initialze SEEED OLED-skärm
SeeedOled.clearDisplay(); Rensa skärmen och ange startposition till övre vänstra hörnet
SeeedOled.setNormalDisplay(); Visning inställd på normal läge (dvs icke-inversen läge)
SeeedOled.setPageMode(); Ställ in adressering läge till Page läge
} / *--(avsluta installationsprogrammet)---* /
void loop() / *---(LOOP: kör ständigt)---* /
{
SeeedOled.setTextXY(0,0); Ställa markören till Xth Page, y kolumn
SeeedOled.putString("Beer(oC):"); Skriva ut strängen
beertemp = OWtemp();
SeeedOled.putFloat(beertemp,1);
om (beertemp < 8 & & sent_sms == 0) {
sent_sms = 1; bara skicka sms en gång
SeeedOled.setTextXY(4,0);
SeeedOled.putString ("skicka SMS");
SeeedOled.setTextXY(5,0);
smsSent = gprsbee.sendSMS ("öl är kallt", "+99999999"); telefonnumret inklusive landskod
om (smsSent) {
SeeedOled.setTextXY(6,0);
SeeedOled.putString ("SMS skickade OK");
} annat {
SeeedOled.setTextXY(6,0);
SeeedOled.putString ("SMS skickas inte");
}
}
} / *--(slutet huvudloop)--* /
OWtemp(void) {float
byte i.
byte närvarande = 0;
byte type_s;
byte data [12].
byte addr [8] = "";
flyta celsius;
DS.search(addr);
DS.Reset();
DS.Select(addr);
DS.write(0x44, 1); Starta konvertering, med parasit driver på i slutet
Delay(1000); kanske är 750ms nog, kanske inte
Vi skulle göra en ds.depower() här, men Återställ tar hand om den.
Nuvarande = ds.reset();
DS.Select(addr);
DS.write(0xBE); Läs Scratchpad
för (jag = 0; jag < 9; i ++) {/ / vi behöver 9 byte
data [i] = ds.read();
}
Konvertera data till faktisk temperatur
eftersom resultatet är en 16-bitars heltal, bör det
lagras till en "int16_t" typ, som alltid är 16 bitar
även när sammanställt på en 32-bitars processor.
int16_t rå = (data [1] << 8) | data [0];
om (type_s) {
rå = rå << 3. 9 bit upplösning standard
om (data [7] == 0x10) {
"räkna fortfarande" ger full 12 bitars upplösning
rå = (rå & 0xFFF0) + 12 - data [6].
}
} annat {
byte cfg = (data [4] & 0x60);
vid lägre res, de låg bitarna är odefinierat, så låt oss noll dem
om (cfg == 0x00) rå = raw & ~ 7. 9 bit upplösning, 93.75 ms
annars om (cfg == 0x20) rå = raw & ~ 3. 10 bitars res, 187.5 ms
annars om (cfg == 0x40) rå = raw & ~ 1. 11 bitars res, 375 ms
standard är 12 bitars upplösning, 750 ms omvandlingstid
}
Celsius = (float) raw / 16,0;
returnera celsius;
}
/ * (Slutet) * /