Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Мини-метеостанция на Arduino UNO с ESP8266 и ThingSpeak — DIY IoT-хаб

Компоненты и материалы

Программное обеспечение и сервисы

О проекте

Мини-метеостанция на Arduino UNO с ESP8266 и ThingSpeak — DIY IoT-хаб

Первое поколение компактной метеостанции на Arduino с Wi-Fi (ESP8266), отправляющей данные на ThingSpeak. Измеряемые параметры:

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

Подключение

Все датчики подключаются к шилду/макетке согласно схеме. Grove-модули удобны кабелями, но можно использовать и обычные версии датчиков.

Мини-метеостанция на Arduino UNO с ESP8266 и ThingSpeak — DIY IoT-хаб
Мини-метеостанция на Arduino UNO с ESP8266 и ThingSpeak — DIY IoT-хаб

Необходимые библиотеки

Настройка ThingSpeak

  1. Зарегистрируйтесь на ThingSpeak.
  2. Создайте новый Channel с 7 полями:
    Field 1 = Light (освещённость)
    Field 2 = Humidity (влажность)
    Field 3 = Temperature DHT22
    Field 4 = UV Index
    Field 5 = Dust concentration
    Field 6 = Pressure
    Field 7 = Temperature BMP085
  3. Скопируйте Write API Key и вставьте в скетч вместо ZZZZZ.
  4. В скетче также замените XXXXX на SSID WiFi, YYYYY — пароль.
Мини-метеостанция на Arduino UNO с ESP8266 и ThingSpeak — DIY IoT-хаб
Мини-метеостанция на Arduino UNO с ESP8266 и ThingSpeak — DIY IoT-хаб
Мини-метеостанция на Arduino UNO с ESP8266 и ThingSpeak — DIY IoT-хаб
Мини-метеостанция на Arduino UNO с ESP8266 и ThingSpeak — DIY IoT-хаб

Просмотр на Android

Исходный код (weatherBox.ino)

#include 
#include 
#include 
#include 
#include 
#include 

#define SSID "XXXXX"       // Ваш WiFi SSID
#define PASS "YYYYY"       // Ваш WiFi пароль
#define IP "184.106.153.149" // IP thingspeak.com
#define DHT22_PIN 2

String GET = "GET /update?key=ZZZZZ&field1="; // ZZZZZ = Write API Key
SoftwareSerial monitor(10, 11); // RX, TX к ESP8266

dht DHT;
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);

// Пины датчиков
int luminancePin = A0;
int uvPin = A1;
int dustPin = 8;

// Переменные для пыли
unsigned long duration, starttime;
unsigned long sampletime_ms = 30000;
unsigned long delay_time = 60000;
unsigned long lowpulseoccupancy = 0;
float ratio = 0, concentration = 0;

void setup() {
  Serial.begin(9600);
  monitor.begin(9600);
  Serial.println("Initializing...");

  pinMode(dustPin, INPUT);

  Serial.println("Detecting BMP085...");
  if (!bmp.begin()) {
    Serial.println("BMP085 not found! Check wiring/I2C address.");
    while (1);
  }
  Serial.println("BMP085 detected!");

  // Инициализация ESP8266
  monitor.flush();
  monitor.println("AT");
  delay(2000);
  if (monitor.find("OK")) Serial.println("ESP8266 OK");
  else Serial.println("ESP8266 ERROR");

  connectWiFi();
  Serial.print("Sampling (");
  Serial.print(sampletime_ms / 1000);
  Serial.println("s)...");
  starttime = millis();
}

void loop() {
  // Измерение пыли (Shinyei PPD42NS)
  duration = pulseIn(dustPin, LOW);
  lowpulseoccupancy += duration;

  if ((millis() - starttime) >= sampletime_ms) {
    ratio = lowpulseoccupancy / (sampletime_ms * 10.0);
    concentration = 1.1 * pow(ratio, 3) - 3.8 * pow(ratio, 2) + 520 * ratio + 0.62; // по даташиту
    lowpulseoccupancy = 0;

    // Остальные датчики
    char buffer[10];
    float luminance = analogRead(luminancePin);
    float uv = analogRead(uvPin) * 0.0049 * 307 / 200; // В -> мВт/м² -> UV index

    int chk = DHT.read22(DHT22_PIN);
    float humidity = DHT.humidity;
    float temperature = DHT.temperature;

    sensors_event_t event;
    bmp.getEvent(&event);
    float pressure = 0, temperature1 = 0;
    if (event.pressure) {
      pressure = event.pressure;
      bmp.getTemperature(&temperature1);
    }

    // Преобразование в строки
    String luminanceStr = dtostrf(luminance, 4, 1, buffer); luminanceStr.replace(" ", "");
    String uvStr = dtostrf(uv, 4, 1, buffer); uvStr.replace(" ", "");
    String humidityStr = dtostrf(humidity, 4, 1, buffer); humidityStr.replace(" ", "");
    String temperatureStr = dtostrf(temperature, 4, 1, buffer); temperatureStr.replace(" ", "");
    String dustStr = dtostrf(concentration, 4, 1, buffer); dustStr.replace(" ", "");
    String pressureStr = dtostrf(pressure, 4, 1, buffer); pressureStr.replace(" ", "");
    String temperature1Str = dtostrf(temperature1, 4, 1, buffer); temperature1Str.replace(" ", "");

    // Отправка на ThingSpeak
    updateSensors(luminanceStr, humidityStr, temperatureStr, uvStr, dustStr, pressureStr, temperature1Str);

    Serial.print("Wait ");
    Serial.print(delay_time / 1000);
    Serial.println("s for next sampling");
    delay(delay_time);
    Serial.println();
    Serial.print("Sampling (");
    Serial.print(sampletime_ms / 1000);
    Serial.println("s)...");
    starttime = millis();
  }
}

void updateSensors(String luminanceStr, String humidityStr, String temperatureStr,
                   String uvStr, String dustStr, String pressureStr, String temperature1Str) {
  String cmd = "AT+CIPSTART=\"TCP\",\"" + String(IP) + "\",80";
  monitor.println(cmd);
  delay(2000);

  cmd = GET + luminanceStr + "&field2=" + humidityStr + "&field3=" + temperatureStr +
        "&field4=" + uvStr + "&field5=" + dustStr + "&field6=" + pressureStr +
        "&field7=" + temperature1Str + "\r\n";
  delay(1000);
  int strsize = cmd.length();
  monitor.println("AT+CIPSEND=" + String(strsize));
  delay(2000);
  monitor.print(cmd);
  if (monitor.find("OK")) Serial.println("Transmission success");
  else Serial.println("Transmission failed!");
}

boolean connectWiFi() {
  Serial.println("Connecting WiFi...");
  monitor.println("AT+CWMODE=1");
  delay(2000);
  monitor.flush();
  String cmd = "AT+CWJAP=\"" + String(SSID) + "\",\"" + String(PASS) + "\"";
  monitor.println(cmd);
  delay(5000);
  if (monitor.find("OK")) {
    Serial.println("WiFi connected!");
    return true;
  } else {
    Serial.println("WiFi connection failed!");
    return false;
  }
}

Библиотеки: DHT, BMP085.

Производственный процесс

  1. Создание метеостанции на Raspberry Pi с ежедневными email-отчётами о погоде
  2. Робот для поиска людей на базе Arduino Uno: пошаговая интеграция датчиков
  3. Датчик CO2 K30: мониторинг качества воздуха в реальном времени на Arduino
  4. Цифровой стадиометр на Arduino: отслеживание роста лазерным датчиком VL53L0X
  5. Веб-сервер на Arduino Uno WiFi: управление LED через браузер
  6. Простой калькулятор на Arduino UNO — базовый проект для начинающих
  7. Сенсорная башня на Arduino Cloud: Мониторинг температуры, движения и газа
  8. Сборка портативного дисплея на основе эффекта сохранения изображения с Arduino UNO и ATtiny85
  9. Погодная станция на Arduino Nano: BMP280, DHT11, UV, DS3231, OLED 0.96″
  10. Умная станция мониторинга здоровья: Arduino, Bluetooth и датчики