Stap 2: De code
Het toont het proces voor het meten van de temperatuur en het weer te geven op het OLED display.
Wanneer de temperatuur daalt onder de 8 graden Celsius (ideale temperatuur voor bier), verzendt een SMS gebruikend de GPRSbee.
#include < OneWire.h >
#include < Wire.h >
#include < SeeedOLED.h >
#include < GPRSbee.h >
#define GPRSBEE_PWRPIN 7
#define XBEECTS_PIN 8
Privacy ds(2); op pin 2
int sent_sms = 0; We willen alleen maar eens een sms versturen
float beertemp;
BOOL smsSent;
VOID Setup / *---(SETUP: loopt eenmaal)---* /
{
Serial.begin(9600); Serial1 is verbonden met SIM900 GPRSbee
gprsbee.init (serieel, XBEECTS_PIN, GPRSBEE_PWRPIN);
gprsbee.off();
Wire.begin();
SeeedOled.init(); initialze SEEED OLED-display
SeeedOled.clearDisplay(); wissen van het scherm en startpositie ingesteld op linksboven hoek
SeeedOled.setNormalDisplay(); Weergave ingesteld op normale modus (dwz niet-inverse)
SeeedOled.setPageMode(); Set adressering modus naar pagina modus
} / *--(eind setup)---* /
void loop / *---(lus: loopt voortdurend)---* /
{
SeeedOled.setTextXY(0,0); Stel de cursor op Xth Page, y-kolom
SeeedOled.putString("Beer(oC):"); De afdrukreeks
beertemp = OWtemp();
SeeedOled.putFloat(beertemp,1);
Als (beertemp < 8 & & sent_sms == 0) {}
sent_sms = 1; alleen het verzenden van sms eenmaal
SeeedOled.setTextXY(4,0);
SeeedOled.putString ("het verzenden van SMS");
SeeedOled.setTextXY(5,0);
smsSent = gprsbee.sendSMS ("het bier is koud", "+99999999"); telefoonnummer inclusief landnummer
Als (smsSent) {}
SeeedOled.setTextXY(6,0);
SeeedOled.putString ("SMS'JES OK");
} else {}
SeeedOled.setTextXY(6,0);
SeeedOled.putString ("SMS niet verzonden");
}
}
} / *--(einde hoofdlus)--* /
float OWtemp(void) {}
byte i;
byte aanwezig = 0;
byte type_s;
bytegegevens [12];
byte addr [8] = "";
zweven celsius;
DS.Search(addr);
DS.reset();
DS.Select(addr);
DS.write(0x44, 1); Start conversie, met kracht van de parasiet op eind
delay(1000); Misschien volstaat 750ms, misschien niet
wij hier een ds.depower() zou kunnen doen, maar het resetten zal verzorgen.
huidige = ds.reset();
DS.Select(addr);
DS.write(0xBE); Lees Kladblok
voor (ik = 0; ik < 9; i ++) {/ / moeten we 9 bytes
gegevens [i] = ds.read();
}
De gegevens converteren naar werkelijke temperatuur
omdat het resultaat een 16-bits ondertekend geheel getal is, het zou moeten
een "int16_t"-type, die altijd 16 bits worden opgeslagen
zelfs wanneer gecompileerd op een 32-bits processor.
int16_t ruwe = (gegevens [1] << 8) | gegevens [0];
Als (type_s) {}
ruwe = rauwe << 3; 9 bits resolutie standaard
Als (gegevens [7] == 0x10) {}
"count blijft" geeft volledige 12 bit resolutie
ruwe = (raw & 0xFFF0) + 12 - gegevens [6];
}
} else {}
byte cfg = (gegevens [4] & 0x60);
bij lagere res, de lage bits zijn gedefinieerd, dus laten we nul hen
Als (cfg == 0x00) rauwe = raw & ~ 7; 9 bit resolutie, 93.75 ms
anders als (cfg == 0x20) rauwe = raw & ~ 3; 10 bit res, 187,5 ms
anders als (cfg == 0x40) rauwe = raw & ~ 1; 11 bits res, 375 ms
Standaard is 12 bit resolutie, 750 ms conversietijd
}
Celsius = (zweven) rauwe / 16.0;
retourneren celsius;
}
/ * (Het einde) * /