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

 

Погодная станция на основе 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



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

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

Оставить комментарий
Цитата
  • 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
  • Статус: Пользователь Онлайн
  • Комментариев: 10
  • Публикаций: 379
^
Цитата: плага
Взято с 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