Метеостанция Arduino


Я решил написать подробную статью, рассказывающую все аспекты создания метеостанции Arduino, по скольку сразу сложно охватить весь процесс. Мое исполнение метеостанции удобно тем, что ее данные сохраняются на компьютере.



Что необходимо
  • локальная сеть, построенная с помощью Wifi роутера
  • компьютер
  • arduino UNOArduino UNO(Я использовал китайскую реплику.)
  • USB кабель, для соединения с Arduino.
  • барометр BME280 5В I2C (датчик температуры, влажности, давления)
  • паяльная станция с феном
  • припой 0.7 мм
  • флюс.
  • Wi-Fi модуль ESP8266 версии ESP-01
  • 4 кабеля мама-папа для макетной платы.
  • 4 кабеля папа-папа для макетной платы
  • 4 кабеля длинной 50 см для макетной платы.
  • 8 тонких термоусадчных трубок длинной 10 см каждая.
  • 1 большая термоусадочная трубка такого диаметра, чтобы в нее вошли «4 кабеля длиной 50 см для макетной платы» вместе с другими термоусадачными трубками


Настройка сети


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


Нажмите, чтобы увеличить.




Следует отключить брадмаузер и другие фаерволы.


В настройках сети, в свойствах беспроводного адаптера, во вкладе доступ, ставим в начале галочку «позволить другим пользователям доступ» и затем — нажимаем настройки;
в настройках ставим все галочки, у вас вместо цифр будут отображаться названия служб.


Нажмите, чтобы увеличить.


Нажмите, чтобы увеличить.




Необходимо открыть 80 и 3306 порт в роутере. Я покажу на примере роутера Tenda: во-первых, узнать ваш Локальный IP адрес, для этого нажмите на значок беспроводной сети. Далее в открывшийся панели возле имени вашей сети появится Свойства. После, пролистайте вниз.


Нажмите, чтобы увеличить.




Далее открываем веб-страницу роутера, у меня это http://192.168.0.1, вводим пароль от роутера, нажимаем Advanched settings, потом Virtal Server.Затем вводим сначала Локальный IP, и порт 80.Затем повторяем операцию, но вводим порт 3306.


Нажмите, чтобы увеличить.


Нажмите, чтобы увеличить.





Нам необходимы следующие компоненты:

  • Apache — сюда будут посылаться данные с метеостанции.
  • PHP — будет подхватывать данные с метеостанции, и сохранять бд.
  • Mysql — базы данных где будут сохраняться температура, так как средствами только PHP невозможно обеспечить отображение для нескольких компьютеров и других устройств.
  • HeidiSQL — просмоторщик, и редактор базы данных (можно использовать любой другой, например:«PhpMyAdmin»).

На настройку сервера Apache подробно описывать не буду, так в интернете много информации.Главное настроить Apache и MySQL на видимость в локальной сети.

После этого создайте таблицу в базе данных — там будет сохраняться температура.

Пример моей страницы обработчика( показаний датчика) на сервере:



Код на PHP
$link = mysqli_connect("имя сервера в апач", "root", "пароль к бд", "база данных");

if (!$link) {
    echo "Ошибка: Невозможно установить соединение с MySQL." . PHP_EOL;
    echo "Код ошибки errno: " . mysqli_connect_errno() . PHP_EOL;
    echo "Текст ошибки error: " . mysqli_connect_error() . PHP_EOL;
    exit;
}

echo "Соединение с MySQL установлено!" . PHP_EOL;
echo "Информация о сервере: " . mysqli_get_host_info($link) . PHP_EOL;


if(isset($_GET['temp'])){
$c=$_GET['temp'];
$vlah=$_GET['vlah'];
$davlen=$_GET['davlen'];
$sql = "UPDATE `temp1` SET `C`='$c',`vlah`='$vlah',`davlen`='$davlen' WHERE `id`='1'";// Занесение данных в бд
mysqli_query($link,$sql);

}
echo"<br>";
$sql1="SELECT * FROM `temp1`";//Отображение данных
$result = mysqli_query($link,$sql1);
$row = mysqli_fetch_all($result,MYSQLI_NUM);
echo "Температура ";
echo $row[count($row)-1][0];
echo " C";
echo"<br>";
echo "Давление ";
echo $row[count($row)-1][1];
echo "hPa";
echo"<br>";
echo "Влажность ";
echo $row[count($row)-1][2];
echo "%";			


3. Настройка esp8266


Соедините esp-01 в адаптер и подсоедините его к Arduino следующим образом: Rx-RX, TX-TX, GND-GND, VCC-5V ;
Заземлите порт RESET Arduino в GND;


Нажмите, чтобы увеличить.



Подключите arduino к компьютеру, откройте Arduino IDE, затем Serial Monitor.Затем укажите Rate 115200, и
Both NL & CR.


Нажмите, чтобы увеличить.


  1. Введите команду AT.
  2. Высветиться OK.
  3. Введите AT+RESTORE, это спросит модуль на заводские настройки.
  4. Введите AT+CWMODE_CUR=1, это переведет модуль в режим клиента.
  5. Введите AT+CWJAP_CUR=«Имя_сети», «Пароль» — подключение к вайфай.
  6. Высветиться OK, если соединение произошло.

Настройка bme280 и финальная сборка


Соедините выводы согласно схеме(внимание на схеме изображен esp8266 без адаптера, но в реальности его надо соединить с адаптером, а уже из
адаптера 4 вывода имеют туже функцию что изображены на схеме. )


Нажмите, чтобы увеличить.


Откройте Arduino IDE и вставите следующий код:


Код на языке Arduino IDE
#include <Wire.h>
 
void setup(){
    Wire.begin();
 
    Serial.begin(9600);
    while (!Serial);
    Serial.println("\nI2C Scanner");
} 

void loop(){
    byte error, address;
    int nDevices;
 
    Serial.println("Scanning...");
 
    nDevices = 0;
    for(address = 8; address < 127; address++ ){
        Wire.beginTransmission(address);
        error = Wire.endTransmission();
 
        if (error == 0){
            Serial.print("I2C device found at address 0x");
            if (address<16)
                Serial.print("0");
            Serial.print(address,HEX);
            Serial.println(" !");
 
            nDevices++;
        }
        else if (error==4) {
            Serial.print("Unknow error at address 0x");
            if (address<16)
                Serial.print("0");
            Serial.println(address,HEX);
        } 
    }
    if (nDevices == 0)
        Serial.println("No I2C devices found\n");
    else
 Serial.println("done\n");
 
    delay(5000);


Откройте Serial Monitor, и запомните высветившийся IC2 adress.
Скачайте библиотеки Библиотека Датчика, Сенсорная библиотека и распакуйте их в C:\Users\user\Documents\Arduino. Откройте
C:\Users\user\Documents\Arduino\libraries\Adafruit_BME280_Library-master и измените адрес:


Нажмите, чтобы увеличить.


Откройте Arduino IDE и поместите код:


Код на языке Arduino IDE
#include <SoftwareSerial.h>
#define RX 10// Пин подключения к esp8266
#define TX 11// Пин подключения к esp8266
String AP = "Aleks";       //  Имя сети
String PASS = "1brui47ci881"; // Пароль
String HOST = "192.168.0.185";//ваш локальный ип
String PORT = "80";//порт апача
String field = "field1";
int countTrueCommand;
int countTimeCommand; 
boolean found = false; 
int valSensor = 1;
SoftwareSerial esp8266(RX,TX); 
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI

unsigned long delayTime;

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

    bool status;
    
    // default settings
    // (you can also pass in a Wire library object like &Wire2)
    status = bme.begin();  
    if (!status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring!");
        while (1);
    }
    
    
     esp8266.begin(115200);
  sendCommand("AT",5,"OK");
  sendCommand("AT+CWMODE=1",5,"OK");
  sendCommand("AT+CWJAP=\""+ AP +"\",\""+ PASS +"\"",20,"OK");
  sendCommand("AT+CIPMUX=1",5,"OK");
 

}


void loop() { 
   float vlah=bme.readPressure() / 100.0F;
    sendCommand("AT+CIPSTART=0,\"TCP\",\""+ HOST +"\","+ PORT,15,"OK");
 String cmd = "GET /?temp="+String(bme.readTemperature())+"&vlah="+String(vlah)+"&davlen="+String(bme.readHumidity())+" HTTP/1.1\r\nHost: 192.168.0.185\r\n\r\n";// GET запрос на локальный сервер,temp,vlah,davlen переменые в которые заносяться данные с датчика и заносяться в бд.
 sendCommand("AT+CIPSEND=0," +String(cmd.length()+4),4,">");
 esp8266.println(cmd);delay(1500);countTrueCommand++;
 sendCommand("AT+CIPCLOSE=0",5,"OK");
 delay(100000);
}


void printValues() {
    Serial.print("Temperature = ");
    Serial.print(bme.readTemperature());
    Serial.println(" *C");

    Serial.print("Pressure = ");

    Serial.print(bme.readPressure() / 100.0F);
    Serial.println(" hPa");

    
    Serial.print("Humidity = ");
    Serial.print(bme.readHumidity());
    Serial.println(" %");

    Serial.println();
}
void sendCommand(String command, int maxTime, char readReplay[]) {
  Serial.print(countTrueCommand);
  Serial.print(". at command => ");
  Serial.print(command);
  Serial.print(" ");
  while(countTimeCommand < (maxTime*1))
  {
    esp8266.println(command);//at+cipsend
    if(esp8266.find(readReplay))//ok
    {
      found = true;
      break;
    }
  
    countTimeCommand++;
  }
  
  if(found == true)
  {
    Serial.println("OYI");
    countTrueCommand++;
    countTimeCommand = 0;
  }
  
  if(found == false)
  {
    Serial.println("Fail");
    countTrueCommand = 0;
    countTimeCommand = 0;
  }
  
  found = false;
 }


Готово. Данные температуры, передадутся в виде переменных в базу данных.

Как видите моя метеостанция требует начальных знаний веб программирования, но результат стоит того.


Комментарии (30)


  1. Capacitor10n
    14.03.2019 10:42
    +2

    1. ksenobayt
      14.03.2019 11:31

      Потому что модняво.

      Товарищ не учёл, что почти все мелкие станции доступные на том же народмоне запилены на том или ином варианте 8266 — и есть к ним готовые варианты как условно-бесплатных, так и бесплатных и свободных прошивок именно под погодную станцию.

      Что иронично больше всего — так то, что даже ESP для данного применения будет оверкиллом.


      1. Capacitor10n
        14.03.2019 11:46

        Учитывая цену норм :)
        Вот если бы оно стоило скажем в 2 раза дороже, тогда можно было бы подумать о чем то)


      1. Bonio
        14.03.2019 15:56

        даже ESP для данного применения будет оверкиллом.

        Вовсе нет, если убрать из схемы автора ненужный сервер с sql инъяекциями и заливать данные непосредственно на narodmon.ru, например. Или использовать MQTT сервер.


        1. ksenobayt
          15.03.2019 09:21

          Переформулирую: для сборки погодной станции можно обойтись и без ESP. Её здесь слишком много, если вся задача доски — снимать сырые данные и кидаться ими в брокер.


  1. acin
    14.03.2019 10:44
    +1

    Простите, но отключать фаирволы вместо настройки правил в них выглядит как «уяк-уяк и в продакшн».


    1. rico_spb
      14.03.2019 11:02

      Массовый тренд по нынешним временам, увы :-(


    1. Alexeyslav
      14.03.2019 11:49

      Тут всё так выглядит от начала и до конца. Но это один из способов сделать так чтобы всё заработало сразу а не искать потом причину почему это нет коннекта.


  1. reticular
    14.03.2019 10:45
    +2

    мне как инженеру печально видеть такую схему
    имхо ардуино уно тут лишняя
    сама есп8266 намного ее мощнее


    1. Alexeyslav
      14.03.2019 11:55

      ESP8266 может и мощнее, но инструменты разработки под неё это сплошной ужас, и развернуть их у себя тот ещё квест. Ну и соответственно порог вхождения выше. Другое дело теплая ламповая ардуинка, у которой среда ставится парой кликов и примеров в интернете масса — прекрасная основа для творчества. Одно дело скачать прошивку уже готовую под триаду давление-температура-влажность, а другое дело легко модифицируемый код. Сделал базовое, понравилось, и тут же захотелось добавить датчик освещённости, датчик скорости ветра, потом пойдёт датчик дождя, уровня осадков, чистоты воздуха, настроения кота, датчик грозы, уровня ультрафиолета…


      1. FGV
        14.03.2019 12:11

        ESP8266 может и мощнее, но инструменты разработки под неё это сплошной ужас, и развернуть их у себя тот ещё квест.

        Распаковать два архива и прописать пути к ним это квест?


        1. Alexeyslav
          14.03.2019 12:53

          Хм. Раньше это была проблема, видимо ядро наконец допилили до потребного состояния что его можно использовать в ардуино IDE.


          1. FGV
            14.03.2019 15:20

            Речь не про адурино иде. Два архива это сдк и тулчен.


            1. Alexeyslav
              14.03.2019 22:28

              Так оно собственно туда то же самое ставит. Раньше я помню именно с СДК и тулчейном были пробелмы и нужны были пляски чтобы подобрать рабочую конфигурацию, а если оно и работало то выдавало нерабочий бинарник который делал кирпич.


      1. TEEN_true
        14.03.2019 12:14

        Извините, это не базовое, а нагромождение лишнего.
        Ламповость Arduino не понятно в чем. Ну, хорошо, добавили ATMEGA*, но почему не использовать только микросхему с кварцом и двумя конденсаторами? Зачем таскать весь шилд, если он для прототипирования-only.
        И я один пишу(писал) код для ESP8266 в Arduino IDE?..


        1. Alexeyslav
          14.03.2019 12:56

          Ардуино, это не конкретная ваша платка. Это экосистема. то что вы хотите называется Arduino nano — базовая платка, можно сказать только контроллер + кварц. Отладили на UNO в устройство вставили NANO… в чем проблема?


      1. Mogwaika
        14.03.2019 15:11

        Ардуина же и на esp умеет работать…


  1. mosidze
    14.03.2019 11:05

    а что за, простите, сложность напрямую запрограммировать esp на те же действия без ардуинки?


  1. CHolfield
    14.03.2019 11:23
    +1

    А можно умеренно токсично комментить, если материал — говно?


  1. LumberJack
    14.03.2019 11:34

    Давление и температура это ещё не метеостанция.


  1. TEEN_true
    14.03.2019 11:46

    Не хватает ESP32, STM и немного Raspberry Pi.
    Тем более, что в китае уже есть готовые модули Temperature Humidity Sensor Wireless DHT22 AM2302 Shield.
    И так нельзя: «Внимание, приведенная схема без адаптера, но в реальности нужно с адаптером, но всё равно влеплю её в статью.»


    1. ksenobayt
      14.03.2019 11:50

      Шилд, по хорошему, там не сильно нужен — он для удобства подключения, скорее.


      1. TEEN_true
        14.03.2019 11:53

        Согласен. И с ним проблема в виде нагрева датчика самим ESP8266. Факт в том, что ничего лишнего не требуется.


  1. Alexeyslav
    14.03.2019 12:00

    Схемы срочно перерисовать… эти ломаные линии, накладывающиеся друг на друга, кривые и нелогичные… кроме того на схеме есть недопустимые ошибки, из-за которых схема сжигается на раз. На схеме «подключения датчика и вайфай» вас не смущает что ЕСП-шка на которой написано 3.3В подключена к 5В пину ардуины? т.е. вместо 3.3В на неё подаются смертельные 5В… это не считая того что «провода» там накладываются друг на друга и непонятно какой куда идёт, и может там вовсе они замкнуты?


  1. marsdenden
    15.03.2019 17:03

    Все бросились обсуждать ардуину, но никого не удивляет, что статья начинается с "снимите одежду с вашей жены и поставьте ее на центральной площади". И 80 порт открой и 3306 и брандмауэр выключи… Вперед, мясо для ботов и майнеров!


  1. dinovasya
    16.03.2019 15:49

    Я вообще не понял, для каких целей автору и остальным понадобилась собственная глючная метеостанция? У вас что на телефоне не показывает погоду? А вообще как она предсказывает погоду на завтра? Ах да, она же этого не умеет ))))
    Для чего она тогда?
    Или автор хочет сказать: если вы ничевошеньки не умеете, но очень хочется почуствовать что вы сами что-то ненужное можете состряпать, то вот вам подробная и немного неверная инструкция, которая сожгёт вам еспешку и будет влажность и температуру только на текущий момент показывать, то вот… Снимите все защиты от вирусов на компе, соедините эти штучки и абажайте себя…
    Я вообще не вижу смысла в бессмысленных проектах. Метеостанция- самый бесполезный проект.


    1. PravdinArduino Автор
      16.03.2019 16:01

      Между жизнью и смертью надо чем то заниматься.И вообще, что бы сделать что-то полезное сначала надо набраться опыта на чем ни будь.


  1. tea1975
    16.03.2019 15:49

    Каждый раз вскрывая подобную тему олдскульно надеюсь увидеть лайфхак по саморучному изготовлению датчиков скорости и направления ветра (анемометра), датчика кол-ва осадков, да ещё бы на современной элементной базе (например направление ветра на AS5045 или ещё круче ультразвуковой), а нарываешься на очередной термометр с функцией измерения влажности и давления да ещё на долбанной Ардуине (скоро рвотный рефлекс от этого слова будет).


  1. hofry
    16.03.2019 15:49

    Не сочтите за рекламу, недавно собирал метеостанцию по данному проекту alexgyver.ru/meteoclock


  1. gwathedhel
    17.03.2019 08:37

    Только я увидел в статье стёб? Про то, как в рабочую группу комп добавить и выключить "брандмаузер" куча скриншотов, а "апач настроить легко — rtfm". И так всё в статье)