Метеостанция Arduino
Я решил написать подробную статью, рассказывающую все аспекты создания метеостанции Arduino, по скольку сразу сложно охватить весь процесс. Мое исполнение метеостанции удобно тем, что ее данные сохраняются на компьютере.
- локальная сеть, построенная с помощью Wifi роутера
- компьютер
Arduino 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 на видимость в локальной сети.
После этого создайте таблицу в базе данных — там будет сохраняться температура.
Пример моей страницы обработчика( показаний датчика) на сервере:
$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.

Нажмите, чтобы увеличить.
- Введите команду AT.
- Высветиться OK.
- Введите AT+RESTORE, это спросит модуль на заводские настройки.
- Введите AT+CWMODE_CUR=1, это переведет модуль в режим клиента.
- Введите AT+CWJAP_CUR=«Имя_сети», «Пароль» — подключение к вайфай.
- Высветиться OK, если соединение произошло.
Настройка bme280 и финальная сборка
Соедините выводы согласно схеме(внимание на схеме изображен esp8266 без адаптера, но в реальности его надо соединить с адаптером, а уже из
адаптера 4 вывода имеют туже функцию что изображены на схеме. )

Нажмите, чтобы увеличить.
Откройте 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 и поместите код:
#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; }
Готово. Данные температуры, передадутся в виде переменных в базу данных.
Как видите моя метеостанция требует начальных знаний веб программирования, но результат стоит того.
