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

Отправляем температуру, влажность и давление на Народный мониторинг
Наконец-то у меня появилось свободное время. Решил заняться некоторыми давно заброшенными проектами. В частности, устройством для отправки данных о метеоситуации за окном на «Народный мониторинг» при помощи Arduino.


Информация
Доступна обновлённая версия скетча по ссылке: Метеостанция 2.1

Первая версия устройства описывалась в статье Подключение Arduino к отечественному проекту Народного мониторинга. Теперь научим его отправлять не только температуру, но и атмосферное давление и влажность. Для этого нам понадобятся следующие компоненты:
  • Микроконтроллер Arduino или Freeduino (с ATmega328);
  • Ethernet-shield Wiznet w5100;
  • Цифровой термодатчик DS18B20;
  • Датчик атмосферного давления BMP085;
  • Датчик влажности DHT22;
  • Резистор 4.7 кОм;
  • Резистор 5 кОм.

Повторю некоторые фотографии из предыдущей статьи. Микроконтроллер и Ethernet-shield:
Freeduino Through-Hole в собранном виде
Ethernet Shield
DS18B20:
DS18B20
DHT22:
dsc_6697
BMP085:
dsc_6694_
Соединяем всё по следующей схеме:
webtemp_full_bb

Резистор R1 на схеме — 4.7 кОм, служит для подтяжки линии данных для термодатчика DS18B20. Резистор R2 — 5 кОм, подтягивает линию данных DHT22. Термодатчик и датчик влажности размещаются на улице. Я для этого использовал четырёхжильный телефонный кабель — на расстоянии 6 метров от микроконтроллера работает замечательно. Датчик давления размещается в доме. За счёт негерметичности окон/дверей атмосферное давление снаружи и внутри будет практически одинаковым.
Возможно кто-то обратит внимание и задаст вопрос: почему DS18B20 подключается по трёхпроводной схеме, а в прошлой статье было всего два? Дело в том, что на то время я использовал паразитное питание термодатчика. Однако, на больших расстояниях от микроконтроллера это может давать сбои. Поэтому рекомендую принудительно подавать питание на датчик.
Если у вас нет сенсоров DHT22 или BMP085, то просто оставьте соответствующие контакты Arduino неподключенными. В коде необходимо будет подправить всего лишь одну-две строки.
Ну и вот собственно код скетча:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
// Скетч для Arduino для отправки метеоданных на Народный мониторинг.
// Версия 2.0 (19.07.2014)
//
// Автор: Гладышев Дмитрий (2012-2014)
// http://student-proger.ru/2014/07/meteostanciya-2-0/
 
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <Wire.h>
#include <BMP085.h>
#include <DHT.h>
 
bool Debug = false; //режим отладки
 
//********************************************************************************************
byte mac[] = { 0xDE, 0xAD, 0xBE, 0x00, 0x00, 0x00 }; //MAC-адрес Arduino
#define BMP085_EXIST 1          // наличие датчика атмосферного давления
#define DHT_EXIST 1             // наличие датчика влажности
#define DS18B20_PIN 2           // пин подключения термодатчика DS18B20
#define DHTPIN 6                // пин подключения датчика влажности DHT22
#define DHTTYPE DHT22           // тип датчика влажности DHT22/DHT11
#define postingInterval 600000  // интервал между отправками данных в миллисекундах (10 минут)
//********************************************************************************************
 
char server[] = "narodmon.ru";
char macbuf[13];
 
EthernetClient client;
OneWire ds(DS18B20_PIN);
 
#if BMP085_EXIST == 1
  BMP085 dps = BMP085();
#endif
 
#if DHT_EXIST == 1
  DHT dht(DHTPIN, DHTTYPE);
#endif
 
unsigned long lastConnectionTime = 0;           // время последней передачи данных
boolean lastConnected = false;                  // состояние подключения
int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
char replyBuffer[160];                          // буфер для отправки
int CountSensors;                               // количество найденных датчиков температуры
long Pressure = 0;
float Humidity = 0;
 
void setup() {
 
  if (Debug)
  {
    Serial.begin(9600);
  }
 
  // секунда для инициализации Ethernet
  delay(1000);
  // Пробуем подключиться по Ethernet
  if (Ethernet.begin(mac) == 0) 
  {
    if (Debug)
    {
      Serial.println("Failed to configure Ethernet using DHCP");
    }
    // ничего не делаем
    for(;;);
  }
 
 //Узнаём количество термодатчиков
  CountSensors = DsCount();
  if (Debug)
  {
    Serial.print("Found ");
    Serial.print(CountSensors);
    Serial.println(" sensors."); 
  }
 
  #if BMP085_EXIST == 1
    Wire.begin();
    dps.init();
  #endif
  #if DHT_EXIST == 1
    dht.begin();
  #endif    
 
  lastConnectionTime = millis()-postingInterval+15000; //первое соединение через 15 секунд после запуска
}
 
void loop()
{
  //Если вдруг нам случайно приходят откуда-то какие-то данные,
  //то просто читаем их и игнорируем, чтобы очистить буфер
  if (client.available()) 
  {
    client.read();
  }
 
  if (!client.connected() && lastConnected) 
  {
    if (Debug)
    {
      Serial.println();
      Serial.println("disconnecting.");
    }
    client.stop();
  }
 
  //если не подключены и прошло определённое время, то делаем замер,
  //переподключаемся и отправляем данные
  if (!client.connected() && (millis() - lastConnectionTime > postingInterval)) 
  {
 
    //формирование HTTP-запроса
    memset(replyBuffer, 0, sizeof(replyBuffer));
    strcpy(replyBuffer,"ID=");
 
    memset(macbuf, 0, sizeof(macbuf));
    //Конвертируем MAC-адрес
    for (int k=0; k<6; k++)
    {
      int b1=mac[k]/16;
      int b2=mac[k]%16;
      char c1[2],c2[2];
 
      if (b1>9) c1[0]=(char)(b1-10)+'A';
      else c1[0] = (char)(b1) + '0';
      if (b2>9) c2[0]=(char)(b2-10)+'A';
      else c2[0] = (char)(b2) + '0';
 
      c1[1]='\0';
      c2[1]='\0';
 
      strcat(macbuf,c1);
      strcat(macbuf,c2);
    }
    strcat(replyBuffer, macbuf);
 
    //Сбрасываем поиск датчиков (кол-во нам уже известно)
    ds.reset_search();
    //Теперь в цикле опрашиваем все датчики сразу
 
    for (int j=0; j<CountSensors; j++)
    {
 
      byte i;
      byte present = 0;
      byte data[12];
      byte addr[8];
 
      if ( !ds.search(addr)) 
      {
        ds.reset_search();
        return;
      }
 
      ds.reset();
      ds.select(addr);
      ds.write(0x44,1);
 
      delay(1000);
 
      present = ds.reset();
      ds.select(addr);    
      ds.write(0xBE);
 
      for ( i = 0; i < 9; i++) // we need 9 bytes
      {
        data[i] = ds.read();
      }
 
      LowByte = data[0];
      HighByte = data[1];
      TReading = (HighByte << 8) + LowByte;
      SignBit = TReading & 0x8000;  // test most sig bit
      if (SignBit) // negative
      {
        TReading = (TReading ^ 0xffff) + 1; // 2's comp
      }
      Tc_100 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25
 
      Whole = Tc_100 / 100;  // separate off the whole and fractional portions
      Fract = Tc_100 % 100;
 
      char temp[3];
 
      itoa(Whole,temp);
      strcat(replyBuffer,"&");
 
      //конвертируем адрес термодатчика
      for (int k=7; k>=0; k--)
      {
        int b1=addr[k]/16;
        int b2=addr[k]%16;
        char c1[2],c2[2];
 
        if (b1>9) c1[0]=(char)(b1-10)+'A';
        else c1[0] = (char)(b1) + '0';
        if (b2>9) c2[0]=(char)(b2-10)+'A';
        else c2[0] = (char)(b2) + '0';
 
        c1[1]='\0';
        c2[1]='\0';
 
        strcat(replyBuffer, c1);
        strcat(replyBuffer, c2);
      }
      strcat(replyBuffer,"=");
      if (SignBit) //если температура отрицательная, добавляем знак минуса
      {
        strcat(replyBuffer,"-");
      }
      strcat(replyBuffer,temp);
      strcat(replyBuffer,".");
      if (Fract<10)
      {
        strcat(replyBuffer,"0");
      }
      itoa(Fract,temp);
      strcat(replyBuffer,temp);
    }
 
    char temp[8];
    long p_100, h_100;
 
    #if BMP085_EXIST == 1
      strcat(replyBuffer, "&");
      strcat(replyBuffer, macbuf);
      strcat(replyBuffer, "01=");
      dps.getPressure(&Pressure);
      p_100 = Pressure/1.333;
      Whole = p_100 / 100;
      Fract = p_100 % 100;
      itoa(Whole, temp);
      strcat(replyBuffer, temp);
      strcat(replyBuffer, ".");
      if (Fract<10)
      {
        strcat(replyBuffer,"0");
      }
      itoa(Fract, temp);
      strcat(replyBuffer, temp);
    #endif
 
    #if DHT_EXIST == 1
      Humidity = dht.readHumidity();
      strcat(replyBuffer, "&");
      strcat(replyBuffer, macbuf);
      strcat(replyBuffer, "02=");
      h_100 = Humidity*100;
      Whole = h_100 / 100;
      Fract = h_100 % 100;
      itoa(Whole, temp);
      strcat(replyBuffer, temp);
      strcat(replyBuffer, ".");
      if (Fract<10)
      {
        strcat(replyBuffer,"0");
      }
      itoa(Fract, temp);
      strcat(replyBuffer, temp);
    #endif
 
    strcat(replyBuffer,'\0');
 
    if (Debug)
    {
      Serial.println(replyBuffer);
      Serial.print("Content-Length: ");
      Serial.println(len(replyBuffer));
    }
 
    //отправляем запрос
    httpRequest();
 
  }
  //храним последнее состояние подключения
  lastConnected = client.connected();
}
 
void httpRequest() 
{
  if (client.connect(server, 80))
  {
    if (Debug)
    {
      Serial.println("connecting...");
    }
    // отправляем HTTP POST запрос:
    client.println("POST http://narodmon.ru/post.php HTTP/1.0");
    client.println("Host: narodmon.ru");
    //client.println("User-Agent: arduino-ethernet");
    //client.println("Connection: close");
    client.println("Content-Type: application/x-www-form-urlencoded");
    client.print("Content-Length: ");
    client.println(len(replyBuffer));
    client.println();
    client.println(replyBuffer);
    client.println();
 
    lastConnectionTime = millis();
  } 
  else
  {
    if (Debug)
    {
      Serial.println("connection failed");
      Serial.println("disconnecting.");
    }
    client.stop();
  }
}
 
//Количество термодатчиков на шине
int DsCount()
{
  int count=0;
  bool thatsall = false;
  byte addr[8];
  do
  {
    if ( !ds.search(addr))
    {
      ds.reset_search();
      thatsall = true;
    }
    count++;
  } while(!thatsall);
  return (count-1);
}
 
int len(char *buf)
{
  int i=0; 
  do
  {
    i++;
  } while (buf[i]!='\0');
  return i;
}
 
void reverse(char s[])
{
  int i, j;
  char c;
 
  for (i = 0, j = strlen(s)-1; i<j; i++, j--) 
  {
    c = s[i];
    s[i] = s[j];
    s[j] = c;
  }
}
 
void itoa(int n, char s[])
{
  int i, sign;
 
  if ((sign = n) < 0)       /* записываем знак */
    n = -n;                 /* делаем n положительным числом */
  i = 0;
  do {                      /* генерируем цифры в обратном порядке */
    s[i++] = n % 10 + '0';  /* берем следующую цифру */
  } while ((n /= 10) > 0);  /* удаляем */
  if (sign < 0)
    s[i++] = '-';
  s[i] = '\0';
  reverse(s);
}
Обратите внимание на строки 17-23:

  • mac — MAC-адрес Arduino. Это ваш уникальный идентификатор на сайте народного мониторинга. Поэтому для защиты от совпадений рекомендую использовать MAC-адрес вашего компьютера/роутера/телефона с изменённым последним байтом (чтобы не было коллизии внутри локальной сети).
  • BMP085_EXIST — наличие датчика атмосферного давления. Поставьте 0, если у вас его нет.
  • DHT_EXIST — наличие датчика влажности. Поставьте 0, если у вас его нет.
  • DS18B20_PIN — пин подключения термодатчика DS18B20.
  • DHTPIN — пин подключения датчика влажности DHT22.
  • DHTTYPE — тип датчика влажности: DHT22 или DHT11
  • postingInterval — интервал передачи показаний. По-умолчанию 600000 мс (10 минут).

Если при компиляции в Arduino 1.0.5 вы получаете следующие ошибки:

ArduinoRobot.cpp : : In constructor 'RobotControl::RobotControl()':
ArduinoRobot.cpp : 'LCD_CS' was not declared in this scope
ArduinoRobot.cpp : 'DC_LCD' was not declared in this scope
ArduinoRobot.cpp : 'RST_LCD' was not declared in this scope
ArduinoRobot.cpp : : In member function 'void RobotControl::begin()':
ArduinoRobot.cpp : 'MUXA' was not declared in this scope
ArduinoRobot.cpp : 'MUXB' was not declared in this scope
ArduinoRobot.cpp : 'MUXC' was not declared in this scope
ArduinoRobot.cpp : 'MUXD' was not declared in this scope
ArduinoRobot.cpp : 'MUX_IN' was not declared in this scope
ArduinoRobot.cpp : 'BUZZ' was not declared in this scope
ArduinoRobot.cpp : 'Serial1' was not declared in this scope

то удалите папку arduino-1.0.5-r2\libraries\Robot_Control.

В комментариях жду вопросов и предложений. Багрепорты также приветствуются.

Файлы
Скетч v2.0 (9.31 KB)

Библиотеки:
OneWire (13.84 KB)
BMP085 (59.14 KB)
DHT (3.37 KB)

Работа проверялась с Arduino IDE v1.0.5-r2.
Библиотеки являются собственностью их авторов!

Предупреждение!
Автор не несёт ответственности за возможную порчу оборудования. Всё, что вы делаете — вы делаете на свой страх и риск!

Похожие записи:

125 Комментарии “Метеостанция 2.0

  1. Спасибо, все работает. А почему не используете датчик температуры встроенный в бмп085? Датчик дс18 на улицу, а давления в доме, плюс показывает температуру внутри…

          1. Добрый день!
            Я тоже заинтересован вашим проектом мониторинга, но в программировании пока очень слаб. Меня интересует возможность использования датчика влажности и давления с своими встроенными термодатчиками без использования DS18B20.
            Надеюсь у Вас будет свободное время)))

  2. По-моему идея размещать датчик влажности на улице – плохая. Он не герметичен и подвержен воздействию влаги. Внутри корпуса находится керамическая пластинка с напылением проводника и микросхема с обвязкой.

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

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

        1. Ну пока работает. В крайнем случае, заменить вышедший из строя датчик — не проблема. Мне больше интересно, как он зимой себя поведёт. DS18B20 спокойно морозы переживает.

  3. доброго времени суток
    у меня вышла вот такая ошибочка
    сам начинающий пока не пойму в чем дело
    версия 1.0.5 R2
    Meteostation_2_0:2: error: stray ‘\’ in program
    In file included from Meteostation_2_0.ino:8:
    E:\PAPER\Arduino\Arduino-progi\arduino-1.0.5-r2\libraries\SPI/SPI.h:36: error: expected constructor, destructor, or type conversion before ‘class’
    E:\PAPER\Arduino\Arduino-progi\arduino-1.0.5-r2\libraries\SPI/SPI.h:53: error: ‘SPIClass’ does not name a type
    E:\PAPER\Arduino\Arduino-progi\arduino-1.0.5-r2\libraries\SPI/SPI.h:55: error: ‘SPIClass’ has not been declared
    E:\PAPER\Arduino\Arduino-progi\arduino-1.0.5-r2\libraries\SPI/SPI.h:62: error: ‘SPIClass’ has not been declared
    E:\PAPER\Arduino\Arduino-progi\arduino-1.0.5-r2\libraries\SPI/SPI.h:66: error: ‘SPIClass’ has not been declared

      1. .// Скетч для Arduino для отправки метеоданных на Народный мониторинг.

        в самом начале строки стоит точка
        как только ее убрал компиляция прошла

        Спасибки за Ваши труды

        1. Следующая проблемка:
          win7 максимальная 64 бита
          вот такая ошибка
          (порт в настройках windows com3 9600)
          далее описание ошибки

          Размер скетча в двоичном коде: 23 712 байт (из 32 256 байт максимум)
          E:\PAPER\Arduino\Arduino-progi\arduino-1.0.5-r2\hardware/tools/avr/bin/avrdude -CE:\PAPER\Arduino\Arduino-progi\arduino-1.0.5-r2\hardware/tools/avr/etc/avrdude.conf -v -v -v -v -patmega328p -carduino -P\\.\COM3 -b115200 -D -Uflash:w:C:\Users\Roman\AppData\Local\Temp\build8920096413369850679.tmp\Meteostation_2_0.cpp.hex:i

          avrdude: Version 5.11, compiled on Sep 2 2011 at 19:38:36
          Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
          Copyright (c) 2007-2009 Joerg Wunsch

          System wide configuration file is «E:\PAPER\Arduino\Arduino-progi\arduino-1.0.5-r2\hardware/tools/avr/etc/avrdude.conf»

          Using Port : \\.\COM3
          Using Programmer : arduino
          Overriding Baud Rate : 115200
          avrdude: Send: 0 [30] [20]
          avrdude: Send: 0 [30] [20]
          avrdude: Send: 0 [30] [20]
          avrdude: Recv: 0 [30]
          avrdude: stk500_getsync(): not in sync: resp=0x30

          avrdude done. Thank you.

          1. Проверьте правильность указания платы в меню Arduino IDE. Проверьте надёжность подключения Arduino к компьютеру. Эта ошибка говорит о том, что не удаётся нормально установить связь с Arduino. Попробуйте нажать на кнопку прошивки и одновременно кратковременно нажать и отпустить сброс на самой плате. Ещё может помочь использование более короткого USB-кабеля, либо подключение внешнего питания к плате.

  4. правда Ваша
    замена провода привела к успеху

    вот теперь осталось увидеть датчики на сайте
    DS18B20 сайт видит
    и если на нем выводить влажность или давление то выводиться но что то одно.

    ищу как добавить датчики

    1. К сожалению я не указал в статье модель Ethernet-shield… Вот в чём проблема. У меня Wiznet W5100. Он не совместим с вашим ENC28J60. На днях попробую посмотреть различия в коде для них…

  5. Доброго времени суток. У меня при проверке скетча сразу вылезли вот такие ошибки:

    sketch_aug25a:30: error: ‘OneWire’ does not name a type
    sketch_aug25a:33: error: ‘BMP085’ does not name a type
    sketch_aug25a:37: error: ‘DHT’ does not name a type
    sketch_aug25a.ino: In function ‘void setup()’:
    sketch_aug25a:79: error: ‘dps’ was not declared in this scope
    sketch_aug25a:82: error: ‘dht’ was not declared in this scope
    sketch_aug25a.ino: In function ‘void loop()’:
    sketch_aug25a:138: error: ‘ds’ was not declared in this scope
    sketch_aug25a:228: error: ‘dps’ was not declared in this scope
    sketch_aug25a:244: error: ‘dht’ was not declared in this scope
    sketch_aug25a.ino: In function ‘int DsCount()’:
    sketch_aug25a:320: error: ‘ds’ was not declared in this scope

      1. Скачал версию arduino ide 1.0.5-rc2 скопировал библиотеки в нужную папку. Теперь проверка скетча выдаёт это:
        Meteostation_2_0:1: error: stray ‘\’ in program
        In file included from Meteostation_2_0.ino:7:
        C:\apps\arduino ide\1.0.5-r2\libraries\SPI/SPI.h:36: error: expected constructor, destructor, or type conversion before ‘class’
        C:\apps\arduino ide\1.0.5-r2\libraries\SPI/SPI.h:53: error: ‘SPIClass’ does not name a type
        C:\apps\arduino ide\1.0.5-r2\libraries\SPI/SPI.h:55: error: ‘SPIClass’ has not been declared
        C:\apps\arduino ide\1.0.5-r2\libraries\SPI/SPI.h:62: error: ‘SPIClass’ has not been declared
        C:\apps\arduino ide\1.0.5-r2\libraries\SPI/SPI.h:66: error: ‘SPIClass’ has not been declared.
        Эта ошибка была описана выше. Файл со скетчем не правили? Там в самом начале действительно точка.

  6. Здравствуйте.
    Всего неделю как получил ардуинку. Сижу разбираюсь.
    Сейчас Arduino Nano V3 + BMP085, остальное барахлишко еще в пути.
    Вопрос : «bool Debug = true; //режим отладки» должен включать вывод на консоль ? (монитор порта)

  7. В DHT22 тоже присутствует термометр. Я в своей метеостанции его использую и получаю влажность и температуру за окном

    1. Дя, я знаю. Просто в первой версии DS18B20 был единственным датчиком, поэтому он так и остался для измерения температуры. К тому же, DS18B20 можно подключать несколько штук параллельно.

  8. Спасибо за схемное решение и скетч. Все работает! Правда датчик влажности иногда «отваливается». Пока не понял с чем это связано. Замена на точно такой же не помогла.
    Тем не менее все здорово работает.

    1. Датчик влажности у меня тоже кстати иногда отваливается. Но редко, раза два-три в месяц. Тоже пока не понял с чем это связано. Длина провода от МК до датчика примерно 6 метров, может помехи какие…

  9. Не, это не помехи. У меня на одной станции этот датчик тоже где то на проводах на 6м удален- сбоев нет.
    А на этой удаление 2м.
    Провода в том и другом случае — 4 проводная витая пара. Как раз для минимилизации помех.
    Как отловить это глюк- похоже осцилл надо на линию ставить и следить.

  10. Приветствую, добавил для своих нужд в ваш скетч фоторезистор,
    активируется в строке: #define Light true
    А вот снятие данных с DHT22 при отрицательной температуре вызывает проблемы. Активируется в строке: #define DHT_t true
    При условии что: #define DHT_EXIST 1 , а не: #define DHT_EXIST 0
    Скетч ниже по ссылке + доп инфа.
    https://yadi.sk/d/fqtMhPVjcdHcV
    Кто бы помог разобраться с ошибкой?
    т.н. : SignBit = TReading & 0x8000; // test most sig bit
    у DHT22 вроде как 0x80
    Если автор прокоментит интересующие меня блоки может и сам смогу дотыкатся.
    Если автор найдет что полезное из моих методов научного тыка то на здоровье и жду новую версию v2.1 🙂
    Програмить не умею 🙁

  11. Я присоединяюсь к предыдущему комментатору, если добавить чтение и передачу температуры с dht по вашему принципу, то отрицательные температуры отображаются не верно. Вот так пишет narodmon: Wrong Value: 0.0-25. Причем с положительной температурой проблем нет. Автор, помогите пожалуйста.

  12. Приветствую Maksim, я уже исправил у себя. Может грубо (itoa(Fract * (-2) / 2, temp); ) но работает, прогонял почти неделю из холодильника т.к. у нас еще выше 0.
    По ссылке на Ядиск исправленная версия отрицательной температуры DHT22 + добавлено чтение температуры с датчика давления BMP180 (только положительная температура:)
    https://yadi.sk/d/uguphyCacqZyJ
    Будьте внимательны, отключите в define то что не используете, в коментах указано.

    Просто я тут уже дальше пошел, заказал цифровой light sensor, придет к новому году наверно. (http://www.ebay.com/itm/131158239841?_trksid=p2059210.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT)
    У меня на базе этого кода есть паралельные версии с i2c LCD 20×4
    И уже работаю над внешним датчиком по радиоканалу 433МГц модуляция ASK, сейчас идет прогонка на аккумах из холодильника DHT22. Хотел еще SD карту встроить но надо ли когда narodmon удобен?

  13. Выложил обновлённую версию прошивки. Добавлены чтение температуры с датчиков влажности и атмосферного давления. И теперь при отсутствии подключения к сети контроллер будет ждать её появления (поможет решить проблему «зависания» после отключения электричества, когда роутер ещё не успел запуститься, а ардуинка уже пытается получить IP-адрес).
    http://student-proger.ru/2014/11/meteostanciya-2-1/

  14. Всем доброго время суток 🙂

    Хочу предложить упростить код и уменьшить его на премере «блока влажности» :

    в «setup» определяем строковую переменную :
    String strHmdt;

    а в теле :
    Humidity = dht.readHumidity();
    strcat(replyBuffer, «&»);
    strcat(replyBuffer, macbuf);
    strcat(replyBuffer, «02=»);
    strHmdt = String(float(Humidity));
    strHmdt.toCharArray(temp, sizeof(temp));
    strcat(replyBuffer, temp);
    strcat(replyBuffer,»);

    и тогда нам не нужны — reverse() и itoa()

    1. Здравствуйте! Спасибо за совет, на днях попробую. Первые версии кода писались ещё тогда, когда не было String в Arduino) Поэтому так и тяну все эти преобразования. Попробую со временем избавиться от этих функций.

      1. Я уже проверил, всё работает с сегодняшнего дня 🙂
        http://narodmon.ru/4672#
        Вам спасибо!
        Код Ваш, с моими корректировками 🙂
        Ещё вопрос — а почему вы решили ставить отдельно далласовский градусник? DHT тоже прекрасно по температуре работает (у меня в частности).

        1. DS18B20 — это первый датчик, который я подключил к ардуине ещё при её изучении. Сразу же стал его использовать ещё с первой версии метеостанции, narodmon как раз только начинал развиваться. DHT22 и BMP085 купил только в этом году.

          1. > 99.9% — не очень реальная влажность.
            это же Калининградская область! Всё реально 🙂
            Датчик установлен в вентелируемом корпусе, который предохраняет его от прямого воздействия осадков и солнечных лучей.
            Работает уже года два. Только раньше я не знал про NarodMon.Ru и всё крутилось локально 🙂

  15. Классная штука получилась, спасибо за проект! А возможно ли подключить два датчика DHT? один 11 для дома, а второй 22 для улицы. Если возможно, скажите, что в скетче нужно изменить, и куда подключать, оба параллельно или один на 6 ПИНе, как в схеме, а второй допустим на 5 ПИНе будет. Заранее спасибо!

    1. Скорее всего надо подключать на разные пины и соответственно надо скопировать код для чтения c DHT.
      Объявить два разных объекта:
      DHT dht1(DHTPIN1, DHTTYPE1);
      DHT dht2(DHTPIN2, DHTTYPE2);

  16. Спасибо автору за разработанный проект!
    Еще бы к ардуине прикрутить датчик напряжения в сети, хотя бы через понижающий трансформатор с коррекцией коэффициента понижения.

  17. Исправьте в схеме, Вы используете шилд, уже содержащий 662к (преобразователь 5->3.3V), так что нет никакого смысла подключать датчик к 3.3. Схема с подключением к 3.3 используется для минимального шилда красного цвета, в котором ноги датчика разведены напрямую.

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

  18. Всё работает отлично! Есть вопрос по теме. Как добавить в скетч часть кода, чтобы можно было подключить датчик радиационного фона? Он у меня самодельный и выдает количество зарегистрированных частичек за определенное время. Т.е. сделан из бытового дозиметра «БЕЛЛА». Данные с него я успешно передаю на сервис Ninja Blocks, а вот как быть с Народным мониторингом?

  19. Отличное устройство! Сделал и всё сразу работает. Я еще хочу добавить датчик радиации, но не могу разобраться с частью программы где вычисляется длина буфера передачи. Ведь он увеличится с дополнительным датчиком. У меня получается,что в строке которая отправляется на сервер не вмещаются все символы. Не подскажите, как вычисляется длина буфера? Или учить матчасть лучше? ))))))) Еще раз спасибо за разработку!

    1. Если не вмещается, то попробуйте увеличить длину буфера на необходимую величину. Узнать текущую длину запроса можно функцией len(replyBuffer). Только учтите, что при слишком большой длине может не хватить оперативной памяти, поэтому не называйте датчики очень длинными именами.

      1. Спасибо!
        Собрал пока по вашей схеме. Тренируюсь с датчиками.
        Вариант на 8266 нашел — если кто еще заинтересуется — возможные варианты девайсов легко находятся со страницы народного мониторинга — меню «устройства». Там чего только нет… Каждый может подобать что удобнее…
        Еще раз спасибо за интересный проект.

  20. Доброго времени суток, подскажите начинающему почему может отваливаться соединение с сетью. Некоторое время работало с перерывами, теперь же вообще отказывается соединяться с сервером народного монитора. Смотрю через пункт меню «Список подключенных устройств» в своем роутере Zyxel, w5100 некоторое время там видно, иногода даже успевает отправить данные, после чего отваливается. Лампочки на шилде моргают как будто всё в порядке.
    Пробую включить debug, чтобы понять причину, однако в мониторе посл. порта видна только одна строчка «Found 1 sensors», хотя у меня все 3 датчика есть(DHT,BMP,DS). Менял сетевые и usb провода, запитывал от батарей, пробрасывал через второй роутер, результат одинаков

    Помогите начинающему, не знаю куда копать

    1. Здравствуйте. «Found 1 sensors» — это относится только к датчикам DS18B20. Что касается W5100, то тут однозначного ответа дать нельзя. Попробуйте скетчи примеров запустить по работе с W5100, как они будут работать. Можно попробовать установить статический IP адрес прямо в скетче, хотя не думаю, что в этом дело.

  21. Добрый день NightFlash! Хотел поинтересоваться, Вы дальше проект будете развивать? интересно бы внешний экранчик подключить, а так же напряжение в сети видеть.

      1. Ну хотя бы экран для начала. У меня все данные конечно на народный монитор идут, но хотелось бы что то оперативное иметь — туда же и температура аквариума идет. В принципе как то так на экране —
        1 время записи последних данных (будет понятно не зависла ли система)
        2 датчик влажности
        3 датчик давления
        4 несколько датчиков температуры -не менее четырех или пяти.

        Это возможно? Было бы очень шикарно.

        1. Вадим, у вас запросы превышают текущие возможности данного проекта. Попробуйте перейти на другой проект. Я выше спрашивал про wifi, и NightFlash, посоветовал другой проект. К сожалению, в «другом» применяется другое железо, закрытый код и платная прошивка. Если вас это не пугает — попробуйте. Зато, помимо ваших запросов, вы получите еще много полезного (например — возможность не только измерять температуру в аквариуме, но и поддерживать ее. включая нагреватель).

          1. Ну почему же? Ардуина вполне справится со всем этим. И управлять чем-нибудь можно. Другое дело, что для этого надо значительно переделывать код. А на это нужно время, которого, к сожалению, не всегда хватает.
            Единственное, в чём может быть проблема: в свободной оперативной памяти и памяти для прошивки. Я пока не уверен, что её хватит для всего этого. Надо пробовать.

          2. NightFlash, да без сомнения — справится
            Я же сказал «Текущие возможности». И, кстати, то, что Ваш проект открытый — в плюс этим возможностям: любой желающий может сам допилить то, что ему нужно.

            Вадим, кстати, а какой экран вы бы хотели? Я пока пырхался с альтернативным проектом, «накопил» минимум 4 разных экрана 🙂 И еще о двух — знаю, но не покупал себе.

          3. Знаете, благодаря этому проекту я сделал метеостанцию, автор молодец, и спасибо ему! Повесит кнопочку donate, с удовольствием поддержу его. Касательно аквариума -у меня Juwel, там точно руками нагреватель включать не надо 🙂

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

    1. Ну я тоже сделал метеостанцию благодаря автору. Спасибо ему огромное. Но у меня розетки езернетовской рядом не было, поэтому я переехал на wifi.
      Про экран — посмотрите в сторону LCD 1602 (ссылки на али могу дать, если тут это разрешено). 2 строки по 16 символов. Или LCD 2004 — 4 строки по 20 символов. $4+
      Из минусов — нет русских букв. Зато программируется вроде бы без проблем.

      1. Ссылки допустимы)
        LCD1602 — да, согласен, наилучший вариант. При этом есть и русскоязычные. Только конечно их надо покупать на на али, а в России. По их подключению может быть два варианта: это напрямую к ардуине (6 контактов вроде задействуется) и через I2C (2 провода). По I2C с русским языком не пробовал работать.

          1. Эдак можно vga-монитор подключить, чтобы строк побольше 🙂

            Посмотрел что со временем можно сделать. Все очень просто. Подключаем библиотеку time (через менеджер библиотек) и практически полностью переносим пример из примеров библиоткеи… В общем, попробуйте кто ни будь (у меня розетки нет рядом, как уже говорил):
            https://drive.google.com/file/d/0B5Lus-kNQGHGQ2x5RmZvUTF5cEk/view?usp=sharing
            Строки, которые я добавил — обозначал каментом «// Naevus». Время берем с ntp сервера. При включенном дебаге в порт будет кидать текущее время. Если все нормально, будем считать что с часами разобрались. Перейдем к экрану.

          2. По поводу часов: у меня на этом же сайте есть статья про часы с синхронизацией через Интернет. Там как раз NTP и используется) Только дополнительно ещё модуль DS1307

          3. С экраном всё ещё проще) Если подключение напрямую, то вот здесь есть пример кода: http://student-proger.ru/2011/12/dir-320-freeduino-vyvodim-sistemnuyu-informaciyu-na-lcd/ . Если по шине I2C (сейчас многие дисплеи на али уже сразу с впаянным переходником идут), то там только библиотеку поменять.

  23. RTC модуль у меня тоже есть, но посчитал лишним его использовать на проекте, у которого по определению постоянное соединение с инетом. Кстати, надо будет еще команду на периодическую синхронизацию добавить.
    Экраны lcd у меня только i2c, припаял ко всем 🙂 Так что буду тренироваться на них. Но это наверное не раньше выходных.

    1. Добавил библиотеку lcdi2c (из менеджера библиотек) и опять накопипастил строк из примеров. Теоретически — время на экран должно показывать. Практически — как доберусь до железа, проверю.
      Ссылка та же самая.

    2. Вчера не удержался, прикорячился с проводами… В общем — часы синхрятся (на удивление — быстро… блин, опять забыл автосинхронизацию добавить), экран экранирует.. тьфу — экран отображает что-то. Нужно дальше со строками поработать..

      Вадим, вот у вас будет 4 строки по 20 символов. Что бы вы хотели в них видеть и в каком порядке? Прям нарисуйте пример. Ибо делать динамическую обработку строк, скорее всего не буду — при подключении типа String память куда то быстро исчезла. Придется корячиться с char. И, у моих экранов нет русского шрифта — так что если что писать, то только латиницей.

      1. Во как все быстро закрутилось 🙂 Я честно не дизайнер как то так представляю, как сюда файл прикрепить не в курсе вот ссылка на диск https://yadi.sk/i/T9ecLBtuobCsU Давайте вместе думать. И какой экран конкретно модель, чтобы у друзей китайцев сразу заказать?

  24. Коммент куда то исчез, наверно из-за ссылки на рисунок — куда скинуть его? И какой конкретно экран заказывать у китайцев, там этих модификаций куча разных как посмотрю.

    1. см выше, если камент со ссылкой, то его сначала админ одобрить должен.
      Только зачем там картинка? 4 строчки текста можно и каментами написать 🙂
      Ссылку на экран следующим каментом брошу (соответственно — она появится после одобрения админом). Хотя там практически любой лот по поиску 2004 выдаст искомое. Только не забыть взять еще и переходник i2c к экрану (ну или использовать другую библиотеку и подключать экран кучей проводов)

      1. Ну сами попросили нарисовать 🙂 ну думаю Дмитрий вскоре все одобрит и все просветится. 2004 lcd i2c — так получается? там вариаций куча у них..

        1. Ну я тоже на работе — «нарисовать» эт у нас тут почти нарицательное — когда у бухгалтерии техзадание требуем 🙂
          По расположению понял. Справа можно попробовать выдать время последней отправки и статус (успешно-неуспешно). Вроде бы такие переменные в коде видел. Ну главное принцип (что нужно) понял. Остальное как доберусь — на месте решу. В конце концов — код открытый — каждый может и поправить при необходимости

          1. «выдать время последней отправки и статус (успешно-неуспешно)» — это то что надо, было бы вообще отлично!

    2. Пост со ссылками… Это то, где брал я. Оба продавца вполне нормальные. Но можно поискать еще — мож где дешевле будет (например когда я брал — был фришипинг, а ща за доставку денюжку просят)
      Экран 2004 http://www.aliexpress.com/item/Hot-1pcs-20X4-LCD2004-LCD-2004A-LCD-2004-LCD-Module-5V-Blue-Screen/1596796090.html
      контролер http://www.aliexpress.com/item/IIC-I2C-Interface-LCD1602-2004-LCD-Adapter-Plate-Free-Shipping-Dropshipping/2036495602.html
      (по мне так заказать экран и контроллер у одного продавца — правильнее чем у разных. Но тут на вкус и цвет…)
      Экран 1602 (вдруг кому 4 строк много и дорого) http://www.aliexpress.com/item/Free-shipping-LCD1602-LCD-monitor-1602-5V-yellow-green-screen-and-white-code-for-arduino/32347745000.html
      контроллер (контроллеры одинаковые — просто это у этого же продавца) http://www.aliexpress.com/item/IIC-I2C-Interface-LCD1602-2004-LCD-Adapter-Plate-for-Arduino/32340990581.html
      Ну и еще есть ОЛЕД экран — очень симпатичный, но я его на ардуину не приделывал. И главный недостаток — маааленький (люди из него часы делают наручные 🙂 ). Зато текст четкий и читаемый. http://www.aliexpress.com/item/New-Arrival-0-96-inch-White-OLED-LCD-Display-Mould-1PC-2-8-2-7cm-Driver/32563904330.html
      Еще раз — ссылки только для примера. Может быть имеет смысл посмотреть экраны в россии с гарантированой прошивкой с русскими буквами. Тем более что китайцы еще неделю будут бухать (новый год у них) а потом еще месяц — разгребать завалы на почте.

  25. На сегодня самый простой вариант метеостанции:
    ESP8266 + бесплатная прошивка для него от сюда:
    http://homes-smart.ru/index.php/oborudovanie/bez-provodov-wi-fi/proekt-umnogo-modulya-na-baze-esp8266
    — с отправкой на народный мониторинг и не только.
    Это не реклама — сам такой сделал по инструкциям на сайте.

  26. Подумал на счет экрана — все таки лучше добавить еще десятичный раздел для температуры +21,4 ка то более удобнее чем +21… Получится?

    1. скорее — без десятичного не получится 🙂 Я уже приблизительно накидал формат, осталось с преобразованием типов разобраться (памяти чтото резко не хватает. хм.) Но час уже должны тикать (хотя не — там косяк с цифрами меньше 10 — нет ведущего нуля).

    2. Помучался, что-то получилось: Слева — 4 температуры в 4 строках. Не получилось сформатировать, поэтому 1 или 2 знака после запятой.
      Время в правом нижнем углу
      Справа вверху давление, вторая строк — влажность, третья строка — колво секунд со времени последней отправки.
      Скетч по той же ссылке.
      В Авторский код НЕ ИЗМЕНЯЛ. Все мои вставки идут с каментом // Naevus.
      Из настроек (помимо тог, что настраивается для метеостанции): адрес ntp сервера (если не нравится тот что стоит); Таймзона; Локальный порт для UDP — в инструкции к ntp было написано что «если не работает, попробуйте 123». У меня работает; АДРЕС экрана на шине i2c (для определения адреса воспользуйтесь i2c-сканером).
      Места на экране меняем в коде, если не нравится — каменты старался писать.
      Ссылку на картинку ща брошу следующим сообщением (ждем когда отмодерируется).
      Что-то переделывать вряд ли буду — попробуйте сами. А я пошел заливать пивом психологическую травму от удобства работы со строками 🙂
      ДА! Показания датчиков обновляются только в момент отправки на народмон! Т.е. — раз в 10 минут. По другому — потребовалось бы переделать весь код — а как известно — проще написать новый, чем переделывать чужой. Так что — ждем от NightFlash Метеостанцию 3.0 — с выводом датчиков на дисплей по шаблонам, часами синхронизирующимися по ntp, календарем с будильником, разными дисплеями итп. 🙂
      ps Спасибо за отлично проведенный выходной!

      1. Блин, снимаю шляпу! Респект и уважуха! Жалко экран даже еще не выехал со всеми известной Восточной страны, но думаю в начале весны получу. На таких людях как Вы и Дмитрий замля держится! С удовольствием а Вами бы встретился поболтать за бокалом пива. С уважением, Вадим
        ЗЫ ссылка с скетчем еще видать под модерацией.

        1. Да ну прям — я просто давно хотел поизучать ардуину, а вы дали мне хороший повод это сделать 🙂
          Ссылку на скетч см выше — в моем каменте от 8 февраля 2016 в 23:11 (там ссылка на гуглодиск — я прям там правил скетч все это время). А на модерации — ссылки на фотографии того, что у меня получилось 🙂
          Китайцы тока-тока от празднования нового года отходят. Потом еще недели две будут разгребать завалы. Так что «к весне» — это слишком оптимистично 🙁 Я бы на конец марта рассчитывал.

          1. Ну да, осталось дождаться экрана. Сегодня мудрил с с уличным датчиком — после помещения его в трубку удалось получить показания ближе к реальности (-1 градус). Ну надеюсь завтра Дмитрий появится и увидим Ваши фото.

          2. Извиняюсь за задержку проверки комментариев. Дома были проблемы с Интернетом. Всё что было в комментариях — одобрил.
            От себя скоро выпущу обновление, если тестирование будет успешным: добавится счётчик Гейгера.

        2. Про уличный датчик — чуть выше моя ссылка на mysku — там в каментах есть моя схема с двумя трубками. Сам еще не собирал, но одной трубки явно маловато.

          1. Да эта статья и была причиной на переделку 🙂 Только я взял кусок белой метало пластиковой трубки (водопроводной) , 32 мм диаметром внутри по центру — датчик, креплением отвел от стены, показания пока в норме (упало где-то на 1-1,5 градуса)

          2. 🙂 Ну в принципе — полипропилен имеет низкую теплопроводность. Но все равно — я бы его снаружи обернул фольгой — она будет еще отражать солнышко.

          3. Да у нас тут фольга как бумага в продаже, на воздухе рассыпается 🙂 посмотрю пока так. Куда там Дмитрий пропал фотки экран охота посмотреть..

          4. ВАДИМ, проглядел — полипропилен — это пластиковая труба. А металлопластик — это люминий с полиэтиленом — теплопроводность у нее не хуже железной. Не рекомендую. Сейчас показания упали, т.к. нагрев солнышком непосредственно датчика прекратился. Но летом нагрев трубы неизбежно будет нагревать датчик. Тем более — металлопластик — это полдюйма? Очень маленькая труба.
            Уж лучше сделайте «шторку» — просто затените датчик, не ограничивая пространство (трубой). В моем примере две трубы задуманы только для эжекции — чтобы датчик естественно-принудительно обдувался.

          5. Это 1,25 дюйма, 32 мм диаметр, он на восточной стороне, засвечивается только утром, сейчас проверить ни как солнца по утрам нет, понаблюдаю что дальше будет

      2. Показания датчиков обновляются только в момент отправки на народмон! Т.е. — раз в 10 минут. По другому — потребовалось бы переделать весь код

        Не, не обязательно всё переделывать. Всё гораздо проще делается. Можно уменьшить интервал замера данных и сразу их выводить на дисплей. Но отправлять по прежнему — раз в 5-10 минут. Если нужна будет помощь с этим — помогу.

        1. я это и имел ввиду под «переделать». Сейчас я обошелся только вставками своих копипастов. А в данном случае — потребовалось бы менять ваш код.
          На самом деле, я пробовал продублировать опрос датчиков в своем куске. Но опрос четырех термодатчиков идет так долго, что часы останавливаются на несколько секунд. Это не дело. Для нормальной работы, ИМХО, надо в коде избавиться от delay(). Кроме того — я бы чтение датчиков выделил в отдельный блок, с записью данных в в переменные. Тогда блоки — чтение, вывод на экран, вывод на народмон — будут разделены и независимы. Что упростит код (мне пришлось практически дублировать куски, декодирующие значения датчиков) и, главное, позволит использовать новые фишки. Например — использовать шаблоны строк для экранов. Или — приделать/переделать код под другой экран. И/или — использовать командную разработку — договорились о названиях переменных и отдельные команды делают свой кусок (чтение датчиков, вывод на экран, вывод на народмон, прикручивание новых фишек — будильника например).
          В общем — отличное поле деятельности для желающих попрактиковаться!
          Еще раз спасибо за проект.

          1. Да, про задержки при чтении с датчиков я как-то не подумал… Но есть способ это исправить) Теперь надо как-то время на всё это выкроить.

    3. Картинки:
      https://drive.google.com/file/d/0B5Lus-kNQGHGZUNXWVZSb2MtNnc/view?usp=sharing
      общий вид:
      https://drive.google.com/file/d/0B5Lus-kNQGHGT3hZWHNxVjhUMFE/view?usp=sharing
      По экрану — у меня датчики давления и влажности не подключены, поэтому там мусор выводится (причем — мусор от влажности перескочил на четвертую строку и затер температуру четвертого датчика)

      1. У Вас смотрю питается от 5V usb. У меня 4 температурных + датчик давления + датчик влажности — при 5 V висло все часто, сейчас 12 v питание. А так жду экран для испытаний

      2. Еще просьба — можете сделать кусок кода для вывода температуры с датчика ВМР 085 (три температуры идут с DS18, четвертая с него, как я понимаю он будет lcd.setCursor(0,3);

        1. А сами не желаете попробовать?
          Просто я уже «стенд» разобрал — могу только без проверки запилить — лишь бы скомпилировалось. Но и то — до выходных вряд ли возьмусь 🙁

          1. Да я не такой спец… Если возможно гляньте при случае на это, время есть, мой экран еще даже с Али не выслали 🙁

        2. Сделал. Не стал ограничивать три строки в блоке с ds18 — если их меньше 4-х то не страшно. если больше, то четвертую потом перезабьет блоком от bmp. Собственно код опять копипастом получился. Никакого творчества 🙂

          1. О! Сила! Даже выходных ждать не пришлось, как я понимаю — все там же на гуглодиске? Осталось экран дождаться 🙂 Может к этому времени и Дмитрий оптимизацию проведет.. Спасибо!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *