Jump to content
iT4iT.CLUB
Sign in to follow this  
Kitsum

Домашняя метеостанция на Arduino и отправка данных на "Народный мониторинг"

Recommended Posts

Это первая часть и соответственно первая версия метеостанции. Постепенно будем её улучшать обвешивая всяческими лампочками, свистульками и т.п. Текущий вариант протестирован и стабильно работает с июля 2015.

Использованы:

  1. Копия Arduino NANO на базе микроконтроллера ATmega328p
  2. Ethernet shield на базе чипа ENC28J60
  3. Датчик влажности AM2302, известный в народе как DHT22
  4. Барометр/Термометр GY-68 на базе сенсора фирмы BOSH - BMP180

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

Также Вас может заинтересовать вариант метеостанции на ESP8266

ВАЖНО!

Я использовал в скетче сторожевой таймер (Watchdog timer). Для этого необходимо перепрошить загрузчик Arduino NANO (ATmega328p) со стандартного на Оptiboot (как это сделать описано тут). Если залить выложенный ниже скетч в неподготовленный контроллер, получите "кирпич".

Если Вы читаете эту часть уже после того как залили скетч, то необходимо перезапустить микроконтроллер по питанию (и только по питанию) и у Вас будет 8 сек. на перепрошивку его другой программой. Иначе "селяви", что в переводе с древнегреческого - НЕ ПОВЕЗЛО! Процедуру можно повторять сколько угодно раз, пока не восстановите беднягу.

Вступительная часть окончена, переходим к делу

Станция разделена на две части

Первая находится дома, состоит из микроконтроллера и сетевого модуля, её задача производить все необходимые вычисления и держать связь с проектом "Народный мониторинг".

Скрытый текст

2015-07-26 11.05.04.jpg

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

Скрытый текст

2015-07-26 11.05.16.jpg

На самом деле есть стандарты для размещения погодных станций и ни одно из изделий используемых в быту (пусть даже самое дорогое и крутое) никогда не покажет Вам точных данных. Это связано с местом её установки. Погодная станция должна стоять в чистом поле на высоте пары метров от земли и т.д и т.п. Вы это легко найдете в сети. Ну а нас интересуют приблизительные значения.

Схема этого безобразия, за исключением Ethernet модуля (это просо "бутерброд"), выглядит так.

arduino_weather_station1.png

На схеме использовал датчик BMP085 т.к другого я не нашел в Fritzing. На практике стоит BMP180 и подключен по 5V а не по 3.3V Т.к изучение китайской платы показало, что на борту имеется преобразователь.

Скрытый текст

2015-09-26 22.54.46.jpg

Датчик DHT22 имеет обвязку в виде SMD резистора 0805 на 10kOm между двумя ногами - питание и 1-Wire. Но братья Китайцы могут продать датчик уже в обвязке по значительно завышенной ценой.

Скрытый текст

2015-07-05 20.10.13.jpg

Для корпуса уличной части я выбрал пластиковую распределительную коробку со съемными заглушками. Датчики разместил в верхней части т.к там оставлены заглушки для зашиты от воды во время дождей. Остальные заглушки убраны для повышения точности измерений.

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

Если следовать ГОСТу, то сенсоры должны быть размещены в тени в течение всего дня.

Скрытый текст

2015-07-05 20.09.56.jpg

Скрытый текст

2015-07-05 20.10.05.jpg

Переходим к самому вкусному

Необходимо зарегистрироваться на http://narodmon.ru/ и добавить Ваше устройство. В качестве идентификатора, чтобы не запутать себя, Вы можете использовать MAC адрес Ethernet модуля. В данном случае мы будем передавать данные по TCP на 8283 порт сервера. Телеграмма будет состоять из:

  1. Идентификатора устройства (MAC адрес)
  2. Названия устройства
  3. GPS координаты для позиционирования на карте проекта (т.к станция стационарна, координаты указаны в скетче без использования GPS модуля)
  4. Показания со всех датчиков

Программная часть

Понадобятся библиотеки:

  1. BMP180 (использует библиотеку BMP085) bmp085.zip
  2. DHT22 https://github.com/adafruit/DHT-sensor-library
  3. UIPEthernet https://github.com/ntruchsess/arduino_uip
  4. 1-Wire http://playground.arduino.cc/Learning/OneWire

PayPal.png

Скетч

Скрытый текст

#include <avr/wdt.h>
#include <Wire.h>
#include <BMP085.h>
#include "DHT.h"
#include <UIPEthernet.h>

#define DHTTYPE DHT22
#define DHTPIN 5

DHT dht(DHTPIN, DHTTYPE);

byte mac[] = {0x54, 0x34, 0x31, 0x31, 0x31, 0x31};
char server[] = "narodmon.ru";
int port = 8283;

IPAddress ip(192,168,0,201);
EthernetClient client;

BMP085 dps = BMP085();
long Temperature = 0, Pressure = 0;

bool interval = true;

void setup() {
  // Инициализация сторожевого таймера (Watchdog timer)
  wdt_disable();
  delay(8000);
  wdt_enable(WDTO_8S);
  // Инициализация консоли
  Serial.begin(9600);
  // Инициализация датчика DHT
  dht.begin();
  // Стартуем сеть, если не дождались данных с DHCP сервера то
  // присваеваем себе адрес самостоятельно
  if (Ethernet.begin(mac) == 0) Ethernet.begin(mac, ip);
  // Инициализация 1-Wire
  Wire.begin();
  delay(200);
  
  // Инициализация BMP180 с корректировкой высоты
  // dps.init(MODE_STANDARD, 3200, true);
  
  // Инициализация BMP180
  dps.init();

  // Отправляем первые данные сразу после включения устройства
  send_info();
}
// dewPoint function NOAA
// reference (1) : http://wahiduddin.net/calc/density_algorithms.htm
// reference (2) : http://www.colorado.edu/geography/weather_station/Geog_site/about.htm
double dewPoint(double celsius, double humidity)
{
  // (1) Saturation Vapor Pressure = ESGG(T)
  double RATIO = 373.15 / (273.15 + celsius);
  double RHS = -7.90298 * (RATIO - 1);
  RHS += 5.02808 * log10(RATIO);
  RHS += -1.3816e-7 * (pow(10, (11.344 * (1 - 1/RATIO ))) - 1) ;
  RHS += 8.1328e-3 * (pow(10, (-3.49149 * (RATIO - 1))) - 1) ;
  RHS += log10(1013.246);
  // factor -3 is to adjust units - Vapor Pressure SVP * humidity
  double VP = pow(10, RHS - 3) * humidity;
  // (2) DEWPOINT = F(Vapor Pressure)
  double T = log(VP/0.61078);   // temp var
  return (241.88 * T) / (17.558 - T);
}
// delta max = 0.6544 wrt dewPoint()
// 6.9 x faster than dewPoint()
// reference: http://en.wikipedia.org/wiki/Dew_point
double dewPointFast(double celsius, double humidity)
{
  double a = 17.271;
  double b = 237.7;
  double temp = (a * celsius) / (b + celsius) + log(humidity*0.01);
  double Td = (b * temp) / (a - temp);
  return Td;
}

void send_info() {
  float H, dP, dPt;
  bool fail = true;

  while(fail) {
    // Пытаемся считать данные с датчика влажности DHT до тех пор, пока не получим 
    // результат. В 90% случаев все работает нормально, но нам нужны 100%
    if((H = dht.readHumidity()) >= 0) {
      // Получение влажности и температуры с датчика BMP180
      dps.getPressure(&Pressure);
      dps.getTemperature(&Temperature);
      // Подсчитываем точку росы, если температура на улице выше 0 градусов Цельсия
      // и ожидаем результат выше 0, в противном случае выводим 0. Это необходимо
      // чтобы не вводить в заблуждения в зимее время года.
      dP = Temperature>0?((dPt=dewPoint(Temperature*0.1, H))<0?0:dPt):0;
      // Подключаемся к серверу "Народный мониторинг"
      if(client.connect(server, port)) {
        // Начинаем передачу данных
        // адрес_устройства_в_проекте, имя_устройства, GPS широта, GPS долгота
        client.print(F("#fe-31-31-0e-5a-3b#Arduino Nano#71.344699#27.200014\n"));
        // температура
        client.print(F("#T0#"));
        client.print(Temperature*0.1);        
        client.print(F("#Температура\n"));
        // Давление
        client.print("#P1#");
        client.print(Pressure/133.3);
        client.print(F("#Давление\n"));
        // Влажность
        client.print("#H1#");
        client.print(H);
        client.print(F("#Влажность\n"));
        // Точка росы
        client.print("#T1#");
        client.print(dP);
        client.print(F("#Точка росы\n"));
        // Отправляем конец телеграммы
        client.print("##");

        // Даем время отработать Ethernet модулю и разрываем соединение
        delay(200);
        client.stop();
        // Останавливаем цикл, если передача завершена
        fail = !fail;
        break;
      }
      delay(250);
    }
    delay(250);
  }
}

void loop()
{
  // Каждые 3 секунды сбрасываем сторожевой таймер микроконтроллера
  // Каждые 6 минут отправляем данные на "Народный мониторинг"
  if(!(millis()/1000%30)) wdt_reset();
  if(!(millis()/1000%360)) {
    if(interval) {
      send_info();
      interval = false;
    }
  }
  else interval = true; 
}

 

Данные о температуре снимаются с датчика BOSH, они более точны.

Точка росы рассчитывается исходя из текущих показаний температуры и влажности. В коде имеются две функции взятые с просторов интернета:

  1. dewPoint
  2. dewPointFast

Использовать можно любую. Также имеется проверка показаний точки росы. Вычисления не производятся при минусовой температуре и значение обнуляется при показаниях ниже нуля. Т.к это уже не точка росы, а точка образования инея. Если я не прав, то прошу меня поправить.

Если желаете получать отрицательные показания, то необходимо заменить:

dP = Temperature>0?((dPt=dewPoint(Temperature*0.1, H))<0?0:dPt):0;

на

dP = dewPoint(Temperature*0.1, H);

На сайте проекта имеются ссылки на приложения под разные платформы. Я использую Android и для примера взял два разных виджета. Выглядит это следующим образом.

Скрытый текст

2015-09-27 11.25.39.png

В дальнейшем планирую:

  1. Увеличить разнообразие датчиков
  2. Объединить обе части метеостанции и вынести все на улицу
  3. Уйти от ENC28J60 в пользу W5100 или W5500
  4. Использовать POE для питания всей кухни

PS: пока все доволен. Посмотрим как конструкция переживет зиму и сделаем дополнительные выводы.

bmp085.zip

  • Like 1

Share this post


Link to post
Share on other sites

Продолжаем развивать нашу метеостанцию.

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

Мне написал один из наших коллег с вопросом, по какой причине введен сторожевой таймер?

Цитата

Сторожевой таймер стоит на случай ч.п. Как показывает практика, ENC28J60 не тянет более (если не подводит память) 4 одновременных соединений. Учитывая сколько служебных соединений, постоянно происходит для поддержания работы самой сети, и просто левый трафик, создаваемый всяческими домашними игрушками (например, современные телевизоры, сканируют доступные хосты в сети и открытые у них порты) конструкция попросту уходит в ступор. ENC28J60 не умеет самостоятельно работать с сетевыми протоколами и все реализовано в библиотеках. Возможно дело именно в них. 
Проверял все доступные библиотеки и разные модули (вдруг брак), но добиться стабильной работы в течении длительного времени у меня не получилось. Максимальный срок был порядка 3-4 недель.
Именно для этого там крутится "пес" и в случае чего дергает контроллер. После этого проблема ушла.
Также не отрицаю, что возможно в моей домашней сети есть определенные нюансы или проблемы. Но раз проблема была у меня, она может выплыть и у другого человека. Я пока нашел только такое решение.
Насколько мне известно, на чипах от Wiznet (W5100 и выше) этого нет, ну или просто плохо искали.

Переходим к обновлению

ws1.thumb.jpg.3b8bd2b7f8d6df5e2ce091a9ea

ws2.thumb.jpg.9867ee032b43afc4b410e85cc5

Самое главное, мы уходим от чипа ENC28J60 и переходим на W5100. Я пытался реализовать все на старом чипе, но не хватает памяти микроконтроллера из-за очень больших библиотек для ENC28J60. При использовании нового чипа, стандартной библиотеки от разработчика и всех внесенных изменений, остается еще более 20% свободной памяти микроконтроллера ATMega328. А это, новые плюшки!

В этой версии (назовем её второй) добавлена возможность передачи показаний с датчиков по беспроводной связи используя частоту 433 мГц. Сами модули я брал у Китайцев, маркировка XY-MK-5V. Хочу отметить, что качество передачи далеко от совершенства. Возможны потери сигнала, шумы, не возможность одновременной передачи и т.д и т.п. Но их цена (менее $1 за комплект) компенсируют эти недостатки. Скажу Вам по секрету, что именно эти (самые дешевые) модули стоят во многих фирменных метеостанциях для домашнего использования. Ого, неожиданно?

Начнем с базовой станции

Мы переходим на Arduino UNO и Ethernet Shield (первой версии) на базе чипа W5100. Это бутерброд и описывать его нету смысла. Я опишу только дополнительно задействованные контакты для модулей XY-MK-5V.

Модуль передатчика использует питание 5V, GND (куда без матушки то) и D2 пин на контроллере. Изменить контакт D2 (DATA) можно, используя функцию vw_set_tx_pin из библиотеки vw.

В отличии от предыдущего скетча, в этом задействованы две дополнительные библиотеки:

#include <VirtualWire.h>
#include <EasyTransferVirtualWire.h>
  1.  VirtualWire.zip
  2.  EasyTransferVirtualWire.zip

PayPal.png

Сам скетч

Скрытый текст

#include <avr/wdt.h>
#include <Wire.h>
#include <BMP085.h>
#include <DHT.h>
#include <SPI.h>
#include <Ethernet.h>
#include <VirtualWire.h>
#include <EasyTransferVirtualWire.h>

#define DHTTYPE DHT22
#define DHTPIN 5

DHT dht(DHTPIN, DHTTYPE);

byte mac[] = {0x54, 0x34, 0x31, 0x31, 0x31, 0x31};
char server[] = "narodmon.ru";
int port = 8283;

IPAddress ip(192,168,0,201);
EthernetClient client;

BMP085 dps = BMP085();
long Temperature = 0, Pressure = 0;
float H, dP, dPt;

bool interval = true;

EasyTransferVirtualWire ET;
struct SEND_DATA_STRUCTURE{
   byte ID;           // Идентификатор устройства
    int Temperature;  // Температура
  float Pressure;     // Давление
  float Humidity;     // Влажность
  float dewPoint;     // Точка росы/инея
};
SEND_DATA_STRUCTURE broadcast;

void setup() {
  // Инициализация сторожевого таймера (Watchdog timer)
  wdt_disable();
  delay(8000);
  wdt_enable(WDTO_8S);
  // Инициализация консоли
  Serial.begin(9600);
  // Инициализация датчика DHT
  dht.begin();

  // Инициализация модуля 433 мГц
  ET.begin(details(broadcast));
  vw_set_ptt_inverted(true);
  vw_set_tx_pin(2);
  vw_setup(2000);
  
  // Стартуем сеть, если не дождались данных с DHCP сервера то
  // присваеваем себе адрес самостоятельно
  if (Ethernet.begin(mac) == 0) Ethernet.begin(mac, ip);
  // Инициализация 1-Wire
  Wire.begin();
  delay(200);
  
  // Инициализация BMP180 с корректировкой высоты
  // dps.init(MODE_STANDARD, 3200, true);
  
  // Инициализация BMP180
  dps.init();
 
  Serial.println(Ethernet.localIP());
  
  // Отправляем первые данные сразу после включения устройства
  send_info(true);
}
// dewPoint function NOAA
// reference (1) : http://wahiduddin.net/calc/density_algorithms.htm
// reference (2) : http://www.colorado.edu/geography/weather_station/Geog_site/about.htm
double dewPoint(double celsius, double humidity)
{
  // (1) Saturation Vapor Pressure = ESGG(T)
  double RATIO = 373.15 / (273.15 + celsius);
  double RHS = -7.90298 * (RATIO - 1);
  RHS += 5.02808 * log10(RATIO);
  RHS += -1.3816e-7 * (pow(10, (11.344 * (1 - 1/RATIO ))) - 1) ;
  RHS += 8.1328e-3 * (pow(10, (-3.49149 * (RATIO - 1))) - 1) ;
  RHS += log10(1013.246);
  // factor -3 is to adjust units - Vapor Pressure SVP * humidity
  double VP = pow(10, RHS - 3) * humidity;
  // (2) DEWPOINT = F(Vapor Pressure)
  double T = log(VP/0.61078);   // temp var
  return (241.88 * T) / (17.558 - T);
}

void send_info(bool eth) {
  bool fail = true;

  while(fail) {
    // Пытаемся считать данные с датчика влажности DHT до тех пор, пока не получим 
    // результат. В 90% случаев все работает нормально, но нам нужны 100%
    if((H = dht.readHumidity()) >= 0) {
      // Получение влажности и температуры с датчика BMP180
      dps.getPressure(&Pressure);
      dps.getTemperature(&Temperature);
      // Подсчитываем точку росы, если температура на улице выше 0 градусов Цельсия
      // и ожидаем результат выше 0, в противном случае выводим 0. Это необходимо
      // чтобы не вводить в заблуждения в зимее время года.
      // dP = Temperature>0?((dPt=dewPoint(Temperature*0.1, H))<0?0:dPt):0;
      dP = dewPoint(Temperature*0.1, H);

      // Отправляем данные в эфир 433 мГц
      broadcast.ID = 1;
      broadcast.Temperature = floor(Temperature*0.1);
      broadcast.Pressure    = floor(Pressure/133.3*10)/10;
      broadcast.Humidity    = floor(H*10)/10;
      broadcast.dewPoint    = floor(dP*10)/10;
      ET.sendData();
      delay(250);

      if(eth) {
        // Подключаемся к серверу "Народный мониторинг"
        if(client.connect(server, port)) {
          // Начинаем передачу данных
          // адрес_устройства_в_проекте, имя_устройства, GPS широта, GPS долгота
          client.print(F("#fe-31-31-0e-5a-3b#Arduino Uno#71.344699#27.200014\n"));
          // Температура
          client.print(F("#T0#"));
          client.print(Temperature*0.1);        
          client.print(F("#Температура\n"));
          // Давление
          client.print("#P1#");
          client.print(Pressure/133.3);
          client.print(F("#Давление\n"));
          // Влажность
          client.print("#H1#");
          client.print(H);
          client.print(F("#Влажность\n"));
          // Точка росы\инея
          client.print("#T1#");
          client.print(dP);
          client.print((dP <= 0)? F("#Точка инея\n"):F("#Точка росы\n"));
          //client.print(F("#Точка росы\n"));
          // Отправляем конец телеграммы
          client.print("##");
        
          // Даем время отработать Ethernet модулю и разрываем соединение
          delay(250);
          client.stop();
        }
      }
      // Останавливаем цикл, если передача завершена
      fail = !fail;
      break;
    }
    delay(250);
  }
}

void loop()
{
  // Каждые 4 секунды сбрасываем сторожевой таймер микроконтроллера
  // Каждые 6 минут отправляем данные на "Народный мониторинг"
  // Каждые 30 секунд отсылаем данные в эфир 433
  if(!(millis()%1000)) wdt_reset();
  if(!(millis()%360000)) send_info(true);
  if(!(millis()%30000)) send_info(false);
}

 

К самим модулям необходимо добавить антенну.  Для 433 мГц достаточно обычного медного провода длинной 17 см. Без антенны можете забыть о нормальной работе.

Переходим к самой важной части этого обновления - локальная беспроводная станция

Для её реализации (на коленке) я использовал аналог Arduino NANO (на базе ATMega328) и TFT дисплей на чипе ST7735S с разрешением 128 x 160

Скрытый текст

1.8_B.thumb.JPG.da9ee0de7c73021638755a3e1.8_C.thumb.jpg.51f33277344535ee5c9882a3SKU128815e.thumb.JPG.8fcef552562ebd80298

Распиновка дисплей -> контроллер

=============================
LED	    |	3.3V
SCK	    |	SCK	    (13)
SDA	    |	MOSI	(11)
A0	    |	DC	    (9)
RESET	|	RST	    (8)
CS	    |	CS	    (10)
GND	    | 	GND
VCC	    |	5V
============================

Модуль приемник подключается также как передатчик, только DATA к пину D7.

Пару снимков, как это выглядит:

Скрытый текст

ws3.thumb.jpg.e57c3c7e16a3cdfc71f85b0a59

ws4.thumb.jpg.8b8d250793e4ad41a0bedee711

ws5.thumb.jpg.34db8e052a96c34cc668577d40

ws6.thumb.jpg.d2f783c71d08f1d5b8417922b9

Скетч приемника

Скрытый текст

#include <VirtualWire.h>
#include <EasyTransferVirtualWire.h>
#include <TFT.h>
#include <SPI.h>

int x, y;
int w = 128, h = 160;
int size;

// 433
EasyTransferVirtualWire ET;
struct SEND_DATA_STRUCTURE{
   byte ID;           // Идентификатор устройства
    int Temperature;  // Температура
  float Pressure;     // Давление
  float Humidity;     // Влажность
  float dewPoint;     // Точка росы/инея
};
SEND_DATA_STRUCTURE broadcast;

  int Log_Temperature = -1;
float Log_Pressure    = -1;
float Log_Humidity    = -1;
float Log_dewPoint    = -1;

// TFT
#define cs   10
#define dc   9
#define rst  8

char Temperature[6], Pressure[9], Humidity[4], dewPoint[6];
String info;

TFT TFTscreen = TFT(cs, dc, rst);

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

  // Инициализация модуля 433 мГц
  ET.begin(details(broadcast));
  
  vw_set_ptt_inverted(true);
  vw_set_rx_pin(7);
  vw_setup(2000);
  vw_rx_start();

  // Инициализация и начальная настройка дисплея
  TFTscreen.begin();
  TFTscreen.setRotation(2);
  TFTscreen.background(0, 0, 0);
  
  // Рисуем статические элементы
  // 1. Заходите к нам в гости
  TFTscreen.stroke(255, 255, 255);
  TFTscreen.setTextSize(1);
  TFTscreen.text("HTTPS://iT4iT.CLUB", 10, 10);
  // 2. Описание показаний с датчиков
  TFTscreen.text("mmHg", w/2+5, 80);
  TFTscreen.text("%", w/2+5, 100);
  TFTscreen.text("C", w/2+5, 120);
  
  broadcast.Temperature = 0;
  broadcast.Pressure    = 0;
  broadcast.Humidity    = 0;
  broadcast.dewPoint    = 0;

  TFTPrint();
}

void loop(){
  if(ET.receiveData()){
    if(broadcast.ID == 1) TFTPrint();
    /*
    Serial.println(broadcast.Temperature);
    Serial.println(broadcast.Pressure);
    Serial.println(broadcast.Humidity);
    Serial.println(broadcast.dewPoint);
    Serial.println();
    */
  }
}

void changes(int size, int x, int y, bool up, bool clear = false) {
  if(clear) TFTscreen.stroke(0, 0, 0);
  else {
    changes(size, x, y, !up, true);
    TFTscreen.stroke((up)?0:255, 0, (up)?255:0);
  }
  if((size%2) == 0) size++;
  while(size > 0) {
    TFTscreen.line(x, y, x+(size--), y);
    ++x, (up)?--y:++y, --size;
  }
  /*
  while(size > 0) {
    TFTscreen.line(x, y, (up)?x+size-1:x, (up)?y:y+size-1);
    ++x, ++y, --size;
  }
  */
}

int x_center(int w, int length, int size) {
  return floor((w-length*(size*5)+size*2)/2);
}

int x_alignment_right(int w, int length, int size) {
  return ceil(w-length*(size*5)+size*2);
}

void TFTPrint() {  
  size = 3;

  // ==================================================================================
  // Вывод показаний температуры
  // ==================================================================================
  if(broadcast.Temperature != Log_Temperature) {
    TFTscreen.setTextSize(size);
   
    // Затираем устаревшие данные
    String info = String(Log_Temperature);
    info.concat(" C");
    if(Log_Temperature > 0) info = '+'+info;
    info.toCharArray(Temperature, info.length()+1);
    TFTscreen.stroke(0, 0, 0);
    TFTscreen.text(Temperature, x_center(w, info.length()+1, size), 35);
    
    // Выводим новые показания
    info = String(broadcast.Temperature);
    info.concat(" C");
    if(broadcast.Temperature > 0) info = '+'+info;
    info.toCharArray(Temperature, info.length()+1);

    // Меняем цвет значения температуры в зависимости от самой температуры
    int r, g = 0, b;
    if(broadcast.Temperature > 0) {
      r = map(broadcast.Temperature, 0, 40, 255, 150);  // Красный
      b = map(broadcast.Temperature, 0, 40, 30, 0);     // Изменяем оттенок для более наглядного перехода через ноль
    }
    else {
      r = map(broadcast.Temperature, -40, 0, 0, 30);    // Изменяем оттенок для более наглядного перехода через ноль
      b = map(broadcast.Temperature, -40, 0, 150, 255); // Синий
    }  
    TFTscreen.stroke(b, g, r); // ВНИМАНИЕ: в библиотеке перепутаны позиции цветов, место RGB используется BGR!    
    TFTscreen.text(Temperature, x_center(w, info.length()+1, size), 35);
  }

  size = 1;

  // ==================================================================================
  // Вывод показаний давления
  // ==================================================================================
  if(broadcast.Pressure != Log_Pressure) {
    TFTscreen.setTextSize(size);

    // Затираем устаревшие данные
    info = String(Log_Pressure);
    info.toCharArray(Pressure, info.length());    
    TFTscreen.stroke(0, 0, 0);
    TFTscreen.text(Pressure, x_alignment_right(w/2-5, info.length(), size), 80);
    
    // Выводим новые показания
    info = String(broadcast.Pressure);
    info.toCharArray(Pressure, info.length());
    TFTscreen.stroke(255, 255, 255);
    TFTscreen.text(Pressure, x_alignment_right(w/2-5, info.length(), size), 80);
    
    changes(10, 106, 85, (broadcast.Pressure > Log_Pressure)?true:false);
  }
  else {
    changes(10, 106, 85, true, true);
    changes(10, 106, 85, false, true);
  }

  // ==================================================================================  
  // Вывод показаний влажности
  // ==================================================================================
  if(broadcast.Humidity != Log_Humidity) {
    TFTscreen.setTextSize(size);

    // Затираем устаревшие данные
    info = String(Log_Humidity);
    info.toCharArray(Humidity, info.length());    
    TFTscreen.stroke(0, 0, 0);
    TFTscreen.text(Humidity, x_alignment_right(w/2-5, info.length(), size), 100);

    // Выводим новые показания
    info = String(broadcast.Humidity);
    info.toCharArray(Humidity, info.length());
    TFTscreen.stroke(255, 255, 255);
    TFTscreen.text(Humidity, x_alignment_right(w/2-5, info.length(), size), 100);

    changes(10, 106, 105, (broadcast.Humidity > Log_Humidity)?true:false);
  }
  else {
    changes(10, 106, 105, true, true);
    changes(10, 106, 105, false, true);
  }

  // ==================================================================================
  // Вывод показаний точки росы\инея
  // ==================================================================================
  if(broadcast.dewPoint != Log_dewPoint) {
    TFTscreen.setTextSize(size);

    // Затираем устаревшие данные
    info = String(Log_dewPoint);
    info.toCharArray(dewPoint, info.length());    
    TFTscreen.stroke(0, 0, 0);
    TFTscreen.text(dewPoint, x_alignment_right(w/2-5, info.length(), size), 120);

    // Выводим новые показания
    info = String(broadcast.dewPoint);
    info.toCharArray(dewPoint, info.length());
    TFTscreen.stroke(255, 255, 255);
    TFTscreen.text(dewPoint, x_alignment_right(w/2-5, info.length(), size), 120);

    changes(10, 106, 125, (broadcast.dewPoint > Log_dewPoint)?true:false);
  }
  else {
    changes(10, 106, 125, true, true);
    changes(10, 106, 125, false, true);
  }

  // Обновляем значения в логах для последующего сравнения показаний
  Log_Temperature = broadcast.Temperature;
  Log_Pressure    = broadcast.Pressure;
  Log_Humidity    = broadcast.Humidity;
  Log_dewPoint    = broadcast.dewPoint;
}

 

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

Как мне показалось, дизайн это та часть проекта, которая отнимает большую часть времени!

Скрытый текст

ws7.thumb.jpg.9f7cd0164b59785882b8334466ws8.thumb.jpg.ed96f96acab8db15f33e39657dws9.thumb.jpg.99e23f601a4018d32ff966c11aws10.thumb.jpg.f63ab87c09956186c3cff6281

Часть данных сфабрикованы для отображения некоторых элементов дизайна.

Артефакты на дисплее, это пыль и прочая грязь скопившаяся за долго время нахождения дисплея в... где то там, ... ну там, не помню откуда его достал! Отстаньте!

В скетче имеются функции позиционирования. Они довольно примитивны, но позволяют добиться определенных эффектов.

  1. x_center
  2. x_alignment_right

Первая производит центровку текста, а вторая выравнивание по правой части указанной зоны. Все вычисления производятся относительно размеров заданного текста, исходя из выражения 1 size = 1PX х 1PX сегмента шрифта.

На дисплее также отображаются элементы соответствующие повышению или понижению той или оной величины показаний. Отображаются они в виде треугольников. Но в коде функции changes есть альтернативное отображение в виде треугольников повернутых на 45 градусов. Если показания повышаются то элемент красный, в противном случае, синий.

Кстати, цвет и оттенок основной температуры изменяется в зависимости от самой температуры. Довольно спорное решение, но на мой взгляд, визуально комфортное. Я некоторое время бился над ней, и понял, что значения в функции stroke, объекта TFT дисплея, указаны в неверном порядке. BGR место RGB. Это ошибка разработчика, ну или я что-то не понимаю.

PS: Все довольно интересно, но на мой взгляд заслуживает дальнейшего развития. Чем и займемся через какое то время. 

EasyTransferVirtualWire.zip

VirtualWire.zip

  • Like 1

Share this post


Link to post
Share on other sites

Изначально задумывалось использовать WiFi и автономное питание, а саму метеостанцию разместить на улице. Но аккумуляторы не смогут пережить зимний период времени, а значит нужно тянуть линию с питанием. Тут и пришла мысль, если есть один провод, то идея с беспроводной связью уже смотрится не так шикарно.

Вообще можно все описанное ранее реализовать на ESP8266, но вопрос с питанием остается открытым. Предполагаю, что минимальное время автономной работы должно быть не менее полугода. 

Share this post


Link to post
Share on other sites
17 минуту назад, Kitsum сказал:

Изначально задумывалось использовать WiFi и автономное питание, а саму метеостанцию разместить на улице. Но аккумуляторы не смогут пережить зимний период времени, а значит нужно тянуть линию с питанием. Тут и пришла мысль, если есть один провод, то идея с беспроводной связью уже смотрится не так шикарно.

Вообще можно все описанное ранее реализовать на ESP8266, но вопрос с питанием остается открытым. Предполагаю, что минимальное время автономной работы должно быть не менее полугода. 

одно дело это когда идут две тонкие жилки на питание из по подоконника а другое когда 5е через всю квартиру... и цена вайфай модуля менее 100р

Edited by svchekalin

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
15 час назад, Kitsum сказал:

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

это ты меня так акуратно в сторону леса послал  ?

Share this post


Link to post
Share on other sites
3 часа назад, svchekalin сказал:

это ты меня так акуратно в сторону леса послал  ?

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

Share this post


Link to post
Share on other sites
4 часа назад, Kitsum сказал:

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

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

Share this post


Link to post
Share on other sites

Ну почему так?!!!! Меняю любой int на double или float, передатчик перестает излучать в эфир. Контролирую сигнал по рации.

EasyTransferVirtualWire ET;
struct SEND_DATA_STRUCTURE{
   byte ID;           // Идентификатор устройства
  int Temperature;  // Температура
  int Temperature_a;  // Температура
  int  Temperature_b;  // Температура
  double  Pressure;     // Давление
  float Humidity_a;     // Влажность
  float Humidity_b;     // Влажность
  float dewPoint;     // Точка росы/инея

И все данные идут с 0 после запятой, кроме dewPoint.

it4_transmiter_V2_DHT_X2.zip

Share this post


Link to post
Share on other sites
21.03.2016 в 21:32, Kitsum сказал:

Не вижу никаких препятствий для реализации записи в любую базу данных, ....

Здравствуйте, можно ли с этого места по подробней. Никак не могу организовать добавление записей в базу данных на сервер в интернете. Все получается в локальной сети, а вот на хостинге не получается. Все сайты, подобные "народному мониторингу ", используют специальный ключ, что бы принимать данные с определенной платы ардуино. Как это можно реализовать на своем сайте в интернете?

Edited by KIR24
редакция

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Similar Content

    • By Kitsum
      Всем привет, в этой статье поговорим об уже надоевшей всем теме - "Метеостанция". Каждый пытается сделать что-то свое, вот и я не стал исключением и попытался материализовать свои эротические фантазии на контроллере ESP8266. Тема задумывалась уже давно как некое обновление для предыдущего проекта этой тематики, но из-за своей неспешности переросла в нечто самостоятельное.


      При всей привлекательности микроконтроллера ESP8266 с его большим объемом памяти, железной поддержкой Wi-Fi и массой разных плюшек, он не лишен недостатков. Самый основной - ограниченное количество поддерживаемых одновременных TCP соединений равное 5. Если превысить этот лимит, то контроллер потеряет связь с окружающим миром, при этом watchdog будет думать, что все в порядке, а следовательно, даже не попытается нам помочь. Будем стараться это помнить!
      Стоит начать с концепции
      Доступ к данным метеостанции нужно получать без установки внешних приложений и под любой операционной системой. Для этих целей подойдет практически любой современный браузер. Меня всем устраивает Chrome. Раз уж за основу взят HTTP протокол, стоит озаботиться экономией трафика и ограничением числа TCP соединений. Хорошим тоном будет передача всего необходимого для формирования страницы контента только при первом обращении, а все последующие операции, такие как отображение показаний с датчиков или настройку контроллера, производить через API. В этом нам поможет JQuery. А вот, чтобы ослабить болевые ощущения от передачи файлов с SPI Flash в браузер, стоит предусмотреть систему кэширования, например, Etag. Это позволит отдавать тяжелый контент единожды, а при последующих загрузках страницы просто подтверждать его актуальность на уровне Web сервера микроконтроллера и кэш браузера вступит в игру, неимоверно уменьшив время загрузки страницы! "Вы были правы в одном, Мастер: переговоры были недолгими." © Звездные войны. Эпизод 1 Из-за того, что метеостанция с датчиками и контроллером должна располагаться на улице, жизненно необходимо предусмотреть возможность обновлять прошивку ESP через Web интерфейс. Аналогичным образом должны обновляться файлы Web сервера расположенные на SPI Flash. Этот и предыдущий пункт вкупе позволят обновлять функционал микроконтроллера из домашней сети или из интернета, если конечно в этом возникнет острая необходимость. Чтобы никто посторонний не могу вмешаться в работу устройства или изменить файлы Web сервера, последний должен хотя бы как-то себя защищать. Пускать в панель управления только после авторизации, блокировать доступ при попытках брутфорса пароля. В конце концов, контроллер обязан самостоятельно генерировать ключи (salt) для авторизации, дабы сделать алгоритм непредсказуемым и исключить потенциальный взлом, в случае если злодей завладеет исходниками проекта. Понятно, что кому она там нужна, эта метеостанция, если её не завязывать с умным домом, если только из-за спортивного интереса, но как говориться “Береженого Бог бережет”. Датчики стоит расположить по уму - в метеобудке, а вот контроллер в сухом и закрытом боксе. Объединить их между собой, как мне кажется, удобнее по I2C шине - минимум проводов, максимум удобства. Практически на всех вариантах плат ESP-xx имеется штатный светодиод, можно воспользоваться им как для индикации режимов и состояния микроконтроллера, так и для вывода какой-либо промежуточной информации. Что касаемо режимов работы ESP8266, как ни странно, но он должен находить домашнюю Wi-Fi сеть и подключаться к ней. Если вдруг звезды не были к нам благосклонны, и домашняя беспроводная сеть приказала долго жить, контроллер обязан перейти в режим точки доступа (AP) дабы к нему можно было подключиться с какого-либо устройства и перенастроить его на другую сеть. А вот пока последнее не произошло, ESP должен периодически сканировать эфир в поисках долгожданной домашней точки доступа и, если боги были к нам милосердны, и домашняя сеть появилась в эфире, незамедлительно переключиться в режим клиента (STA) и в пылу страсти воссоединиться с ней. Ну и естественно, как же без отправки данных на внешние ресурсы, сейчас без этого не обходится ни одна уважающая себя кофеварка, не говоря уже о метеостанции. Думаю, что основным блюдом станет протокол MQTT, это уже облегчает возможность интеграции с умным домом, стулом или той же кофеваркой. Ну а на закуску добавим поддержку "ThingSpeak" и "Народного мониторинга". При желании можно нарастить функционал, благо памяти у микроконтроллера еще много. Как я себе это представляю
      Учтите, что на видео, данные с датчиков, эмитируются самим микроконтроллером, это нужно для наглядности. В жизни метеорологическая обстановка намного спокойнее слава Богу.
      Перейдем к физической сборки устройства
      Как по мне, так самый оптимальный вариант, это воспользоваться отладочной платой NodeMCU V3 и базой для неё. Таким образом, мы получим отличный комплект с разведенной на его борту всей необходимой обвязкой и возможностью питать устройство от 5 до 24 Вольт.

      Отладочная плата на базе, и смотрится хорошо, и удобства хоть отбавляй.

      Заливаем прошивку, образ SPI Flash и подключаем четырьмя проводами датчики. Справится даже ребенок.
      Ссылки:
      Базовая плата для NodeMCU V3 с преобразователем питания 5-24V в 5V Отладочная плата ESP8266 от NodeMCU Естественно никто не запрещает Вам развести свою плату. Если Вы это сделаете, скиньте нам свое творение, возможно мы перейдем на него. В идеале, все должно размещаться в метеобудке.
      Датчики взятые за основу
      Теперь настал момент озаботиться, где описанные выше ребята будут жить. В прошлый раз мы использовали для этих целей, найденную в подножном корме, электрическую распределительную коробку. Кроме дешевизны в этом решении нет ничего положительного.
      В этот раз мы воспользуемся более серьезным вариантом – "Метеорологическая будка Стивенсона". Она способна защитить датчики от прямых воздействий окружающей среды, но при этом имеет открытую структуру со стенками в виде жалюзи. Удобно, красиво и самое главное – правильно!
      Будка печатается на 3D принтере по эскизам опубликованным на Thingiverse неким kowomike, спасибо добрый человек! Архив с эскизами можно будет скачать в конце поста.

      Фото готовой будки

      Шпилька М8 крепится через зажимной хомут к мачте уличной антенны.
      Примерка. Шпилька практически не укорачивалась, чтобы не закрывать будку параболической Wi-Fi антенной.
      Хотя в моем случае все это сделано не правильно т.к это солнечная сторона дома. Доступа на теневую сторону дома у меня нет, поэтому приходиться довольствоваться тем, что имеем. По прошлой метеостанции мне говорили "на солнечной стороне все эти измерения - сферический конь в вакууме, слепи %описание-многА-букАв% и закрепи на теневой стороне дома".
      Я пока живу в панельном многоквартирном доме, как и не малая часть нашей страны. Доступ к теневой стороне дома (а для меня, по факту, это окна в подъезде) - прямой вызов всем гопникам района трущимся рядом, любопытным соседям с бегающими глазками и всей элите человечества скрашивающей фоном мою унылую и слишком простую, по их мнению, жизнь. Думаю, что мысль я донес.

      Датчики располагаются на разных уровнях. В основании находится датчик освещенности BH1750 и смотрит ровно вниз. Мне кажется, так он будет меньше пачкаться и покрываться пылью и при этом смотреть наружу сквозь минимальное количество препятствий для солнечного света. Вообще размещение этого датчика, это целая головная боль. Как не крути, все будет не то. Оставил так, ведь по сути важны не сами показания, а тенденция изменения. Хотя кого я пытаюсь обмануть, точность важна всегда! Предлагайте свои варианты.
      Намного проще обстоят дела с датчиком атмосферного давления BMP180 и влажности SI7021, кстати, с последнего мы также будем забирать данные о температуре. Их размещаем в оставшемся свободном пространстве будки, благо его там с избытком, но не в конусе т.к пространство в нем менее проветриваемое.

      Все хозяйство подключается между собой следующим образом
      NodeMCU | ESP 07/12 | Датчики ----------------------------- D2 | GPIO 4 | SDA D1 | GPIO 5 | SCL 3.3V | 3.3V | 3.3V GND | GND | GND ВАЖНО: при финальном монтаже устройства на его место службы, обязательно установите перемычку между пинами GPIO 0 (D3) и питанием 3.3 Вольта. Причины её установки описаны в закрепленном сообщении с описание обновления от 12.08.2017.
      Сам микроконтроллер будет спрятан в уже знаменитую распределительную коробку, закрепленную на шпильке, чуть ниже будки Стивенсона. У меня все находится на стадии неторопливой сборки с попутным поиском более удачных идей.
      Плата расширения, на которой будет установлена плата NodeMCU, закреплена через ножки для крепления компьютерных материнских плат в корпусах.

      Разъемы для подключения внешних датчиков и питающей линии установил на местах где была пара штатных заглушек. Закрепил все через переходную пластину, выпиленную из куска фольгированного текстолита. Естественно, предварительно пластина была протравлена, а вся медь искоренена, ибо в этом случае она нам не друг.
      Также была предусмотрена проставка из полиэтиленового поролона (используется в качестве упаковочного материала при транспортировке грузов) между текстолитом и корпусом, общей толщиной 5мм, а после затяжки крепежных винтов, его толщина не превышает 1мм. Это было сделано из-за опыта эксплуатации предыдущего (временного) бокса для этой метеостанции. Без проставки влага быстро найдет путь вовнутрь, и срок службы устройства снизится.
      Производим примерку.
      При окончательном монтаже обязательно необходимо удалить все не плотно прилегающие части полиэтиленового поролона, то есть те части, которые располагаются снаружи и не сдавлены крепежной текстолитовой пластиной. Это необходимо сделать для препятствования накоплению влаги в доступных для неё полостях. Также пришлось увеличить число крепежных болтов для более надежного прилегания текстолита, в противном случае он может выгибаться.
      Все самое сложное позади, остается только вывести на один разъем шину i2c с питание 3.3 Вольта, а на другой подвести пины питания платы расширения. Но т.к у меня валялся "хвост" отрезанный когда-то от не рабочего блока питания маршрутизатора, и я не побрезговал им воспользоваться по прямому назначению.

      Далее останется все подравнять, проверить качество монтажа, возможность замены платы NodeMCU, если это будет необходимо при эксплуатации и самое главное, дважды проверить, что и куда припаяно. Мои кривые руки и невнимательность уже наказывали меня, а т.к ждать новые запчасти долго, повторять не хочется.

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


      Требования (!!!Читать обязательно!!!)
      Arduino IDE с поддержкой контроллера ESP8266, версия 2.6.2 (на версиях выше работоспособность не проверялась) Установленный модуль в Arduino IDE для загрузки файлов во Flash память микроконтроллера. Как установить описано тут. Для работы модуля загрузки файлов во Flash может понадобится последняя версия Python https://www.python.org/downloads/ Любой модуль на базе ESP8266 c Flash 4MB (3MB выделяем под SPIFFS) В параметрах выставляем lwIP версии 2 и максимальную производительность (lwIP v2 Higher Bandwidth) Сам архив с последней версией проекта. Скачать можно в конце статьи или по этой ссылке.   
      Обязательные библиотеки (!!!Читать обязательно!!!)
      ArduinoJson (v5.13.5) PubSubClient Ссылки на библиотеки сенсоров указаны в комментариях к коду. Сами библиотеки, как и обслуживаемые ими сенсоры, не являются обязательными. Вы вольны использовать любые датчики, как физические, так и программные.
      Порядок установки (!!!Читать обязательно!!!)
      Изучите файлы проекта с примерами использования тех или иных сенсоров. Все файлы с примерами начинаются с префикса users_, это users_auto.h, users_bme280_x2.h и т.д. Загрузите необходимые Вам библиотеки или используйте эти файлы как пример для добавления иных датчиков. Выставите необходимые настройки для контроллера в среде разработки Arduino IDE. Пример настроек указан на скриншоте выше. Обязательно убедитесь, что выбрано правильное распределение места для внутренней файловой системы, это значит, что 3MB должно быть выделено под файловую систему. Также проверяем, чтобы использовался lwIP v2 в режиме максимальной производительности (lwIP v2 Higher Bandwidth). Произведите загрузку программы с помощью среды разработки (Ctrl + U). Произведите загрузку содержимого каталога data в файловую систему. Меню/Инструменты/ESP8266 Sketch Data Upload Перед тем как устанавливать метеостанцию на постоянное место жительства, подтянуть GPIO-0 (пин D3 на плате NodeMCU) к питанию 3.3V. Во время данной процедуры, питание на контроллере должно отсутствовать. Первый запуск (!!!Читать обязательно!!!)
      Помните, что вся конфигурация микроконтроллера производится исключительно через web интерфейс. Никаких изменений значений тех или иных параметров в коде не требуется, а подобную практику будем считать плохим тоном.
      И так, после запуска микроконтроллера он сразу перейдет в аварийный режим и поднимет собственную точку доступа с именем WeatherStation. Это нормальное поведение т.к подразумевается использование метеостанции в домашней беспроводной сети, ну а раз о ней пока ничего не известно, то и подключаться не к чему.
      Подключитесь к данной сети с любого удобного устройства и перейдите в панель управления (для этого имеется соответствующая иконка, запутаться невозможно), контроллер будет доступен по адресу http://espws.local или http://192.168.4.1 При попытке входа в панель управления будет запрошено имя пользователя и пароль, по умолчанию admin/admin. После входа в панель управления перейдите в раздел "Основные настройки WiFi" и укажите имя и пароль Вашей домашней сети, а также, при необходимости, укажите пароль для подключения к точке доступа поднимаемой контроллером в аварийном режиме. Если все сделано правильно, то контроллер подключится к домашней сети в течении 5-и минут.
      Если Ваша домашняя сеть скрыта, то после первоначальной настройки необходимо перезагрузить контроллер. Это необходимо из-за частичной поддержки работы со скрытыми сетями. После перезагрузки контроллер увидит Вашу сеть и запомнит её MAC адрес. Помните об этом если захотите сменить домашний маршрутизатор.
      Хотите помочь проекту или спонсировать новый?
      Yandex.Money PayPal.me Файлы
       
    • By Kitsum
      Хотите помочь проекту или спонсировать новый?
      Yandex.Money PayPal.me Тема проекта
      Arduino IDE + Project + Libraries + tools: https://yadi.sk/d/jseefFB50NMhAg
    • By vavandemidov
      Метеостанция для измерения параметров в двух точках одинаковыми датчиками, например, дома и на улице. Собственно, пока что просто пример, как подключаются одинаковые датчики на одну шину I2C.
      Детали: Nodemcu v3, два датчика BME280, подключенные на один I2C.
      Для первого датчика с адресом 0х76 использовалась библиотека https://github.com/Seeed-Studio/Grove_BME280  и эта же библиотека отредактирована для второго датчика с адресом 0х77 (в прикрепленном файле). Как поменять адрес второго датчика например тут - http://arduino.ru/forum/apparatnye-voprosy/pomenyat-adres-i2c-na-bme280  Установить обе библиотеки.
      Метеостанция умеет выводить данные в UART. Также создает WEB-сервер, по WIFI соединяется с домашней сетью, данные с метеостанции можно посмотреть в браузере, перейдя по адресу, который дал роутер. В скетч вставить имя/пароль своей сети, а также указать к каким пинам подключены датчики. В моем случае это D1 и D2.
      В дальнейшем предполагается добавить в метеостанцию возможность регулировать температуру и влажность по домашнему датчику, включая обогреватель/кондиционер и ультразвуковой увлажнитель/вентилятор для проветривания. И возможно добавить датчик освещения и включать на ночь уличный свет/ прикрутить датчик влажности почвы и сделать автоматический полив/ добавить управление по WEB-интерфейсу уличным освещением и сливным бачком в тубзике
      Ну и скетч:
      #include "Seeed_BME280.h" #include "Seeed_BME280_77.h" #include <Wire.h> #include <ESP8266WiFi.h> BME280 bme280; BME280_77 bme280_77; #define pin_sda 5 // default sda pin //вставить свое значение #define pin_scl 4 // default scl pin //вставить свое значение const char* ssid = "ssid"; //вставить свое значение const char* password = "password"; //вставить свое значение WiFiServer server(80); void setup() { Serial.begin(115200); if(!bme280.init()){ Serial.println("Device error!"); } if(!bme280_77.init()){ Serial.println("Device error!"); } delay(10); // Connect to WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); server.begin(); Serial.println("Server started"); Serial.println(WiFi.localIP()); } void loop() { float t = (bme280.getTemperature()); float p = (bme280.getPressure()*0.00750063); float h = (bme280.getHumidity()); float t_77 = (bme280_77.getTemperature()); float p_77 = (bme280_77.getPressure()*0.00750063); float h_77 = (bme280_77.getHumidity()); //get and print temperatures Serial.print("Temp: "); Serial.print(t); Serial.println(" C");//The unit for Celsius because original arduino don't support speical symbols //get and print temperatures_77 Serial.print("Temp_77: "); Serial.print(t_77); Serial.println(" C");//The unit for Celsius because original arduino don't support speical symbols //get and print atmospheric pressure data Serial.print("Pressure: "); Serial.print(p); Serial.println(" mm.Hg"); //get and print atmospheric pressure data_77 Serial.print("Pressure_77: "); Serial.print(p_77); Serial.println(" mm.Hg"); //get and print humidity data Serial.print("Humidity: "); Serial.print(h); Serial.println(" %"); //get and print humidity data_77 Serial.print("Humidity_77: "); Serial.print(h_77); Serial.println(" %"); delay(1000); WiFiClient client = server.available(); if (!client) { return; } while(!client.available()){ delay(1); } String req = client.readStringUntil('\r'); client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println(""); client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("<head></head><body>"); client.print("Temperatures_in: "); client.print(t); client.print(" &#8451"); client.print("<br>"); client.print("Pressure_in: "); client.print(p); client.print(" mm.Hg."); client.print("<br>"); client.print("Humidity_in: "); client.print(h); client.print(" %"); client.print("<br><br>"); client.print("Temperatures_out: "); client.print(t_77); client.print(" &#8451"); client.print("<br>"); client.print("Pressure_out: "); client.print(p_77); client.print(" mm.Hg."); client.print("<br>"); client.print("Humidity_out: "); client.print(h_77); client.print(" %"); client.println("</body></html>"); delay(1); client.stop(); }  
      Grove_BME280_77-master.zip
    • By EndWar
      Привет. Это не бахвальство, просто слышал, заходила речь о коммуникации трёх разных объектов. Вот решил показать, что у меня с четырьмя "объектами" на основе этой метеостанции, проекта https://wifi-iot.com/, немного https://thingspeak.com/channels/42908 и https://www.wunderground.com/.
      Если кому надо, чем смогу помогу...
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...