Arduino Majordomo

Подключение ESP8266 И DHT22 и отправка температуры на Majordomo

• 14-11-2018 •

Что нам понадобиться:

  • Три провода
  • Макетная плата
  • DHT22
  • NodeMCU
  • Micro-USB

Подключение

  • Не перепутайте стороны датчика DHT22, на картинке датчик передней частью обращен к вам
  • Самый левый вывод DHT22 — это плюс. Вы должны подключить его в 3v.
  • Второй вывод слева — это вывод данных. Вы должны подключить его в D2 на MCU.
  • Второй вывод справа ничего не делает.
  • Последний вывод минус. Он должен быть подключен в GND

Настройка

Для того, чтобы запрограммировать контроллер, нам нужна программа, программу мы будем использовать IDE Arduino. После того, как вы установили программу, вам понадобиться еще две библиотеки. А так же настроить программу IDE Arduino так, чтобы она видела контроллер ESP8266.

Первое что надо сделать, это зайти в программу IDE Arduino -> Файл -> Настройки. И указать дополнительную ссылку, как на картинке:


http://arduino.esp8266.com/stable/package_esp8266com_index.json

Поставьте галочки в соответствии с картинкой выше!

Для того чтобы скачать библиотеки, нужно зайти в программу IDE Arduino -> Перейти во вкладку «Инструменты» -> и нажать на «Управлять библиотеками»

Первая библиотека, это Adafruit_Sensor. Воспользуйтесь поиском, как на картинке:

И вторая библеотека:

После того, как вы все установили, можно приступать к коду:

Код, подключаем датчик DHT22 и выводим данные в консоль


/**
 * Пример для считывания температуры и влажности
 * Используются DHT22 и ESP8266
 *
 * Copyright (c) 2018 smartideal. All rights reserved.
 * https://smartideal.net
 */

#include "DHT.h"

#define DHTPIN 4     // Номер пина, который подключен к DHT22
#define DHTTYPE DHT22   // Указываем, какой тип датчика мы используем

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.setTimeout(2000);

  // Ждем, пока все загрузится.
  while(!Serial) { }

  Serial.println("Устройство запущено");
  Serial.println("-------------------------------------");
  Serial.println("Запускаем DHT!");
  Serial.println("-------------------------------------");

}

int timeSinceLastRead = 0;
void loop() {

  // Каждые 2 секунды.
  if(timeSinceLastRead > 2000) {
    // Считывание температуры и влажности около 250 милисекунд!
    // Показания датчика также могут составлять до 2 секунд
    float h = dht.readHumidity(); // Влажность
    float t = dht.readTemperature(); // Температура


    // Проверяем, получили ли данные с датчика.
    if (isnan(h) || isnan(t)) {
      Serial.println("Данных нет! Останавливаем цикл и запускаем по новой");
      timeSinceLastRead = 0;
      return;
    }

    // Вычисляем индекс тепла в градусах Цельсия
    float hic = dht.computeHeatIndex(t, h, false);

    Serial.print("Влажность: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Температура: ");
    Serial.print(t);
    Serial.print(" *C ");
    Serial.print("Индекс тепла: ");
    Serial.print(hic);
    Serial.print(" *C ");

    timeSinceLastRead = 0;
  }
  delay(100);
  timeSinceLastRead += 100;
}

Теперь, когда код готов, нужно загрузить его в контроллер, до того как загружать, нужно убедиться, что в настройках указана верная плата: Инструменты -> Плата Generic esp8266 Module

Когда плата выбрана, нажимаем сверху слева на галочку (Проверить код). Если проверка прошла успешно, можно загружать (стрелочка, рядом с галочкой). Если нет, то нужно исправить ошибку в коде.

После того как загрузили, нужно проверить, все ли работает. Для этого нужно перейти в Инструменты -> Монитор Порта

Если вы все правильно сделали, то вы увидите список, где каждые 2 секунды добавляется строчка с данной температурой.

Все это здорово, но теперь нужно передать всю информацию в majordomo, где можно ввести график вашей температуры или влажности.

Отправка данных по Wi-Fi

Перед тем как приступать к отправке данных, убедитесь что у вас уже работает протокол MQTT, если нет, то эта статья обязательна к прочтению!

Код:


#include "DHT.h"
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>

#define DHTPIN 4     // Номер пина, который подключен к DHT22
#define DHTTYPE DHT22   // Указываем, какой тип датчика мы используем
byte mqtt_server[] = { 192, 168, 88, 254 };  // ip адресс mqtt сервера
char buffer[10];

DHT dht(DHTPIN, DHTTYPE);

// WiFi 
const char* WIFI_SSID = "your_SSID"; // Укажите ваш SSID
const char* WIFI_PASS = "your_PASSWORD"; // Укажите ваш wifi пароль

// Читаем MQTT сообщения
void callback(char* topic, byte* payload, unsigned int length) {
}

WiFiClient wifiClient;
PubSubClient client(mqtt_server, 1883, callback, wifiClient);

void connect() {

  WiFi.persistent(false);
  WiFi.mode(WIFI_OFF);
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASS);

  unsigned long wifiConnectStart = millis();

  while (WiFi.status() != WL_CONNECTED) {
    if (WiFi.status() == WL_CONNECT_FAILED) {
      Serial.println("Ошибка соединения WIFI. Проверьте данные: ");
      Serial.println();
      Serial.print("SSID: ");
      Serial.println(WIFI_SSID);
      Serial.print("Password: ");
      Serial.println(WIFI_PASS);
      Serial.println();
    }

    delay(500);
 
    if(millis() - wifiConnectStart > 5000) {
      Serial.println("Ошибка соединения WiFi");
      Serial.println("Попробуйте отправить обновленные параметры конфигурации.");
      return;
    }
  }

  Serial.println("WiFi соединение установлено");
  Serial.println("IP адрес: ");
  Serial.println(WiFi.localIP());
  Serial.println();
}

void setup() {
  Serial.begin(9600);
  Serial.setTimeout(2000);

  // Ждем, пока все загрузится.
  while(!Serial) { }

  Serial.println("Устройство запущено");
  Serial.println("-------------------------------------");
  Serial.println("Запускаем DHT!");
  Serial.println("-------------------------------------");
  connect();

}

// Собираем данные, складывем воедино и отправляем
void report(double humidity, double tempC) {
  StaticJsonBuffer<500> jsonBuffer;
  JsonObject& root = jsonBuffer.createObject();
  root["humidity"] = humidity;
  root["tempC"] = tempC;
  char payload[256];
  root.printTo(payload, sizeof(payload));
  char* s = payload;
  client.publish("ESP/Temp", s);
  Serial.println("Отправлено!");
}

int timeSinceLastRead = 0;
void loop() {

bool toReconnect = false;

  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("Disconnected from WiFi");
    toReconnect = true;
  }

  if (toReconnect) {
    connect();
  }

  
  if(timeSinceLastRead > 5000) {

    float h = dht.readHumidity();
    float t = dht.readTemperature();

    if (isnan(h) || isnan(t)) {
      Serial.println("Данных нет! Останавливаем цикл и запускаем по новой");
      timeSinceLastRead = 0;
      return;
    }

    report(h, t); // Функция отправки данных
  
    timeSinceLastRead = 0;
  }
  
  delay(100);
  timeSinceLastRead += 100;

  client.loop();
}

Вот и все дела, данные отправляются. Это хороший вариант, только в том случае, если ваш контроллер будет работать от розетки. А если же будет работать от батарейки, то данный вариант не подходит. С таким вариантом батарейка сядет за пару недель. Чтобы батарейка служила пол года, а то и год нужно использовать Deep sleep. А об этом мы уже поговорим в следующих записях.

6 thoughts on “Подключение ESP8266 И DHT22 и отправка температуры на Majordomo

  1. при проверке дает ошибку и останавливается на этой строчке
    PubSubClient client(mqtt_server, 1883, callback, wifiClient);

    1. Да, извиняюсь, видимо случайно удалил фигурную скобку, сейчас проверил, 100% рабочий код

  2. Спасибо за статью. Я бы не советовал использовать VIN для подключения датчика! Данный пин не для этого.

  3. я так понял никто скетч не грузил, потому как без dht.begin() в setup() получить данные с датчика невозможно

  4. У меня на брокере стоит логин и пароль, как добавить в программу идентификацию при подключении к брокеру? Где прописать этот логин и пароль?

Добавить комментарий