#define PIN_DHT 2
#define PIN_SERVO 5
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#include <Servo.h>
Servo servo;
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
class DHT {
public:
DHT (uint8_t pin) {
pin_ = pin;
humidityInt_ = 0;
humidityFract_ = 0;
temperatureInt_ = 0;
temperatureFract_ = 0;
pinMode(pin_, OUTPUT);
digitalWrite(pin_, HIGH);
}
bool readData() {
// буфер с 5 нулевыми значениями (40 бит)
uint8_t buff[5] = {0};
digitalWrite(pin_, LOW);
delay(18);
pinMode(pin_, INPUT);
digitalWrite(pin_, HIGH);
// ждем ответа от DHT
while (digitalRead(pin_) == HIGH);
// считывание меандра
while (digitalRead(pin_) == LOW);
while (digitalRead(pin_) == HIGH);
uint8_t sumBit = 0;
// Чтение даннных
for (uint8_t i = 0; i < 5; i++) {
for (uint8_t j = 0; j < 8; j++) {
// пропуск строба
while (digitalRead(pin_) == LOW);
// засечем время импульса
unsigned long timeStart = micros();
while (digitalRead(pin_) == HIGH);
// если длительность сигнала > 25-28 мс, то установить лог. 1 в буфер
if (micros() - timeStart > 30)
buff[i] |= (uint8_t)0x80 >> j;
}
}
pinMode(pin_, OUTPUT);
humidityInt_ = buff[0];
humidityFract_ = buff[1];
temperatureInt_ = buff[2];
temperatureFract_ = buff[3];
Serial.print("DHT data: ");
for (uint8_t i = 0; i < 5; i++) {
Serial.print(buff[i], BIN);
Serial.print(" ");
}
Serial.println("");
// проверка контрольной суммы
return (uint8_t)(buff[0] + buff[1] + buff[2] + buff[3]) == buff[4];
}
float getHumidity() {
return humidityInt_ + (float)humidityFract_ / 0xFF;
}
float getTemperature() {
return temperatureInt_ + (float)temperatureFract_ / 0xFF;
}
void print() {
Serial.print(F("Humidity: "));
Serial.print(getHumidity(), 2);
Serial.print(F("% Temperature: "));
Serial.print(getTemperature(), 2);
Serial.println(F("°C"));
}
private:
uint8_t pin_;
uint8_t humidityInt_;
uint8_t humidityFract_;
uint8_t temperatureInt_;
uint8_t temperatureFract_;
};
DHT dht(PIN_DHT);
void printHdtResult(uint8_t buff[5]) {
}
void setup() {
analogReference(DEFAULT);
Serial.begin(57600);
servo.attach(PIN_SERVO);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.setTextSize(2);
display.setTextColor(WHITE);
}
void loop() {
delay(2000);
if (dht.readData())
Serial.println("check sum: ok");
else
Serial.println("check sum: fail");
uint8_t angle = map((uint8_t)dht.getTemperature(), 0, 50, 0, 180);
dht.print();
servo.write(angle);
display.clearDisplay();
display.setCursor(0, 28);
display.print("T= ");
display.print(dht.getTemperature(), 2);
display.print("'C");
display.display();
}