Stap 4: Combinatie van DS3231 en DHT22
Oke, is het tijd om het combineren van de twee apparaten eerder gezien!
Deze procedure bestaat uit het maken van een 'lappendeken' tussen de twee codes eerder gezien.
Open zowel de codes als de kopie & langs de gedragscode DHT22 in één van de DS3231 (ds3231_bis.ino).
Bibliotheken, variabelen en constanten
In de ds3231_bis.ino-code toevoegen van de bibliotheek die nodig zijn voor de dht22, bepaalt welke pin it's gonna gebruiken en stelt u de variabele gebruikt om te lezen en schrijven van de waarden van temperatuur en vochtigheid gedetecteerd. Hier is hoe het begin van de code zou moeten uitzien:
#include "Wire.h" #include <dht.h> #define DHT22_PIN 9 #define DS3231_I2C_ADDRESS 0x68 dht DHT;
Functies
Net na de twee belangrijkste functies (void loop en void setup) gaan we de "secundaire" zijn:
- bcdToDec---zoals eerder gezegd, het is nodig om binaire getallen naar decimalen converteren
- readDS3231time---vereist om gegevens te lezen van DS3231
- displayTime---vereist voor het afdrukken van de gegevens en tijd op de seriële monitor
Om niet verknoeien iets, hebben we een andere functie met de naam dht22. Het bevat alle regels in de setup -functie van onze dht22.ino. Dankzij dit zijn onze lus en setup gonna be schoon en netjes.
// Convert binary coded decimal to normal decimal numbers byte bcdToDec(byte val) { return( (val/16*10) + (val%16) ); } void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) { Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // set DS3231 register pointer to 00h Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // request seven bytes of data from DS3231 starting from register 00h *second = bcdToDec(Wire.read() & 0x7f); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *month = bcdToDec(Wire.read()); *year = bcdToDec(Wire.read()); } // READ DATA void dht22 () { // READ DATA Serial.print("DHT22, \t"); int chk = DHT.read22(DHT22_PIN); switch (chk) { case DHTLIB_OK: Serial.print("OK,\t"); break; case DHTLIB_ERROR_CHECKSUM: Serial.print("Checksum error,\t"); break; case DHTLIB_ERROR_TIMEOUT: Serial.print("Time out error,\t"); break; default: Serial.print("Unknown error,\t"); break; } Serial.print(DHT.humidity, 1); Serial.print(",\t"); Serial.println(DHT.temperature, 1); } void displayTime() { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // send it to the serial monitor Serial.print(hour, DEC); // convert the byte variable to a decimal number when displayed Serial.print(":"); if (minute<10) { Serial.print("0"); } Serial.print(minute, DEC); Serial.print(":"); if (second<10) { Serial.print("0"); } Serial.print(second, DEC); Serial.print(" "); Serial.print(dayOfMonth, DEC); Serial.print("/"); Serial.print(month, DEC); Serial.print("/"); Serial.print(year, DEC); Serial.print(" Day of week: "); switch(dayOfWeek){ case 1: Serial.println("Sunday"); break; case 2: Serial.println("Monday"); break; case 3: Serial.println("Tuesday"); break; case 4: Serial.println("Wednesday"); break; case 5: Serial.println("Thursday"); break; case 6: Serial.println("Friday"); break; case 7: Serial.println("Saturday"); break; } }
Setup functie
De belangrijkste functies zijn Wire.begin() en Serial.begin(). Het initialiseren van de DS3231 en de seriële monitor, respectievelijk. De overige regels afdrukken niet strikt vereist informatie over DHT22.
void setup() { Wire.begin(); Serial.begin(115200); Serial.println("DHT TEST PROGRAM "); Serial.print("LIBRARY VERSION: "); Serial.println(DHT_LIB_VERSION); Serial.println(); Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)"); }
Lus functie
De lus functie is vrij eenvoudig: het roept slechts twee functies vertragen van de werking van 2 seconden. Waarom twee seconden? Omdat DHT22s moet twee seconden om te doen een detectie.
#include "Wire.h" void loop() { displayTime(); // display the real-time clock data on the Serial Monitor, dht22 (); // display the value of humidity and temperature detected delay(2000); }
Zoals gewoonlijk we gehecht de code klaar voor gebruik.