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

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

О подключении всё написано в этой статье: http://student-proger.ru/2014/07/meteostanciya-2-0/
Спасибо тем, кто уже писал в комментариях к предыдущей версии свои решения ( cephex ). Ваш путь был верным 🙂
Внимание! С Arduino Leonardo имеются проблемы при работе с датчиком давления.
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
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
// Скетч для Arduino для отправки метеоданных на Народный мониторинг
// Версия 2.1 (25.11.2014)
//
// Автор: Гладышев Дмитрий (2012-2014)
// http://student-proger.ru/2014/11/meteostanciya-2-1/
 
#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 BMP085_TEMP      1      // использовать температурный датчик в BMP085
#define DHT_EXIST        1      // наличие датчика влажности
#define DHT_TEMP         1      // использовать температурный датчик в DHT22
#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 Temperature = 0;
long Pressure = 0;                              // давление
float Humidity = 0;                             // влажность
 
void setup() {
 
  if (Debug)
  {
    Serial.begin(9600);
  }
 
  // Пробуем подключиться по Ethernet до тех пор пока это не удастся
  do 
  {
    delay(1000);
  } while (Ethernet.begin(mac) == 0);
 
  //Узнаём количество термодатчиков DS18B20
  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();
 
    //Теперь в цикле опрашиваем все датчики DS18B20 сразу
    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++) // нам необходимы 9 байт данных от датчика
      {
        data[i] = ds.read();
      }
 
      LowByte = data[0];
      HighByte = data[1];
      TReading = (HighByte << 8) + LowByte;
      SignBit = TReading & 0x8000;  // бит знака
      if (SignBit) // отрицательная температура
      {
        TReading = (TReading ^ 0xffff) + 1;
      }
      Tc_100 = (6 * TReading) + TReading / 4;
 
      Whole = Tc_100 / 100;  // разделяем целую и дробную части
      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);
      #if BMP085_TEMP == 1
        //получаем значение температуры с датчика давления
        strcat(replyBuffer, "&bmpt=");
        dps.getTemperature(&Temperature);
        if (Temperature < 0)
        {
          SignBit = 1;
          Temperature = -Temperature;
        }
        else
        {
          SignBit = 0;
        }
        Whole = Temperature / 10;
        Fract = Temperature % 10;
        itoa(Whole, temp);
        if (SignBit)
        {
          strcat(replyBuffer, "-");
        }
        strcat(replyBuffer, temp);
        strcat(replyBuffer, ".");
        itoa(Fract, temp);
        strcat(replyBuffer, temp);
      #endif
    #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);
      #if DHT_TEMP == 1
        //получаем значение температуры с датчика влажности
        strcat(replyBuffer, "&dhtt=");
        Temperature = dht.readTemperature()*100;
        if (Temperature < 0)
        {
          SignBit = 1;
          Temperature = -Temperature;
        }
        else
        {
          SignBit = 0;
        }
        Whole = Temperature / 100;
        Fract = Temperature % 100;
        itoa(Whole, temp);
        if (SignBit)
        {
          strcat(replyBuffer, "-");
        }
        strcat(replyBuffer, temp);
        strcat(replyBuffer, ".");
        if (Fract<10)
        {
          strcat(replyBuffer,"0");
        }
        itoa(Fract, temp);
        strcat(replyBuffer, temp);
      #endif
    #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("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();
  }
}
 
//Количество термодатчиков DS18B20 на шине
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);
}
Файлы
Скетч v2.1 (11.31 KB)

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

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

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

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

219 Комментарии “Метеостанция 2.1

  1. И подскажите на счет резистора R2 — 5 кОм, для чего он нужен? Не нашел у себя такого, пока поставил без него, вроде все нормально показывает.

    1. Сергей, без резистора сигнал скорее похож на пилообразный и может на длинных проводах не достигать логической единицы, а с резистором больше похож на прямоугольный как и должно быть + выше помехозащищенность, на выносном DHT22 у меня припаяно еще параллельно 2 кондера, 50мкф и 22нф (между 1 и 4 выводом DHT22) это также избавляет от известной ошибки 99%
      А автору большое спасибо за обновление.

  2. Здравствуйте. Большое спасибо вам за проект. Можете добавить в код еще один DHT22 для мониторинга комнаты и вывод этого всего на ЖК экран 16х2?

  3. Здравствуйте. Спасибо вам за ваш проект. Можете добавить в код еще один датчик DHT22 или DS18B20 для мониторинга комнаты и вывод этого всего на жк 16х2?

      1. Всё верно, каждый датчик DS18B20 получит в народном мониторинге уникальный адрес, равный его серийному номеру. Про вывод на LCD пока не скажу, возможно сделаю позже.

  4. Супер! Начала ардуина подвисать раз в день. Я ее даже подключил через умную розетку с таймером вкл/выкл через каждые 24 часа.
    Вечером обновлюсь.

    спасибо!

    1. Я тоже долго сам мучался с зависаниями. Потом поместил платы в металлический корпус от DVD-привода. Сам корпус подключил к земле (GND). Зависания прекратились. Видимо наводки сильные были.

      1. Вот я сейчас попробую прикрутить дисплей от нокии и в корпус спрячу. Если получится, то поделюсь скетчем.

        1. Буду первый в очереди на тест прошивки с нокиевским дисплеем, как раз лежит без дела один.
          С дисплеем действительно можно и в корпус прятать, законченное устройство получается.

      2. Та самая беда.. зависает раз в сутки.. при этом горит светодиод на 13-м пине.
        Еще думаю как переделать код, если у меня все это дело конектится через 3G модем. не всегда есть связь.

  5. Спасибо большое за работу, уже несколько месяцев трудятся с V2.0 два DS18B20 и один BMP180. Буду тестить с V2.1.
    Ещё бы дисплей и можно уже плату под 328 мегу разводить.

  6. А если использовать датчик влажности для измерения температуры и влажности на улице, то можно не подключать DS18B20? Если не подключать DS18B20 что нужно изменить в скетче?

  7. Все круто! Работает уже пару месяцев. Но хотелось бы перейти на WiFi модуль.Но не на шилде к Ардуине а на модули работающие по UART. Я вот такой приобрел: http://ru.aliexpress.com/item/Embed-UART-Serial-port-to-WIFI-Wireless-transmission-module-HLK-RM04-RM04-MCU-intelligent-control-Smart/2035000406.html
    Но чем заменить библиотечные функции: «EthernetClient», «IPAddress» ума не хватает. Может кто подскажет как эти функции реализовать через UART ?

      1. Даташит с АТ командами имеется.
        Мне не понятно как их записывать с помощью Serial.print. Допустим такая команда из примера:
        «at+remoteip=192.168.11.133\n» set remote ip address as 192.168.11.133.
        Если я так напишу:
        Serial.print= «at+remoteip=192.168.11.133\n» ;
        то ничего не происходит. Видимо АТ команды нужно как то иначе подавать?

  8. Чтото у меня при компиляции размер выходит за приделы. С чем это может быть связано?
    C:\TEMP\build7237990727353745891.tmp\Meteostation_2_1.cpp.hex
    Размер скетча в двоичном коде: 33 226 байт (из 30 720 байт максимум)

  9. Скажите пожалуйста NightFlash, есть ли возможность сократить размер скетча на 3 кБайт. Путем например отключения запроса температуры с датчиков давления и влажности (оставить 18б20). Я закоментил их запрос, но в итоге разница просто ничтожна. Я совсем новичек в программировании. Уже неделю бьюсь с этим ********* 28J60. Он может отправлять данные ТОЛЬКО пипа: char, uint8_t, uint16_t, что как вы понимаете крайне печально. И тут набрел на статью — http://sagis.ru/blog/?p=8, которая ссылается на ваш (к стати очень хороший проект) и использованием либы (приведенной выше) под 28J60. Печаль в том, что подьедает она 9 кБайт. Благодарен любой помощи.

    1. UIPEthernet.h вполне рабочий.
      Не используй dhcp, dns, и поставь в libraries/UIPEthernet/utility/uipethernet-conf.h

      #define UIP_CONF_UDP 0

      Скетч с отправкой тестовых показаний http://pastebin.com/qUZdXbD4 влазит в 16кб, итоговый скетч с набором датчиков — 27кб.
      Не покупайте ENC28J60 LAN.

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

      2. после изменения libraries/UIPEthernet/utility/uipethernet-conf.h
        стал выдавать ошибку:
        Meteostation_2_1.cpp.o: In function `setup’:
        C:\Program Files (x86)\Arduino/Meteostation_2_1.ino:59: undefined reference to `UIPEthernetClass::begin(unsigned char const*)’

          1. Спасибо огромное, все работает. Пока не знаю на сколько надежно но работает.

          2. Здесь надёжность больше зависит от отсутствия помех и соответственно хорошего экранирования схемы.

  10. Здравствуйте. Большое спасибо Вам за проект.
    Замечен незначительный косячек. При размере буфера в 160 (45 строка кода)
    char replyBuffer[160]; // буфер для отправки
    функционирует максимум 6 температурных датчиков DS18B20. С добавлением седьмого датчика, прекращается отправка данных, или строка отправляемая на narodmon.ru коверкается до неузнаваемости. Увеличение буфера решает проблему.

    И просьбочка.
    Имеется несколько аналоговых датчиков давления MPX5100AP .
    Код типа
    // Читаем показания датчиков
    int sensorValue_1 = analogRead(A0);
    int sensorValue_2 = analogRead(A1);

    float voltage_1 = sensorValue_1 * (5.0 / 1023.0);
    float voltage_2 = sensorValue_2 * (5.0 / 1023.0);

    // Конвертируем вольты в кПа
    float pressure_kPa_1 = (voltage_1 — 0.2)/0.045;
    float pressure_kPa_2 = (voltage_2 — 0.2)/0.045;

    // Печатаем данные в последовательный порт
    Serial.println(pressure_kPa_1);
    Serial.println(pressure_kPa_2);

    работает.
    Намекните пожалуйста как добавить датчики в Ваш скетч.

    1. Здравствуйте. После 310 строки добавьте:

      1
      2
      3
      4
      5
      6
      
      strcat(replyBuffer, "&p1=");
      itoa((int)pressure_kPa_1, temp);
      strcat(replyBuffer, temp);
      strcat(replyBuffer, "&p2=");
      itoa((int)pressure_kPa_2, temp);
      strcat(replyBuffer, temp);
  11. NightFlash, огромное спасибо за статью.
    У меня в схеме используется 2 датчика DHT 22, 1 — BMP180.
    Датчик DS18B20 не использовал. Всё работает на ура!
    Из известных проблем:
    1.Зависание Arduino 1 раз в день стабильно. Буду пробовать заземлять.
    2.Есть экран 16х2 на lcd hd44780, у него как известно есть проблемы с совместимостью с Arduino UNO и Ethernet-shield Wiznet w5100. Как только появилось подключение к интернету, экран перестает отображать текст. Пробовал менять пины подключения экрана (http://forum.amperka.ru/threads/%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0-%D1%81-ethernet-shield-%D0%B8-lcd-%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%BE%D0%BC.3731/).
    Так что ребята, кто сможет побороть этот глюк, большая просьба отпишитесь здесь.

    1. Не должно быть проблем с W5100 и LCD. Конечно их нужно разнести на разные пины. В крайнем случае LCD всегда можно подключить по шине I2C с помощью микросхемы PCF8574.

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

    2. .Есть экран 16х2 на lcd hd44780, у него как известно есть проблемы с совместимостью с Arduino UNO и Ethernet-shield Wiznet w5100. Как

      Нет ни каких проблем с совместимостью, я утверждаю. Я несколько недель гонял. Версию 2.0 метеостанции с добавленными LCD фоторезистором и еще с датчиком влажности + темпереатура которой тогда еще не было. Естественно по шине i2c. Сейчас отложил, жду миниплату W5100 которая не шилд.
      Хочу все сделать аккуратно на одной плате.

  12. Большое спасибо за проект. Собрал метеостанцию с небольшими доработками: добавил второй dht22, i2c lcd2004 в качестве ethernet shield enc28j60. Все работало, но вылезла проблема. Метеостанция переставала отправлять данные через хаотичные интервалы времени. Иногда повисала через полчаса после перезагрузки, иногда нормально работала сутки. Сначала я выявил просадку напряжения до 4.6в и 3в соответственно на линиях 5в и 3.3в ардуино. Запитал ардуино и enc28j60 от двух dc-dc преобразователей. Напряжение стало, как в аптеке, проблема осталась. Потом заметил, что после выключения компа или wi-fi на планшете практически гарантированно останавливается отправка данных с метеостанции. Перепрошил роутер, дал метеостанции свой айпишник, в Ethernet.begin прописал mac,ip,gateway, mask. Проблема все равно осталась. Сейчас прописал ethernet.begin в начало функции httpRequest, проблема(тьфу-тьфу) вроде пропала. Модули на W5100 уже едут из Китая, надеюсь с ними таких проблем не будет.
    В дальнейшем хочу сделать передачу данных с датчиков беспроводной, метеостанцию подвесить под потолком рядом с роутером, и добавить беспроводной модуль с дисплеем, который будет висеть в видном месте и показывать все данные с метеостанции.

    1. Проходил такой момент. Правда у меня через два рутера все было, один домашний двухдиапазонный с подключенным HDD TL-WDR4300, а другой мостом соединен. Терял соединение устаревший рутер Edimax BR-6204Wg, он терял DHCP для ардуинки и выделял кривой Айпи, а после замены на TL-WR740N стало ОК.
      Есть еще два рутера с разными прошивками WR703N, вот они и будут в законченном устройстве в связи с миниатюрностью.

      1. На сегодняшний день WR703N безвозвратно потерял статус миниатюрного и дешевого 🙂
        Из того что пробовал ( есть в наличии).
        Первый кандидат http://ru.aliexpress.com/store/product/World-Smallest-100Mbps-Router-Roteador-IEEE-802-11-b-g-n-AP-Repeater-Client-Bridge-Wifi/330467_1938319918.html
        Второй http://www.ebay.com/itm/141426618324?_trksid=p2059210.m2749.l2649&var=440569401194&ssPageName=STRK%3AMEBIDX%3AIT
        И на конец — бомба (получил такие только позавчера) http://homes-smart.ru/index.php/oborudovanie/bez-provodov-wi-fi/62-besprovodnoj-datchik-na-baze-esp8266-dlya-servisa-narodmon-ru
        Сижу теперь на своего ардуино ежика смотрю и думаю : пусть еще поживет , или разобрать ?
        У меня в нем Ethernet Мини ENC28J60

  13. Спасибо за труды на основе вашего кода собрал совой на два датчик DHT22 внутренний и внешний + барометрический датчик. Все отлично работает с проектом. Но вот с Nokia LCD работа идет с скрипом, даже получилось вывести давление на экран но при добавление любой другой информации контроллер отказывается обобщатся с внешним миром. Подскажите с какой строчки следуют добавлять нечто подобное
    {
    display.setTextSize(1);
    display.print(«P=»);
    display.print(Pressure/133.3,1);
    display.println(«mmHg»);
    display.display();
    delay(10);
    display.clearDisplay();
    }

    1. Ну если на роутере настроен веб-сервер и прочее, то конечно можно. Необходимо только продублировать код отправки данных и соответственно указать IP роутера.

  14. Подскажите в чем может быть дело. Станция работала в тестовом режиме пару дней, все нормально работало. Вынес датчики на улицу, это 17м витухи. и теперь 18B20 время от времени выдает значение типа: -81 или -79. Поменял резистор с 4.7 кОм на 3.5 кОм теперь то же самое только значения: Wrong Value: —290.0-72 или Wrong Value: —294.0-16. В то время как DHT22 нормально работает.

    1. «Витуха» растяжимое понятие. Может иметь как 2-ве так и 4-ре пары проводников. Вы какую «витуху» юзаете?
      И по делу.
      Так как цифровой температурный датчик DS18B20 использует всего три проводка (полторы пары) предлагаю попробовать подключить оставшиеся свободные проводники «витухи» к контакту GND со стороны ардуино.
      У меня 5-ть датчиков DS18B20 «висят» на «витухе» примерно такой же длинны. Работают без проблем.

      1. Ого… А у меня на витой паре на 6 метрах уже отказывался датчик работать. Зато на 4-х проводном телефонном кабеле всё работает замечательно.

        1. У меня 2 датчика висит на дуине. Один на трёх проводах сидит сантиметрах на 20 другой на 15 метровом телефонном двухжильном проводе (соответственно подключен по двухпроводной схеме), 7 из которых проложены по прямой и через окно, а остальное свёрнуто на балконе как попало. Сбоев за несколько месяцев не наблюдалось.
          Я вот думаю может для такого помещения как у товарища barkanum, где ви-фи глушится, лучше выбрать витуху с экраном и не париться.

      2. Витуха 4 пары, 0.20 сечение, биметалл, без экрана. и остальные на землю цеплял. Не знаю, думал может просто из-за расстояния емкость большая, уменьшение сопротивления не помогло. Вот купил телефонный, даже графитом 33 его покрасил. Буду пробовать. Может из-за того что в помещении много оборудования (головная станция кабельного телевидения) помехи. По крайней мере любой роутер фай-фай дальше чем на 8м сигнал не дает.

        1. Телефонный провод не помог. В интернетах вычитал что и по 100м провода работают. Еще вопрос, при включении ардуины всегда 1й раз нормально показывает температуру, сколько раз не перезагружал. А последующие рандомно, то брешет, то нет. Может в скетче дело. Но он практически идентичен этому.

          1. Попробуйте параллельно питанию датчика прямо рядом с ним повесить электролитический конденсатор, например 16 вольт, 100 мкФ.

      1. падаю 12в стоит кренка на 5, по входу и выходу 100нф еще ро выходу 470 мФ, резистор прям на 18б20 (не рядом с ардуиной) протянул коаксиальный кабель для него (рк50 (советский оплетка посеребренная) еще с РЛС кто то снял после распада, тоненький с изоляцией — 2мм сечение) глючить стало куда реже, но глючит. даже не знаю, так наверно оставлю. Идей болше нет. А DHT22 все не почем работает себе без проблем. Модет сам датчик китайский, если они фт232 подделывают, что отличить невозможно, то DS и подавно. И сама ардуина виснет раз в 2 дня стабильно.

        1. Не понимаю почему вообще ардуина может виснуть. У меня питание от зарядки 5.5v, на Ethernet стоит lm1117 3.3v. Датчики на телефонке 5 метров, без кондеров. Месяц аптайма без потери показаний.

          1. Сама по себе ардуина практически никогда виснет, там просто нечему зависать) А вот Ethernet-модуль довольно капризный. Мучался я с ним, пока не заэкранировал и не поставил конденсаторы по питанию.

      1. Про ESP8266 пока выше ничего не писали. На нём, судя по статье, интересная вещица получается. Учитывая что ви-фи и маленькие размеры можно и «за плинтусом» спрятать по двум проводам вывести LCD1602. Единственное ограничение которое бросилось в глаза это ограниченное количество датчиков, 18b20 6 штук уже не повесишь, DHT 2 штуки всего.

        1. Вообще шикарная железка. 512 кб флешь, что тут говорить, там даже вебморда есть, делай что хочешь. Докупить расширитель GPIO портов и с ардуиной даже рядом не стоит. Прошивки новые каждую неделю выходят. Друг на такой метеостанцию сделал, работает как часы. И самое главное — 160 руб на aliexpres стоит. И это полностью разработка китайцев.

  15. Выяснелось, что шилд просто перегревается. по даташиту ENC28J60 120mA потребляет, а на деле оказалось что все 200. контроллер греется до 50 градусов и тухнет, или lm1117 перегревается точно не выяснил. Вот пока куллер на него дует — работает 🙂
    P.S. Купил шилт точно по размеру с нано 3, чтоб компактно-симпатично было, а на деле такое ***** получилось.

  16. вообщем прикрутил дисплейчик I2C/TWI LCD1602 Module
    добавил в код
    15 #include

    38 LiquidCrystal_I2C lcd(0x27,16,2);

    и перед строкой «// отправляем запрос»
    {
    lcd.init();
    lcd.backlight();
    lcd.print(«T=»);
    if (SignBit) lcd.print(«-«);
    lcd.setCursor(3,0);
    lcd.print(Whole);
    lcd.print(«.»);
    lcd.print(Fract);
    lcd.setCursor(9,0);
    lcd.print(«H=»);
    lcd.print(Humidity);
    lcd.setCursor(0,1);
    lcd.print(«P=»);
    lcd.print(Pressure/133.3,1);
    lcd.print(«mm/Hg»);
    lcd.home();
    }

  17. Здравствуйте.

    Повторяю конструкцию, описанную Вами, есть проблема:

    Датчики DHT22 и DS18B20 корректно выдают температуры и влажность. С датчиком BMP085 — затык.

    Подключил как у Вас, однако вместо давления шлет число 1.76, температура 0.

    Платы Leonardo и ethernet на чипе W5100.

    В какую сторону копать?
    Линии SDA и SCL подключены верно, так как при их смене, данные не идут вообще.

  18. Еще немного поковырялся, выясняется, что перестает работать, если подключить BMP085. То есть 3 штуки 18В20 и DHT22 (и его температура) передаются, только активирую в скетче датчик давления — данные больше не идут…

    1. В данный момент у меня работает 2 — 18b20, 1 — bmp180 аналог 085-го и один dht11. Причём прекрасно работают неполадок не наблюдалось.

  19. Мысли по поводу ежесуточных зависаний:

    Есть в природе микросхемы МАХ (нас конкретно интересует МАХ6324EUT46) — сторожевой таймер (он 5-вольтовый, как сумел понять даташит, время ожидания 60-90 сек).

    Смысл — таймер ждет в течение 60-90 сек, пока на его ножку поступит сигнал от arduino. Если поступил, время снова отсчитывается, если не поступил, то МАХ дергает RESET у arduino.

    Подскажите, что и как добавить в скетч, для работы с сторожевым таймером, то есть циклично дергать секунд через 40-50 какой-нибудь свободной ножкой?

    Естественно известно, что возможна перепрошивка загрузчиа arduino и испльзование встоенного WDT, но возможно они смогут вызвать проблемы, а тут отдельная аппаратная железка.

    1. Как бы такое предложение (естественно набрано с просторов сети)+надо библиотеку VEduino:

      #include // Библиотека VEduino для программирования счетчиков — таймеров

      unsigned int potValue;
      volatile int s=0;

      void setup()
      {
      pinMode(13,OUTPUT);
      digitalWrite(13, LOW);

      Serial.begin(9600);

      potValue = 65535;
      DEV_TIMER1.setClockSelect(TimerW::Prescaler_64); // Тактовая частота — 16МГц / 64 = 250 кГц.
      // Таймер-счётчик 1 будет
      // увеличивать значение регистра TCNT1 на единицу
      // каждые 4 микросекунды.
      DEV_TIMER1.setWaveGenMode(TimerW::FastPWM_OCRA); // Таймер-счётчик 1 будет
      //сравнивать значение регистров
      // TCNT1 и OCR1A и когда они будут равны,
      DEV_TICTRL1.outCompIntEnableA(); // будет вызываться функция-обработчик прерывания TIMER1_COM
      interrupts();
      }

      void loop()
      {
      Serial.print(«peep\n»);
      delay(1200);
      digitalWrite(13, LOW);
      }

      ISR(TIMER1_COMPA_vect) // Функция обработки прерывания
      {
      DEV_TIMER1.setOutputCompareA(potValue); // Установить значение следующего
      // прерывания от переменной Val
      s++; // После каждого прерывания увеличиваем s
      if (s>50)
      {
      s=0;
      digitalWrite(13, HIGH);
      Serial.print(«RESET\n»);
      }
      }

      Этот тестовый скетч позволяет дергать светодиод на 13 пине. Соответственно можно будет сбрасывать внешний WDT.

      Как думаете куда вставить в основной скетч (к сожалению пока нет на руках ни микросхемы WDT ни устройства с W5100).

  20. Здравствуйте.

    кто не будь пробовал подключить часы реального времени RTC DS1307 и датчик освещенности BH1750, а то как то со скрипом идет подключение особенно датчик освещенности, помогите пожалуйста с кодом. Спасибо

    1. Доброго дня, зачем вам очень; не точный RTC? DS1307 голимые часы, берите DS3231, это первое, второе зачем вам часы без LCD? А если речь идет о LCD + RTC + BH1750 то на UNO это уже не влезает.
      В чем проблемы подключить BH1750? берите библиотеку и подключайте, все работает.
      У меня уже столько хотелок, что пришлось заказать голый ATMEGA2560 + QFP/TQFP/LQFP/FQFP 32/44/64/80/100 переходник, ну и естественно ESP8266 за место сетевухи, вот последний еще не пришел, да вот еще и паяльную станцию заказал. С LCD еще не определился, но придется какой то TFT сенсорный ставить.

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

        1. Вот тут библиотека BH1750 которой я пользуюсь:
          https://yadi.sk/d/q7SpS243eV8k4
          Когда добавите в каталог библиотек будет дан образец BH1750 с выводом в сериал.
          А вообще думаю разумно вместо сетевухи использовать ESP8266, вот пока жду.
          А еще, у меня не выходит вбить в строку отправки данные с наружных датчиков через радиоканал используя VirtualWire, нестыковки в типе данных:(

          1. Ответа не было видно, так как в комментарии есть ссылка) Поэтому он отправился на премодерацию.

          2. Чтобы не было нестыковок в типах данных, их необходимо преобразовывать в массив символов (char) для подстановки в строку запроса.

          3. Помогите добавить датчик BH1750 в код, я попробовал с библиотекой которой вы пользуетесь не получилось. Можете написать какие строки надо добавить. Спасибо.

  21. зачем городить огород 🙂
    watchdog — для AVR это магическое слово (а по совместительству еще и таймер), позволяющее автоматически перезапустить МК в случае зависания программы.

    void reboot() {
    wdt_disable();
    wdt_enable(WDTO_15MS); // активировали таймер, каждые (N) секунд его нужно сбрасывать

    while (1) {}
    }

  22. Кстати, зависает плата с W5100, а сама arduino работать продолжает. Так что с WDT неясность будет.

    Надо локальный метод контроля W5100, а тут напрашивается циклический hard reset всей системы.

  23. 2 NightFlash, давайте разберемся вместе с этими модулями ESP8266, пришли мне модули ESP8266, нашел уже какие то примеры на основе вашего кода, но оба кривоваты.
    Так, например в этом примере отсылка данных уходит только один первый раз в цикле не работает: http://esp8266.ru/forum/threads/arduino-biblioteki-esp8266.1/page-2#post-1253
    Если вы там не зареганы вам не скачать, по этому дублирую, там же добавил библиотеку библиотека:
    https://yadi.sk/d/URjSo4AHeg6eX
    Так же на вашей основе другой скетч и вовсе не запускается, взято от сюда:
    http://arduino.ru/forum/apparatnye-voprosy/polzuet-li-kto-wifi-moduli-esp8266-podelites-vpechatleniyami?page=8#comment-99628
    Различие между первым и вторым вариантом в управлении ESP8266 через SS_serial и второй HW serial соответственно.
    Доп инфа в примерах библиотеки + ссылки там. Выгода по сравнению с W5100 несколько килобайт. Версия IDE не ниже 1.0.6 , это важно, если будете читать об этом то поймете почему, остальные библиотеки стандартные.

    1. Постараюсь прояснить некоторые моменты.
      1. Есть стандартная заводская (стоковая) прошивка модуля ESP8266.
      2. Есть прошивки (костомные) улучшенные функционально с сайта http://esp8266.ru
      3. и есть библиотеки под эти прошивки.
      В этом топике обсуждается скетч под стандартную заводскую прошивку, а уважаемый cephex ссылается на скетчи доработанные под костомную прошивку.
      Однако функционал скетча взят с этого топика и принципиально не отличается в выше приведенных ссылках.
      Возможно еще проблемы из-за разных библиотек под конкретные датчики, но это уже чисто прикладной вопрос. Немножко почитать пару форумов и все встанет на свои места. Замечу, у меня в конце-концов запустились все самые неожиданные сочетания библиотек и прошивок. Успехов всем.

      1. Евгений, Все уже выяснено, SS зависал после переполнения RAM, а когда я возился с HWserial то забыл ему вернуть на стандартный размер буфера. Там есть свои тонкости, если вы в теме должны знать.
        Прошивка для ESP AT20SDK94-2014-12-26, вроде стандартная, как и то что скетч должен работать от стандартных АТ команд. Если юзать альтернативные прошивки, то зачастую Ардуино и не нужна:)
        Я автору уже отослал, Все как тут но с ESP модулем, + BH1750 + LCD 20×4 + отключение/включение подсветки LCD от датчика движения HC-SR501, скетч пусть приведет в порядок, да потом выложит для всех.

  24. Ребята прошу помощи. Имею Arduino mega 2560 + DTH22+BMP085+Ethernet W5100 (вот такой http://www.aliexpress.com/snapshot/6330217185.html?orderId=64484426237834), проблема в следующем: показания с датчика влажности отображаются нормально а с датчика давления температура +1.76° давление 0, на сайте ошибка такая «Полученные показания датчиков, время MSK / Latest Sensors Readings, UTC+3
    2015-02-25 21:20:18 POST
    ID=0024015DB66D&0024015DB66D01=742.49&bmpt=26.4&0024015DB66D02=30.70&dhtt=26.60
    742.49 out of range -55-125, 26.4 out of range 650mmHg-1100hPa» скетч пробовал и 2,0 и 2,1. Подскажите куда копать.

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

  25. Ребяты, замучали зависания. Раз в 1-2-3 дня стабильно. Подозреваю что зависает из за W5100. Потому что ни наводки ни чего не мешает. Плата находится в деревне в пустынном месте. Рядом никаких потребителей-помех. До этого стояла в обычной многоэтажке — ситуация такая же. Блоки питания разные ставили, чего только не делали. Проблема в сети! На некоторых роутерах чуть стабильнее работает на некоторых быстро виснет.

    Большая просьба, сделайте watchdog какой нибудь!!! Пусть эта фиговина просто тупо перезагружается хотя бы.

    1. Программный watchdog здесь не поможет. Только если ставить ещё один МК, который будет по таймауту делать сброс основной схемы. А вообще, надо бы уже наверное переходить на Wi-Fi. И дешевле и проще. Как модуль приедет (ESP8266) займусь этим.

    2. Жду когда приедет микруха аппаратного WDT, может с ней что выйдет. Так же мысль дергать каждый час (по часам реального времени) релюшку,которая делает ресет всей конструкции в целом.

      Ну а так как поблема необщения с интернетом имеет место быть у меня тоже, то механичекая розетка-таймер (суточный) временно решила проблему в лоб.

  26. А такое решение, не получать IP адрес каждый раз а зашить его намертво, дабы при перегрузке роутера плата не осталась в непонятках? Может в этом дело?

    WiFi да, приехала плата тоже буду делать, но разведено мало контактов, заказал другую.

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

      1. Как достаточно? Там для прошивки надо какое то GPIO на землю сажать а какое то на +, да и потом на них же вешаются датчики. Или я что то не правильно понимаю?
        У меня пришла версия самая никакая, 05 , там 5 контактов всего: питание, рх-тх, и ресет.

        1. А, ну если вы хотите полностью избавиться от ардуины, то тогда да. Я для начала просто буду использовать ESP8266 вместо Ethernet-shield. А дальше видно будет.
          P.S. но заказал на всякий случай версию с 16 ногами (ESP 12)

          1. Да, не подумал, надо попробовать тоже с ардуиной их подружить, все равно валяется. Я тоже 12 версию заказал.

        2. Самое главное не забываем, что в адаптере «USB to TTL» слабовата кренка на 3.3 вольта, я использовал параллельно еще от ардуины 3.3В при прошивке ESP8266.
          Кренка на 3.3 вольта в ардуине тоже слабая, советую использовать более мощную, а также на +/- по питанию припаять электролит на сотни мкф и еще десятки нанофарад параллельно. Нагрузка по току у модуля ESP8266 достигает пары сотен мА, работает от 3.3В, но GPIO толерантны к 5 вольтам.

          1. Спасибо! Я пытался ее запустить от 3х вольтового выхода USB-TTL адаптера. Не запустилась. Перекинул питание на 5в — начала греться. Спалил наверное.

            Простое решение подсказали, использовать LM317 дешевый стабилизатор, работает от 1.5 вольта, достаточно мощный, есть практически везде.

  27. Большое спасибо за разработку! Всё отлично работает.Добавил еще LCD Nokia 5110 для контроля показаний. Теперь хочу добавить беспроводный датчик :
    DHT11+Arduino Nano+ RF модуль 433Мгц. Возникает проблема при подключении библиотеки VirtualWire.h. похоже на конфликт прерываний. В данной библиотеке поменял номера пинов для приёмника, потому что там используются по умолчанию- 10,11,12 ,а их использует шилд W5100. Но все равно выполнение программы виснет, при добавлении в setup () всего одной строки сканирования приемного входа. Что можете посоветовать по этому поводу? Заранее спасибо!

    1. Вопрос с подвисанием решил !- не хватало памяти для local veriables. Работаю дальше, над оптимизацией кода приемника. Библиотека VirtualWire.h содержит много переменных , поэтому памяти Ардуино Уно не хватает для данного проекта…

    2. Игорь, поделись пожалуйста скетчем с LCD дисплеем.
      Сколько показаний 18B20 в нём можно выводить? все или только 1. И ещё несколько вопросов есть, если скетчем поделишься они отпадут, сам посмотрю.
      Не пробовал добавить запись данных показаний на microSD?

        1. Можете на почту мне выслать. Контакты в «О сайте». А я уже прикреплю ссылку на файл к Вашему комментарию. Ну или удобным вам способом)

      1. С микро CD картой еще не баловался )), в скетче с дисплеем отображаю один датчик 18B20, т.к. он у меня пока один, но думаю разницы нет сколько датчиков отображать.

        Код lcd5110.txt

        Скетч вставляется в программу автора. В тексте видно в каком месте что расположено. Температура выводится на дисплей у меня с датчика DHT, не помню, но что-то с 18B20 не смог подогнать формат значений, нужно подумать. Я с Ардуино и вообще с программированием только 2 месяца знаком ))). А вообще можно выводить любые данные.

  28. Спасибо большое за скетч с дисплеем!
    А трудности с выводом нескольких ds18b20, мне кажется возникнут, чтение в скетче происходит пошагово каждого датчика с занесением данных буфер.
    У Вас как я понял данные не берутся из основной программы а заново считываются. Или я не правильно понял?
    В общем ещё раз спаибо, будет чем на выходных поковыряться.

    1. Повторно считывается температура, а давление и влажность берётся из готовых значений. Почему так сделал-сейчас точно не скажу, я слабо еще знаком с программированием.Делал методом аналогии и методом «тыка» )). Так что может и не очень оптимально сделано. Наверное с размерностью чисел что-то было связано. Попробуй поэкспериментировать.

  29. Здраствуйт Залил ваш скетч, установил все библиотеки. Ругается на Ethernet.cpp. Что я сделал не так?
    Ethernet Shield w5100 http://media2.24aul.ru/imgs/52f0e6de787ad713fcf2c27a
    Arduino UNO http://2.bp.blogspot.com/-M9WMQFNfXEQ/VOgnMnz18sI/AAAAAAAACIM/ObD7iwgv4-Y/s1600/arduino_uno_large.png

    C:\Users\Виталий\Documents\Arduino\libraries\Ethernet\Ethernet.cpp: In member function ‘void EthernetClass::begin(uint8_t*, IPAddress, IPAddress, IPAddress, IPAddress)’:
    C:\Users\Виталий\Documents\Arduino\libraries\Ethernet\Ethernet.cpp:64:39: error: no matching function for call to ‘W5100Class::setIPAddress(IPAddress::&)’
    W5100.setIPAddress(local_ip._address);
    ^
    C:\Users\Виталий\Documents\Arduino\libraries\Ethernet\Ethernet.cpp:64:39: note: candidate is:
    In file included from C:\Users\Виталий\Documents\Arduino\libraries\Ethernet\Ethernet.cpp:1:0:
    C:\Users\Виталий\Documents\Arduino\libraries\Ethernet\utility/w5100.h:392:6: note: void W5100Class::setIPAddress(uint8_t*)
    void W5100Class::setIPAddress(uint8_t *_addr) {
    ^
    C:\Users\Виталий\Documents\Arduino\libraries\Ethernet\utility/w5100.h:392:6: note: no known conversion for argument 1 from ‘IPAddress::’ to ‘uint8_t* {aka unsigned char*}’
    C:\Users\Виталий\Documents\Arduino\libraries\Ethernet\Ethernet.cpp:65:38: error: no matching function for call to ‘W5100Class::setGatewayIp(IPAddress::&)’
    W5100.setGatewayIp(gateway._address);
    ^
    C:\Users\Виталий\Documents\Arduino\libraries\Ethernet\Ethernet.cpp:65:38: note: candidate is:
    In file included from C:\Users\Виталий\Documents\Arduino\libraries\Ethernet\Ethernet.cpp:1:0:
    C:\Users\Виталий\Documents\Arduino\libraries\Ethernet\utility/w5100.h:368:6: note: void W5100Class::setGatewayIp(uint8_t*)
    void W5100Class::setGatewayIp(uint8_t *_addr) {
    ^
    C:\Users\Виталий\Documents\Arduino\libraries\Ethernet\utility/w5100.h:368:6: note: no known conversion for argument 1 from ‘IPAddress::’ to ‘uint8_t* {aka unsigned char*}’
    C:\Users\Виталий\Documents\Arduino\libraries\Ethernet\Ethernet.cpp:66:38: error: no matching function for call to ‘W5100Class::setSubnetMask(IPAddress::&)’
    W5100.setSubnetMask(subnet._address);
    ^
    C:\Users\Виталий\Documents\Arduino\libraries\Ethernet\Ethernet.cpp:66:38: note: candidate is:
    In file included from C:\Users\Виталий\Documents\Arduino\libraries\Ethernet\Ethernet.cpp:1:0:
    C:\Users\Виталий\Documents\Arduino\libraries\Ethernet\utility/w5100.h:376:6: note: void W5100Class::setSubnetMask(uint8_t*)
    void W5100Class::setSubnetMask(uint8_t *_addr) {
    ^
    C:\Users\Виталий\Documents\Arduino\libraries\Ethernet\utility/w5100.h:376:6: note: no known conversion for argument 1 from ‘IPAddress::’ to ‘uint8_t* {aka unsigned char*}’
    Ошибка компиляции.

          1. Заработало в версии 1.0.5. Спасибо большое, правда с датчика DHT11 температура некорректно отображается.

          2. Да. С народного мониторинга пришло письмо что ошибка в передачи данных протокола от устройства DHT11.

          3. Как по мне данные нормальные, различие температур между ds18b20 и DHT11 примерно 1-1,5 градуса. Вывел значение переменной Temperature на LCD , значение увеличено в 100 раз, т.е. 25С в реале а выводит 2500.

            Прилагаю текст письма с народного мониторинга:
            Просьба устранить ошибки в протоколе передаче показаний на narodmon.ru от устройства мониторинга B870F4AE28D5.

            Время: 06.04.2015 15:12:15, IP-адрес: 89.22.178.49

            Полученные данные:
            ID=B870F4AE28D5&CE000006967A7828=23.87&B870F4AE28D502=20972.0-48&dhtt=0.00

            Ошибки: Wrong Value 20972.0-48

            Вот ещё одно:

            На Вашем устройстве мониторинга «B870F4AE28D5» показание датчика «DHT11T» = 25.00 с 17:22 06.04.

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

            P.S. Датчик работает исправно.

  30. Здравствуйте! Подскажите, может, кто-то пробовал, как сделать локальный web интерфейс для этой метеостанции на самой ардуино.

  31. Спасибо большое!Всё работает!
    Ссылка на карту http://narodmon.ru/?lat=56.237&lng=37.626&zoom=14&map=map
    Вопрос к NIGHTFLASH,я бы хотел добавить к этому бутерброду 3-ий этаж GSM/GPRS Shield
    для включения нагрузки с помощью СМС,но я так понимаю,что UNO уже не справится(памяти маловато),и придётся использовать MEGA.Получится у меня что-нибудь
    из этого,или есть более простое решение?Куски скетча буду брать вот тут http://wiki.amperka.ru/%D0%B1%D0%B5%D1%81%D0%BF%D1%80%D0%BE%D0%B2%D0%BE%D0%B4%D0%BD%D0%B0%D1%8F-%D1%81%D0%B2%D1%8F%D0%B7%D1%8C:gprs-shield

    1. К сожалению тут подсказать не смогу, с GSM-модулями не работал. Но судя по описанию, используется последовательная связь с помощью AT-команд. Можно попробовать и впихнуть.

  32. Доброго времени,
    подскажите в чем может быть ошибка?
    ///
    Arduino: 1.6.3 (Windows 8.1), Плата»Arduino Due (Programming Port)»
    C:\Program Files (x86)\Arduino\libraries\DHT\DHT.cpp: In member function ‘boolean DHT::read()’:
    C:\Program Files (x86)\Arduino\libraries\DHT\DHT.cpp:110:7: error: ‘cli’ was not declared in this scope
    cli();
    ^
    C:\Program Files (x86)\Arduino\libraries\DHT\DHT.cpp:140:7: error: ‘sei’ was not declared in this scope
    sei();
    ^
    Ошибка компиляции.

    1. Опять что-то новое придумали… Кстати, обратите внимание, что у этой платы напряжение I/O 3.3 вольта, а не 5, как у всех остальных. Соответственно и схемы подключения вероятно будут другие. Многие модули Arduino просто сожгут эту плату.

  33. Добрый вечер! Не могу понять почему происходит ошибка «Found 0 sensors.»? у меня только датчики 18б20, 3шт. Из приведенного скетча поменял мак адрес, отключил влажность и давление и включил дебуг. На сайт народного монитора всё доходит он тоже ошибку пишет мол нет датчиков.

    1. Здравствуйте! Какое расстояние до датчиков? Какой кабель использовали? Попробуйте только с одним/двумя датчиками.

      1. на данном этапе нет возможности паять-3 датчика спаяны по 3-х проводной схеме параллельно и работают прекрасно в наборе мастер кит 8036, пока нет возможности отпаять один из датчиков чтобы проверить 2 датчика, сегодня откопал датчик давления bmp085 у себя в деталях и прикрутил к ардуине-этот датчик, использовал тот же скетч, нормально определился на сайте и показывает и давление, и температуру вроде адекватно, а датчики температуры пока не определяются по прежнему. про датчики температуры-соединены параллельно от каждого из 3-х до точки соединения около 20см, от точки соединения до ардунины 2м, провод везде мгтф-0.15. Ещё могу добавить что у меня на пине для 1 вае для датчиков температуры вообще сигнал не меняется-т.е. нет никакого движения информации на ноге 2 ардуины(ногу менял-ничего не изменилось).

  34. подскажите какую часть кода удалить чтобы работал просто вывод показаний на экран? в мониторе порта при включенной отладке ничегошеньки не показывает

        1. При включенной отладке он как минимум при включении должен вывести количество датчиков DS18B20. Если ничего не происходит, значит скорее всего он не может Ethernet-shield инициализировать, например не удаётся получить IP-адрес.

          1. хочется чтобы скетч работал без сети. в этом вся проблема

          2. Ну это как минимум. Необходимо удалить ещё и все обращения к сети. Закомментировать строки 8, 28, 31, 88-91, 93-101, 322, 325, 329-358. На 322 строку поставить:

            lastConnectionTime = millis();

            105 изменить на

            if (millis() - lastConnectionTime > postingInterval)

            Как-то так… Но так и не понимаю, зачем это может понадобиться) Если только необходимо дальше где-то обрабатывать данные с консоли.

    1. Здравствуйте. Надо изменить 62 строку так:

      62
      
      } while (Ethernet.begin(mac, ip, dns, gateway) == 0);

      Перед этим указываются IP-адреса в таком виде:

      1
      
      byte dns[] = { 8, 8, 8, 8 };
      1. Вот такую ошибку выдает
        error: invalid operands of types ‘void’ and ‘int’ to binary ‘operator==’
        invalid operands of types ‘void’ and ‘int’ to binary ‘operator==’

          1. Ошибка та же самая.
            Код полностью скопировал с минимальными правками (мак свой поставил и исправил пин ENC28J60 на 10 вот так:

            // Пробуем подключиться по Ethernet до тех пор пока это не удастся
            do
            {
            delay(1000);
            } while (Ethernet.begin(mac,10) == 0);

            Компилятор ругается так:

            sketch_nov23a.ino: In function ‘void setup()’:
            sketch_nov23a.ino:62:38: error: invalid operands of types ‘void’ and ‘int’ to binary ‘operator==’

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

          2. Видимо библиотека ENC28J60 не поддерживает проверку на правильность получения сетевых данных, вот и не проходит условие. Оставьте только Ethernet.begin(mac,10); вместо всех вышеприведённых вами строк.
            Кстати, а что означает параметр 10?

    1. Но лучше передавать данные дополнительно на какой-нибудь хостинг, а там уже отображать веб-страничку. Тогда можно будет увидеть погоду не только дома. Лично я так и делаю)

  35. Может есть у кого полный скетч от Алексей Парасоцкий для станции с индикатором от Нокии? Вышлите пожалуйста на vovan_a_21(собака)mail333.com

  36. Спасибо, письмо получил, но компилироваться не хочет:

    Meteostation_v1_1nokia_R.ino:32:8: error: ‘PCD8544’ does not name a type
    Meteostation_v1_1nokia_R.ino: In function ‘void setup()’:
    Meteostation_v1_1nokia_R.ino:52:1: error: ‘lcd’ was not declared in this scope
    Meteostation_v1_1nokia_R.ino: In function ‘void loop()’:
    Meteostation_v1_1nokia_R.ino:272:7: error: ‘lcd’ was not declared in this scope

  37. Да, я уже понял.
    Но полезли новые ошибки:
    Meteostation_2_1_LCD:49: error: ‘char* itoa(int, char*, int)’ redeclared inline without ‘gnu_inline’ attribute
    void setup() {
    ^
    In file included from E:\Radio\Soft\Arduino\arduino-1.6.6\hardware\arduino\avr\cores\arduino/Arduino.h:23:0,
    from sketch\Meteostation_2_1_LCD.ino.cpp:1:
    e:\radio\soft\arduino\arduino-1.6.6\hardware\tools\avr\avr\include\stdlib.h:418:7: error: ‘char* itoa(int, char*, int)’ previously defined here
    char *itoa (int __val, char *__s, int __radix)
    ^
    exit status 1
    ‘char* itoa(int, char*, int)’ redeclared inline without ‘gnu_inline’ attribute

    1. С этим тоже разобрался. Но на экране ничего нет. После ресета появляется надпись System load, бегут точки и все. Дисплей очищается и больше ничего не показывает. Будет ли показывать дисплей, если сетевой кабель не подключен?

  38. Добрый вечер.
    При компиляции скетча на программе Arduino 1.6.6 появляется ошибка:

    Arduino: 1.6.6 (Windows 7), Плата:»Arduino/Genuino Uno»

    WARNING: Category » in library OneWire is not valid. Setting to ‘Uncategorized’
    Nar_Mon2.1:51: error: ‘char* itoa(int, char*, int)’ redeclared inline without ‘gnu_inline’ attribute

    void setup() {

    ^

    In file included from C:\Temp\arduino-1.6.6-windows\arduino-1.6.6\hardware\arduino\avr\cores\arduino/Arduino.h:23:0,

    from sketch\Nar_Mon2.1.ino.cpp:1:

    c:\temp\arduino-1.6.6-windows\arduino-1.6.6\hardware\tools\avr\avr\include\stdlib.h:418:7: error: ‘char* itoa(int, char*, int)’ previously defined here

    char *itoa (int __val, char *__s, int __radix)

    ^

    exit status 1
    ‘char* itoa(int, char*, int)’ redeclared inline without ‘gnu_inline’ attribute

    Что посоветуете?

      1. Спасибо, всё заработало! НО при отключении питания и подаче вновь Ардуино UNO запускается, и категорически отказывается соединяться по Ethernet c роутером. Лечится только путем нажатия кнопки RESET. Нажал, и соединилась за несколько секунд…
        Посоветуйте пож. решение проблемы.

  39. Подскажите пожалуйста как настроить роутер, чтобы метеостанция работала без компа через роутер?

  40. Спасибо за проект. Супер. Добавил еще один DHT22, BH1750 и датчик дыма MQ-2 на FC-22 (подключил через аналоговый сигнал). Все работает. Показания датчика дыма изменяются аналогово на сайте narodmon.ru. Решил датчик дыма переключить на цифру. Благо на сайте народного мониторинга есть выбор параметра датчика «сухой контакт». Но данные не отправляются.
    Вот код для отправки аналоговых данных:
    #if (Gaz)
    int GazLevel = analogRead(GazPin); //Чтение датчика дыма с А0
    strcat(replyBuffer, «&»);
    strcat(replyBuffer, macbuf);
    strcat(replyBuffer, «Gaz=»);
    g_100 = GazLevel*100; //po umolchaniju 100
    Whole = g_100 / 100;
    Fract = g_100 % 100;
    itoa(Whole, temp);
    strcat(replyBuffer, temp);
    #endif

    для цифры переключил на цифровой вход и изменил этот код:
    #if (Gaz)
    int GazVal = digitalRead(GazPin); //Чтение датчика дыма с D5
    strcat(replyBuffer, «&»);
    strcat(replyBuffer, macbuf);
    strcat(replyBuffer, «G2=»);
    //g_100 = ledVal*1; //po umolchaniju 100
    //Whole = g_100 / 100;
    //Fract = g_100 % 100;
    itoa(Whole, temp);
    strcat(replyBuffer, temp);

    //#endif
    Где-то ошибка. Данные не отправляются только с этого датчика

  41. Выкладываю версию с добавленными датчиками:
    Добавлен датчик освещения BH1750 (добавил Виталий Коробов)
    Добавлены второй датчик температуры и влажности DHT22, газа(дыма) MQ,
    влаги на FC-22 и напряжения(Voltage Sensor Module)
    https://yadi.sk/d/bz4wV8OYoVJGm

  42. Добавил такой код
    lcd.init();
    lcd.backlight();
    lcd.print(«T=»);
    if (SignBit) lcd.print(«-«);
    lcd.setCursor(3,0);
    lcd.print(Whole);
    lcd.print(«.»);
    lcd.print(Fract);
    lcd.setCursor(9,0);
    lcd.print(«H=»);
    lcd.print(Humidity);
    lcd.setCursor(0,1);
    lcd.print(«P=»);
    lcd.print(Pressure/133.3,1);
    lcd.print(«mm/Hg»);
    lcd.home();
    delay(5000);

    На экране стал показывать ерунду, на скетче автора статьи показывает правильно, подскажите что исправить? И если не сложно возможно ли сделать вывод информации со всех датчиков, что бы каждые 5 секунд по несколько параметров выводилось поочередно? Например
    Температура
    c ds18b20+ Влажность(Dht 22) и давление()
    через 5 секунд
    Влажность почвы и CO2
    Через 5 сек
    Вольтаж и Интенсивность света LX
    Спасибо

    1. Добавил lcd1602. Показания с датчиков меняются каждые 2 сек. Есть недостаток: передача данных на сайт narodmon идет нестабильно. Я думаю, что это связано с задержкой delay(). Лучше использовать 4-х строчный дисплей lcd 20×4 или Nokia 5110(код опубликовал Игорь 1 апреля 2015г. Смотри выше) и выводить туда самую необходимую информацию. Я проверил оба варианта. С 4-х строчным проблем нет.
      Вот код для lcd1602:
      добавляем библиотеку, символ градуса и адрес с размерностью (это в начале кода):

      1
      2
      3
      4
      
      #include 
      byte degree[8] =         // Битовая маска символа градуса
      {  B00111,  B00101,  B00111,  B00000,  B00000,  B00000,  B00000,};    
      LiquidCrystal_I2C lcd(0x27,16,2);   // Задаем адрес и размерность дисплея

      Далее после строчки

      void setup() {

      вставляем код:

      1
      2
      3
      
          lcd.init();                       // Инициализация lcd  
          lcd.backlight();                  // Включаем подсветку
          lcd.createChar(1, degree);        // Создаем символ под номером 1

      Далее после строчек

      1
      2
      
        //храним последнее состояние подключения
        lastConnected = client.connected();

      вставляем код:

      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
      
          //------------------------- отправляем данные на lcd 1602
          lcd.setCursor ( 0, 0 ); // устанавливаем курсор в 0 ячейку 0 строки
          lcd.print("Lux=");     // Выводим текст
          lcd.print(lightMeter.readLightLevel()); // считываем данные с датчика освещенности 
       
          lcd.setCursor ( 10, 0 ); // устанавливаем курсор в 10 ячейку 0 строки
          lcd.print("Vl=");     // Выводим текст
          lcd.print(!digitalRead(vlagaPin)); //считываем данные с датчика влаги(дождя) с инвертированием
       
          lcd.setCursor ( 0, 1 ); // устанавливаем курсор в 1 ячейку 1 строки
          lcd.print("CO=");     // Выводим текст
          lcd.print(analogRead(GazPin)); //считываем данные с датчика газа
       
          lcd.setCursor ( 10, 1 ); //  устанавливаем курсор в 10 ячейку 1 строки
          lcd.print("V=");     // Выводим текст
          lcd.print(analogRead(VoltPin)); //считываем данные с датчика напряжения
       
          delay(2000); //задержка 2 сек.
       
          lcd.clear(); //очистка экрана (при очистке курсор устанавливается в ноль, поэтому следующий пункт необязателен.)
          lcd.setCursor ( 0, 0 ); // устанавливаем курсор в 0 ячейку 0 строки
          lcd.print("H1=");     // Выводим текст
          lcd.print(int(dht.readHumidity())); //считываем данные с датчика влажности DHT, целая часть
          lcd.print("%");    // Выводим текст проценты %
       
          lcd.setCursor ( 7, 0 ); // устанавливаем курсор в 7 ячейку 0 строки
          lcd.print("T1=");     // Выводим текст
          lcd.print(dht.readTemperature()); //считываем данные с датчика температуры DHT
          lcd.setCursor ( 14, 0 ); //  устанавливаем курсор в 14 ячейку 0 строки
          lcd.print("\1C");    // Выводим текст, со знаком градуса
       
          lcd.setCursor ( 0, 1 ); // устанавливаем курсор в 0 ячейку 1 строки
          lcd.print("H2=");     // Выводим текст
          lcd.print(int(dht2.readHumidity())); //считываем данные с датчика влажности DHT2, целая часть
          lcd.print("%");    // Выводим текст проценты %
       
          lcd.setCursor ( 7, 1 ); // устанавливаем курсор в 9 ячейку 3 строки
          lcd.print("T2=");     // Выводим текст
          lcd.print(dht2.readTemperature()); //считываем данные с датчика температуры DHT2
          lcd.setCursor ( 14, 1 ); //  устанавливаем курсор в 14 ячейку 1 строки
          lcd.print("\1C");    // Выводим текст, со знаком градуса
       
          delay(2000);//задержка 2 сек.
       
          lcd.clear();//очистка экрана (при очистке курсор устанавливается в ноль, поэтому следующий пункт необязателен.)
          lcd.setCursor ( 0, 0 ); // устанавливаем курсор в 9 ячейку 1 строки
          lcd.print("P=");     // Выводим текст
          lcd.print(Pressure/133.3);//считываем данные давления с датчика BMP180
          lcd.print("mmHg");// Выводим текст
       
          lcd.setCursor(0, 1);// устанавливаем курсор в 0 ячейку 1 строки
          lcd.print("T3=");     // Выводим текст
          lcd.print(Temperature*0.01);//считываем данные температуры с датчика BMP180
          lcd.print("\1C");// Выводим текст, со знаком градуса
       
          delay(2000);//задержка 2 сек.
          lcd.clear();//очистка экрана
        //------------------------------------

      Вот ссылка на весь код:
      https://yadi.sk/i/40x-biK1oiWKW

      1. Спасибо большое, но почему то температуру от bmp 180 выводит: -2147………,…. не понятку, на народный мониторин данные летят нормально, давление выводит на экран нормально

      2. не получаеться перевести датчик влаги в аналоговый вывод на народный мониторинг и экран lcd, делал по аналогии с датчиком mq2

        1. как можно добавить в данный скетч вот это:
          // преобразовываем аналоговое 10-битное значение
          // датчика влажности почвы в диапазон (от 0% до 100%)
          moisture = map(moisture, 0, 1023, 0, 100);
          // преобразовываем аналоговое 10-битное значение
          // датчика уровня CO2 в диапазон (от 0ppm до 8000ppm)
          mq2 = map(mq2, 0, 1023, 0, 8000);
          // преобразовываем аналоговое 10-битное значение
          // датчика уровня освещённости в диапазон (от 0Lx до 2000Lx)
          light = map(light, 0, 1023, 2000, 0);
          И еще без подключенного интернета данные на экран не выводятся

  43. Попробовал запитать ардуину со всеми датчиками от 12 вольт, первые 5 секунд работает нормально, потом затухает lcd 1602, светится очень тускло и информация никакая не выводиться, от 5 вольт работает нормально, почему так может быть?

    1. Кроме напряжения ещё есть такой параметр, как сила тока. Какой максимальный ток может выдать БП 12В? И ещё: пощупайте стабилизатор на ардуине, если вы питаете дисплей от неё. Не горячий ли он?

        1. Должно хватать с большим запасом. Если есть мультиметр, замерьте напряжение на выходе БП, на контактах питания дисплея, на ардуине. Где-то просадка.

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

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

  44. Если взять это http://www.aliexpress.com/item/A22-1x-design-20A-range-Current-Sensor-Module-ACS712-for-Arduino-module-ACS712T-T1594-P/32306905154.html и это http://ru.aliexpress.com/item/Active-Single-Phase-Voltage-Transformer-Module-AC-Output-Voltage-Sensor-for-Arduino-Mega-FZ1440/32310651399.html можно легко коттролнровать ток, напряжение и мощность в сети.
    Здесь скеч по ним:
    // EmonLibrary examples openenergymonitor.org, Licence GNU GPL V3
    #include «EmonLib.h» // Include Emon Library
    EnergyMonitor emon1; // Create an instance
    void setup()
    {
    Serial.begin(9600);
    emon1.voltage(2, 234.26, 1.7); // Voltage: input pin, calibration, phase_shift
    emon1.current(1, 111.1); // Current: input pin, calibration.
    }
    void loop()
    {
    emon1.calcVI(20,2000); // Calculate all. No.of half wavelengths (crossings), time-out
    emon1.serialprint(); // Print out all variables (realpower, apparent power, Vrms, Irms, power factor)
    float realPower = emon1.realPower; //extract Real Power into variable
    float apparentPower = emon1.apparentPower; //extract Apparent Power into variable
    float powerFActor = emon1.powerFactor; //extract Power Factor into Variable
    float supplyVoltage = emon1.Vrms; //extract Vrms into Variable
    float Irms = emon1.Irms; //extract Irms into Variable
    }
    Прошу совета — как правильно этот скеч вставить в «метеостанцию». Спасибо.

    1. Датчик тока ACS712 имеет один выход, с которого считываем силу тока. Поэтому прописать его в коде можно аналогично датчику напряжения.
      Чувствительность датчиков:
      •ACS712 5А: 185 мВ/А
      •ACS712 20А: 100 мВ/А
      •ACS712 30А: 66 мВ/А
      При отключенной нагрузке напряжение на выходе датчика составляет 2,5 в.
      Поэтому нужно изменить коэффициент пересчета для разных датчиков (5А, 20А или 30А).

      int AmperLevel = 0.0264*analogRead(AmperPin) -13.51; //для 5A датчика тока ACS712
      //int AmperLevel = 0.19*analogRead(AmperPin) -25; //для 20A датчика тока ACS712
      //int AmperLevel = 0.044*analogRead(AmperPin) -3.78; //для 30A датчика тока ACS712

      Наверное для измерения напряжения, тока и мощности можно использовать и библиотеку «EmonLib.h». В свободное время подумаю.
      Да, в коде видно, что ток и напряжение задаются на разные пины (на 1 и 2).
      emon1.voltage(2, 234.26, 1.7); // Voltage: input pin, calibration, phase_shift
      emon1.current(1, 111.1); // Current: input pin, calibration.
      И если я не ошибаюсь, нужно использовать два датчика (напряжения и тока). Так как ACS712 имеет один выход.

      1. Пришёл датчик сетевого напряжения http://ru.aliexpress.com/item/Active-Single-Phase-Voltage-Transformer-Module-AC-Output-Voltage-Sensor-for-Arduino-Mega-FZ1440/32310651399.html
        Удобная калибровка на подстройке. Serialprint показывает полную мощность (S), активную мощность (P), напряжение, ток и коэффициент мощности. Точность – сотые. Жду датчика тока.

  45. По проблеме зависания с отправкой показаний — скорее всего данные теряются при плохой линии связи. Для себя решил установкой шилда с реле и принудительным самосбросом устройства….

    Ниже код, думаю понять не сложно (мне надо только температуру с DSок снимать):

    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
    
    #include                                                                   // библиотеки для работы с шилдом на W5100, Ethernet и датчиками температуры типа DS18...
    #include 
    #include 
     
    #define DS18B20_PIN A0                                                            // пин подключения датчика температуры DS18...
    #define RELAY_PIN 7                                                               // пин шилда с реле для циклического самосброса (реле замыкает пины GND и Reset и у шилда на W5100!!!)
    #define device_name "#WEATHER-GUB002"                                             // символ # + имя. Имя устройства должно быть уникальным - видно на карте!!! Состоит из 12-18 символов A-Z и 0-9 иногда разделенных - или :
     
    byte mac[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };                              // MAC-адрес шилда на W5100 для получения IP адреса по DHCP
    const unsigned long sendInterval = 600000;                                        // интервал между отправками данных в миллисекундах (здесь 10 минут), но не менее 5 минут - не будет принимать сервер народного мониторинга
    const unsigned long resetInterval = 1200000;                                      // интервал между самосбросами устройства в миллисекундах (здесь 20 минут) - но не менее 5 минут - не будет принимать сервер народного мониторинга
    const unsigned long sendPause = 30000;                                            // время от момента получения IP адреса по DHCP до первой попытки отправить данные в миллисекундах (здесь 30 секунд)
     
    char server[] = "narodmon.ru";                                                    //  адрес сервера народного мониторинга по DNS
     
    unsigned long lastConnectionTime = 0;                                             // время последней передачи данных
    boolean lastConnected = false;                                                    // состояние подключения
    unsigned long currentTime = 0;                                                    // время от момента включения или сброса устройства
     
    char replyBuffer00[80];                                                           // массивы для формирования информации для отправки
    char replyBuffer01[80];                                                           // если есть еще датчики - копируем строку и меняем в переменной replyBuffer.. число
     
    byte addr00[8];                                                                   // массивы для хранения адресов датчиков
    byte addr01[8];                                                                   // если есть еще датчики - копируем строку и меняем в переменной addr.. число
     
    byte res = 0x20;                                                                  // разрешение датчика температуры 0x60-12 бит, 0x40-11 бит, 0x20-10 бит, 0x00-9 бит
     
    int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;                   // вспомогательные и помежуточные переменные
    char replyBuffer[80];  
    byte addr[8]; 
    char CurTemp[6];
    byte i;
    byte present = 0;
    char temp[3];
     
    EthernetClient client;                                                            
    OneWire ds(DS18B20_PIN);
     
     
     
    void setup()
    {
      pinMode(RELAY_PIN, OUTPUT);                                                     // настройка вывода с реле для самосброса
      digitalWrite(RELAY_PIN, LOW);
     
      ds.search(addr00);                                                              // поиск датчиков
      ds.search(addr01);                                                              // если есть еще датчики - копируем строку и меняем в переменной addr.. число
     
      do                                                                              // получение IP адреса по DHCP, до тех пор пока это не удастся (здесь каждые 5 секунд)
      {
        delay(5000);
      }
      while (Ethernet.begin(mac) == 0);                                               
      lastConnectionTime = millis() - sendInterval + sendPause;
    }
     
     
     
    void loop()
    {
      if (client.available())                                                         // если вдруг приходят какие-то данные, то просто читаем их и игнорируем, чтобы очистить буфер
      {
        client.read();
      }
     
      if (!client.connected() &amp;&amp; lastConnected)
      {
        client.stop();
      }
     
      if (!client.connected() &amp;&amp; (millis() - lastConnectionTime &gt; sendInterval))      // если не подключены и прошло определённое время, то делаем замер, переподключаемся и отправляем данные
      {
     
    //********************** Первый датчик ************************************
        for (i = 0; i &lt; 8; i++)
        {
          addr[i] = addr00[i];
        }
     
        getTemperature();
        itos(Whole, temp);
        makeString();
     
        for (i = 0; i &lt; 80; i++)
        {
          replyBuffer00[i] = replyBuffer[i];
        }
    //*************************************************************************
     
    //********************* Второй датчик *************************************
        for (i = 0; i &lt; 8; i++)
        {
          addr[i] = addr01[i];
        }
     
        getTemperature();
        itos(Whole, temp);
        makeString();
     
        for (i = 0; i = resetInterval)                                             // дернуть реле для самосброса устройства через сколько-то времени с начала включения, без отсылки данных
        {           
          digitalWrite(RELAY_PIN, HIGH);
        }
     
        else
        {
        client.println(device_name);                                                  // формат посылки: #имя#код датчика#температура#код датчика#температура...## (конец передачи)
        client.println(replyBuffer00);
        client.println(replyBuffer01);                                                // если есть еще датчики - копируем строку и меняем в переменной replyBuffer.. число
        client.print("##");
     
        lastConnectionTime = millis();    
        }
      }
     
      else
      {
        client.stop();
      }
    }
    //*****************************************************************************************************************
     
     
     
    //************************************** Функция перевода int в string ********************************************
    void itos(int n, char bufp[3])
    {
      char buf[3] = {'0', '0', '\0'};
      int i = 1;
     
      while (n &gt; 0) 
      {
        buf[i] = (n % 10) + 48;
        i--;
        n /= 10;
      }
     
      for (i = 0; i &lt; 3; i++)
        bufp[i] = buf[i];
    }
    //*****************************************************************************************************************
     
     
     
    //****************************************** Запрос на датчик *****************************************************
    void getTemperature (void)
    {
      ds.reset();                                                                     // конфигурирование датчика - почему-то некоторые DS-ки не сохраняют свое разрешение в EEPROM
      ds.select(addr);                                                                // запись в EEPROM не производится, чтобы увеличить ресурс датчика
      ds.write(0x4E);
      ds.write(0xFF);
      ds.write(0xFF);
      ds.write(res);                                                                    
     
      delay(750);                                                                     // пауза после конфигурирования
     
      ds.reset();
      ds.select(addr);
      ds.write(0x44);                                                                 // команда датчику измерить температуру. При разрешении 12 бит, должна быть пауза не менее 750 мс. Питание НЕ паразитное
     
      delay(750);
     
      present = ds.reset();
     
      ds.select(addr);
      ds.write(0xBE);                                                                 // запрос результата измерения температуры из датчика
     
      LowByte = ds.read ();
      HighByte = ds.read ();
     
      TReading = (HighByte &lt;= 0; k--) 
      {
        int b1 = addr[k] / 16;
        int b2 = addr[k] % 16;
        char c1[2], c2[2];
     
        if (b1 &gt; 9) c1[0] = (char)(b1 - 10) + 'A';
        else c1[0] = (char)(b1) + '0';
     
        if (b2 &gt; 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, ".");
     
      itos(Fract, temp);
     
      strcat(replyBuffer, temp);
      strcat(CurTemp, temp);
    }
    //*****************************************************************************************************************
  46. Ой, да, спасибо за корректировку — подзабыл. Однако не страшно — имя и МАС тестовые.
    Забыл сказать, тут по ТСР отправка на сервер идет.

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

      <pre>

      или использовать pastebin

  47. Помогите пожалуйста!!! Мучаюсь уже месяц и не чего не получается. Использую модуль ENC28J60 и Arduino UNO. Делаю все как описано в этой статье http://sagis.ru/blog/?p=8 все работает стабильно.
    Оставляю подключение ethernet shield enc28j60 к UNO как в первой статье и использую скетч данный по этой ссылке http://pastebin.com/SYHe9U6W . Подключаю температурный датчик и датчик влажности кроме барометра все как в скетче. При подключении к роутеру shield enc28j60 в сетевых подключениях его не видно, соответственно не какие показания не передаются. Помогите пожалуйста в чем причина!

      1. Спасибо что обратили внимание на мой вопрос. В первом варианте скетч только для температурного датчика. А я пытаюсь еще подключить и датчик DHT11 согласно ссылке на скетч во втором варианте.

        1. Вот прямо на этой странице, над комментариями, скетч и для датчика влажности и для датчика давления. Переделывается он думаю аналогично.

          1. Ваш скетч по версии 2.1 я пробывал переделывать как сказанно по этой ссылке http://sagis.ru/blog/?p=8 для модуля ENC28j60. Но при подключении к роутеру его также не видно в сетевых подключениях. Не пойму в чем причина.

          2. Попробуйте заменить строки

            59
            60
            61
            62
            
            do 
              {
                delay(1000);
              } while (Ethernet.begin(mac) == 0);

            на

            59
            60
            
            IPAddress myIP(192,168,1,5);
            Ethernet.begin(mac,myIP);
  48. Зделал как Вы сказали в настройках сетеввх подкьючениях роутера сетевой модуль ENC28j60 стал виден. Данный на народный мониторинг с датчиков отправляются. Но соединение крайне не стабильно и роутер не видет модуль примерно каждые 15-20 мин. Затем опять все работает. Как Вы думаете что можно в этом случае зделать?

  49. Сейчас в качестве источника питания преобразователь MB-102 с двойным питанием 5В и 3.3В. Промерял еще тестером напряжение как заявлено. Проблемы с питанием по идеи можно исключить. Обратил внимание что в сетевых подключениях роутера имя сетевого модуля ENC28j60 не отображается. Потестировал еще разрывы сетевого соединения модуля с роутером продолжаются хаотично. Потом подключение само восстанавливается. Подскажите что можно еще сделать?

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

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