цифровая электроника
вычислительная техника
встраиваемые системы

 

Погодная станция на основе Arduino и Wi-Fi модуля ESP8266

Автор: Mike(admin) от 21-09-2014, 07:45

Недавно вышедший на рынок Wi-Fi модуль ESP8266 вызвал небольшой ажиотаж в обществе радиолюбителей благодаря своей дешевизне. Впрочем, поскольку данный чип является новинкой, информации о его использовании пока не так много.


Погодная станция на основе Arduino и Wi-Fi модуля ESP8266

Но в сети все же стали появляться проекты с применением данного модуля, информация о которых упрощает работу с ESP8266. Одним из таких проектов стала погодная станция, которая отображает погоду на ЖК-дисплее. Соединение с сетью Wi-Fi осуществляется с помощью ESP8266.


Дешевый Wi-Fi модуль ESP8266

Модуль


В данном случае применяется модуль ESP8266ex WI07c, который имеет два светодиода для индикации питания и вывода TX. Он работает с напряжением 3.3 В, а скорость передачи данных по последовательному порту составляет 115200 бод. Вывод CH_PD должен находиться в высоком логическом состоянии.


модуль ESP8266

После сброса модуль отправляет следующие данные:



AT+RST
OK
 
 ets Jan  8 2013,rst cause:4, boot mode:(3,6)
 
wdt reset
load 0x40100000, len 24236, room 16
tail 12
chksum 0xb7
ho 0 tail 12 room 4
load 0x3ffe8000, len 3008, room 12
tail 4
chksum 0x2c
load 0x3ffe8bc0, len 4816, room 4
tail 12
chksum 0x46
csum 0x46
 
ready

Соединение


Соединение платы Arduino Uno с Wi-Fi модулем и дисплеем весьма простое. Модулю нужны два провода для питания и два провода для последовательного порта. TFT-дисплей 1.8 дюйма соединяется по шине SPI.


Погодная станция на основе Arduino и Wi-Fi модуля ESP8266

Погодная станция на основе Arduino и Wi-Fi модуля ESP8266

Программа


Код проекта довольно простой:



#include <SoftwareSerial.h>
#include <JsonParser.h>
 
#define cs   10  // Выводы на дисплей
#define dc   9
#define rst  8
 
#include <Adafruit_GFX.h>    // Графическая библиотека
#include <Adafruit_ST7735.h> // Аппаратная библиотека
#include <SPI.h>
 
Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);
 
using namespace ArduinoJson::Parser;
 
#define SSID "<ssid>" // введите ваш SSID
#define PASS "<password>" // введите ваш пароль
#define LOCATIONID "2925533" // id местоположения
#define DST_IP "188.226.224.148" //api.openweathermap.org
SoftwareSerial dbgSerial(2, 3); // RX, TX для отладки
JsonParser<32> parser;

void setup()
{
  Serial.begin(115200);
  Serial.setTimeout(5000);
  dbgSerial.begin(9600); // для отладки
  dbgSerial.println("Init");
  tft.initR(INITR_BLACKTAB);
  tft.setRotation(1);
  tft.fillScreen(ST7735_BLACK);
  tft.setCursor(2, 2);
  tft.setTextColor(ST7735_WHITE);
  Serial.println("AT+RST"); // сброс и проверка, если модуль готов
  delay(1000);
  if(Serial.find("ready")) {
    dbgSerial.println("WiFi - Module is ready");
    tft.println("WiFi - Module is ready");
  }else{
    dbgSerial.println("Module dosn't respond.");
    tft.println("Module dosn't respond.");
    tft.println("Please reset.");
    while(1);
  }
  delay(1000);
  // try to connect to wifi
  boolean connected=false;
  for(int i=0;i<5;i++){
    if(connectWiFi()){
      connected = true;
      tft.println("Connected to WiFi...");
      break;
    }
  }
  if (!connected){
    tft.println("Coudn't connect to WiFi.");
    while(1);
  }
  delay(5000);
  Serial.println("AT+CIPMUX=0"); // установка в режим одиночного соединения
}
void loop()
{
  String cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += DST_IP;
  cmd += "\",80";
  Serial.println(cmd);
  dbgSerial.println(cmd);
  if(Serial.find("Error")) return;
  cmd = "GET /data/2.5/weather?id=";
  cmd += LOCATIONID;
  cmd += " HTTP/1.0\r\nHost: api.openweathermap.org\r\n\r\n";
  Serial.print("AT+CIPSEND=");
  Serial.println(cmd.length());
  if(Serial.find(">")){
    dbgSerial.print(">");
  }else{
    Serial.println("AT+CIPCLOSE");
    dbgSerial.println("connection timeout");
    tft.fillScreen(ST7735_BLACK);
    tft.setCursor(2, 2);
    tft.setTextColor(ST7735_WHITE);
    tft.println("connection timeout");
    delay(1000);
    return;
  }
  Serial.print(cmd);
  unsigned int i = 0; //счетчик времени
  int n = 1; // счетчик символов
  char json[100]="{";
  while (!Serial.find("\"main\":{")){}
  while (i<60000) {
    if(Serial.available()) {
      char c = Serial.read();
      json[n]=c;
      if(c=='}') break;
      n++;
      i=0;
    }
    i++;
  }
  dbgSerial.println(json);
  JsonObject root = parser.parse(json);
  double temp = root["temp"];
  double pressure = root["pressure"];
  double humidity = root["humidity"];
  temp -= 273.15; // Перевод градусов кельвины-цельсии
  tft.fillScreen(ST7735_BLACK);
  tft.setCursor(2, 25);
  tft.setTextColor(ST7735_BLUE);
  tft.setTextSize(2);
  tft.print("Temp: ");
  tft.print((int)temp);
  tft.print(".");
  tft.print((int)((temp-(int)temp)*10));
  tft.println(" C");
  tft.setCursor(2, 55);
  tft.setTextColor(ST7735_GREEN);
  tft.setTextSize(2);
  tft.print("Press: ");
  tft.print((int)pressure);
  tft.setCursor(2, 85);
  tft.setTextColor(ST7735_YELLOW);
  tft.setTextSize(2);
  tft.print("Humidity: ");
  tft.print((int)humidity);
  tft.println("%");
  dbgSerial.println(temp);
  dbgSerial.println(pressure);
  dbgSerial.println(humidity);
  dbgSerial.println("====");
  delay(600000);
}
 
boolean connectWiFi()
{
  Serial.println("AT+CWMODE=1");
  String cmd="AT+CWJAP=\"";
  cmd+=SSID;
  cmd+="\",\"";
  cmd+=PASS;
  cmd+="\"";
  dbgSerial.println(cmd);
  Serial.println(cmd);
  delay(2000);
  if(Serial.find("OK")){
    dbgSerial.println("OK, Connected to WiFi.");
    return true;
  }else{
    dbgSerial.println("Can not connect to the WiFi.");
    return false;
  }
}



Тестирование дальности работы ESP8266


SDK для ESP8266


Автономное использование ESP8266 в качестве датчика


Подключение ESP8266 к датчику DHT22 и светодиоду и управление через веб-сервер


Подключение ESP8266 к Raspberry Pi


Проблема с модулем ESP-07 и ее решение


Arduino IDE теперь поддерживает модуль ESP8266


Простая плата для работы с модулем ESP8266 (ESP-01) и его перевод в режим глубокого сна


Arduino-совместимый WiFi-модуль Oak – лучше, чем просто ESP8266


Отладочная плата для WiFi модуля ESP8266 ESP-03


EMW3165 – новый дешевый WiFi модуль, который может стать убийцей ESP8266


Простой термостат на основе WiFi модуля ESP8266




Перевод © digitrode.ru


<Via>


Теги: Arduino, Wi-Fi, ESP8266



   Благодарим Вас за интерес к информационному проекту digitrode.ru.
   Если Вы хотите, чтобы интересные и полезные материалы выходили чаще, и было меньше рекламы,
   Вы можее поддержать наш проект, пожертвовав любую сумму на его развитие.


Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий
Цитата
  • remrum

  • 25 октября 2014 03:39
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
строку: cmd = " HTTP/1.0\r\nHost: api.openweathermap.org\r\n\r\n"; нужно исправить на: cmd += " ...
также мне пришлось поменять CWMODE=1 на 3
Цитата
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
День добрый.
А можно дополнить пример реализации для отправки показаний на проект http://narodmon.ru ? Дабы можно было просматривать показания не только на сайте, но и на Android, iOS, Win, Nix и т.д.
Описание протоколов http://narodmon.ru/#proto
PS Все подробности по указанному email.
Цитата
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Когда я соединяю на модуле проводки vcc и ch_pd, у меня гаснет красный индикатор на модуле и компьютер перестает прошивать(не может найти ком порт)
Цитата
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Интересно как она работает без датчиков ))) фантастика. да и вообще зачем тут ардуина этот модуль же в полне самодостаточный и экран можно подключить через i2c.
Цитата
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Что-то у меня компилируется скетч. Ругается на сточку --> using namespace ArduinoJson::Parser;
Наверное что-то не так с библиотекой JsonParser.h. Я ее скачал вот от сюда --> https://github.com/markert/ArduinoJsonParser

Что я делаю неправильно?
Цитата
  • Николай

  • 16 апреля 2015 00:16
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Пара вопросов.
1) По документации ESP8266 потребляет до 200 мА в режиме передачи. Вывод 3.3V у Ардуино UNO - до 50 мА. Не стоит ли использовать внешний источник?

2) Входы - выходы Arduino UNO пятивольтовые, ESP8266 по документации выдерживает до 3.6 вольт. Нет ли опасности спалить чип?
Цитата
  • Dave Jones

  • 17 апреля 2015 06:10
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Цитата: Николай
Пара вопросов.
1) По документации ESP8266 потребляет до 200 мА в режиме передачи. Вывод 3.3V у Ардуино UNO - до 50 мА. Не стоит ли использовать внешний источник?

2) Входы - выходы Arduino UNO пятивольтовые, ESP8266 по документации выдерживает до 3.6 вольт. Нет ли опасности спалить чип?


Действительно, ESP8266 "не любит" напряжение больше 5В. Хотя в интернете достаточно примеров, когда модуль запускали напрямую от Arduino. Но это рискованно. Вот что пишут на одном из форумов буржнета; "Data lines are not 5V tolerant. It won't burn out the chip (at least not right away) but you'll get unexpected resets, etc. ". То есть чип может и не сгорит, но могут возникнуть некоторые проблемы в виде неожиданных перезагрузок. Ну и источник питания тоже желательно отдельный, хотя 200 мА модуль потребляет далеко не всегда.
Цитата
  • Ruslan

  • 5 августа 2015 14:01
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Какой у тебя JSON ответ от сервера приходит, можешь показать
Цитата
  • плага

  • 17 января 2016 16:19
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Взято с http://zeflo.com/2014/esp8266-weather-display/
Цитата
  • Группа: Администраторы
  • ICQ:
  • Регистрация: 28.08.2013
  • Статус: Пользователь offline
  • Комментариев: 15
  • Публикаций: 1769
^
Цитата: плага
Взято с http://zeflo.com/2014/esp8266-weather-display/

Это указано в конце статьи по ссылке <Via>
Цитата
  • Николай

  • 23 февраля 2016 10:39
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Здравствуйте.
Я не могу никак заставить ESP8266 разговривать. Перепробовал уже кучу примеров, кучу подключений. Потом попробовал подключить через переходник USB-TTL-UART и наконец модуль заговорил через терминал. Оказалось после каждой команды после клавиши Enter надо добавить Alt+10 (символ новой строки). Причем настройка в Putty "Implicit LF in every CR" не помогла, так и общался с модулем через Alt+10. Вернулся к опытам с Arduino, но фокус с добавлением "\n" или "\r" в конце команды не помог - молчит. Правда беда еще в том, что вывод ком-порта у меня на скорости 9600, а ESP работает только на 115200 (по крайней мере в Путти он только так работал). Поэтому даже когда перетыкаю питание, в Мониторе COM-порта появляются только буквы "я". В Путти при перетыкании питания происходила перезагрузка с указанием версии, какого мусора и в конце "ready" было. Так как заставить его заговорить с Ардуино???
Цитата
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Мой сайт метеостанции на Ардуино. Город Вознесенск, Украина http://vozmeteo.com.ua
Цитата
  • IOPA4

  • 8 июня 2017 14:39
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Попробовал состыковать ESP8266 и LCD Nokia5110, ST7735. Оба проекта работают на ура. Получают время и погоду из интернета. Выложил на сайте http://iopa4.narod.ru
Цитата
  • Andrej

  • 11 августа 2017 21:41
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Не мучтесь с 8-битными дорогими AVR-ками c мизерной памятью, переходите на 32-битную STM32 платформу.