Парсинг XML. Прогноз погоды

vitalikost
Offline
Зарегистрирован: 28.11.2014

Добрый день! Решил сделать метеостанцию с прогнозом погоды. 

Для получения данных был выбран сайт http://www.eurometeo.ru/. На данном сайте есть мой город, а также самое главное бесплатный экспорт в XML.

Для реализации у меня есть Arduino Mega и enc28j60.

 

Для реализации была выбрана библиотека: https://github.com/ntruchsess/arduino_uip

Данный пример отлично работает с штатной библиотекой и модулем W5100, для использования заменить строку в коде: #include <UIPEthernet.h> на #include <Ethernet.h>.

Данные кроме ком порта решил визуализировать на LCD1602(что было по рукой).

Результат творчества. 

 

Araris
Offline
Зарегистрирован: 09.11.2012

vitalikost пишет:

Для получения данных был выбран сайт http://www.eurometeo.ru/. На данном сайте есть мой город, а также самое главное бесплатный экспорт в XML.

Ай спасибо !

vitalikost
Offline
Зарегистрирован: 28.11.2014

Вот резултат роботы, жрет дофига озу. Может как-то оптимизировать? 

Araris
Offline
Зарегистрирован: 09.11.2012

 Сейчас скетч построен так, что сначала весь ответ сайта полностью принимается в String HTTP_req;, а потом парсится и выводится на экран.

 Оптимизировать можно, если парсить прямо в процессе приёма, тогда размеры HTTP_req (и объём памяти, ей занимаемый) можно будет значительно сократить.

 В идеале стоило бы отказаться от использования String в пользу char-массивов.

vitalikost
Offline
Зарегистрирован: 28.11.2014

Что финня, постоянно в ребут уходит: упростил код:

Результат роботы:

01Free Ram - 6207
02connecting...
03connection failed
04---------------
05HTTP/1.1 200 OK
06ServerFree Ram - 6207
07connecting...
08connection failed
09---------------
10HTTP/1.1 200 OK
11ServerFree Ram - 6207
12connecting...
13connection failed
14---------------
15HTTP/1.1 200 OK
16ServerFree Ram - 6207
17connecting...
18connection failed
19---------------
20HTTP/1.1 200 OK
21ServerFree Ram - 6207
22connecting...
23connection failed
24---------------
25HTTP/1.1 200 OK
26ServerFree Ram - 6207
27connecting...
28connection failed
29connection failed
30---------------
31HTTP/1.1 200 OK
32ServerFree Ram - 6207
33connecting...
34connection failed
35---------------
36HTTP/1.1 200 OK
37ServerFree Ram - 6207
38connecting...
39---------------
40HTTP/1.1 200 OK
41ServerFree Ram - 6207
42connecting...
43connection failed
44---------------
45HTTP/1.1 200 OK
46ServerFree Ram - 6207
47connecting...
48---------------
49HTTP/1.1 200 OK
50ServerFree Ram - 6207
51connecting...
52connection failed
53---------------
54HTTP/1.1 200 OK
55ServerFree Ram - 6207
56connecting...
57---------------
58HTTP/1.1 200 OK
59Server

 

vitalikost
Offline
Зарегистрирован: 28.11.2014

Разобрался, надо размер буфера указать char HTTP_req[4230]= "";

Это размер пакета данных, буду дробить на 500, и анализировать, посмотрим что с этого получится. 

vitalikost
Offline
Зарегистрирован: 28.11.2014

char-массивов пока еще не разобрался, точнее, блоками выводить получилось, а вот с поиском в массиве не очень. Решил оптимизировать тока роботу со строками.  Убрав все лишнее, вывод только в консоль:

Резултат роботы:

01Free Ram - 5429
02connecting...
03---------------
04Loading.....
052016-08-25 05:00:00, t = 17.40, h = 47
062016-08-25 11:00:00, t = 22.55, h = 36
072016-08-25 17:00:00, t = 23.17, h = 29
082016-08-25 23:00:00, t = 18.96, h = 26
092016-08-26 05:00:00, t = 16.55, h = 24
102016-08-26 11:00:00, t = 23.04, h = 18
112016-08-26 17:00:00, t = 24.15, h = 20
122016-08-26 23:00:00, t = 18.67, h = 23
132016-08-27 05:00:00, t = 16.34, h = 32
142016-08-27 11:00:00, t = 24.60, h = 34
152016-08-27 17:00:00, t = 26.56, h = 32
162016-08-27 23:00:00, t = 20.84, h = 33
17End Loading.....
18 
19---------------
20disconnecting
21==============================
22Free Ram - 4097
23==============================

 

vitalikost
Offline
Зарегистрирован: 28.11.2014

Следал хранение данных в структуре:

1struct meteo
2{
3  String Date_time;
4  float t;
5  int h;
6}
7add_meteo[12];

Также подробно описана структура файла для парсинга:

Пока проект заканчиваю, возможно попозже добавлю визуализацию данных(1602 маловат для этого):

Результат:

 

01Free Ram - 5178
02connecting...
03---------------
04Loading.....
052016-08-25 05:00:00, temperature = 17.40, humidity = 47
062016-08-25 11:00:00, temperature = 22.55, humidity = 36
072016-08-25 17:00:00, temperature = 23.17, humidity = 29
082016-08-25 23:00:00, temperature = 18.96, humidity = 26
092016-08-26 05:00:00, temperature = 16.55, humidity = 24
102016-08-26 11:00:00, temperature = 23.12, humidity = 16
112016-08-26 17:00:00, temperature = 24.25, humidity = 19
122016-08-26 23:00:00, temperature = 18.74, humidity = 23
132016-08-27 05:00:00, temperature = 16.34, humidity = 32
142016-08-27 11:00:00, temperature = 24.60, humidity = 34
152016-08-27 17:00:00, temperature = 26.56, humidity = 32
162016-08-27 23:00:00, temperature = 20.84, humidity = 33
17End Loading.....
18 
19---------------
20disconnecting
21==============================
22Free Ram - 3533
23==============================
242016-08-25 05:00:00, t = 17.40, h = 47
252016-08-25 11:00:00, t = 22.55, h = 36
262016-08-25 17:00:00, t = 23.17, h = 29
272016-08-25 23:00:00, t = 18.96, h = 26
282016-08-26 05:00:00, t = 16.55, h = 24
292016-08-26 11:00:00, t = 23.12, h = 16
302016-08-26 17:00:00, t = 24.25, h = 19
312016-08-26 23:00:00, t = 18.74, h = 23
322016-08-27 05:00:00, t = 16.34, h = 32
332016-08-27 11:00:00, t = 24.60, h = 34
342016-08-27 17:00:00, t = 26.56, h = 32
352016-08-27 23:00:00, t = 20.84, h = 33
36==============================
372016-08-25 05:00:00, t = 17.40, h = 47
382016-08-25 11:00:00, t = 22.55, h = 36
392016-08-25 17:00:00, t = 23.17, h = 29
402016-08-25 23:00:00, t = 18.96, h = 26
412016-08-26 05:00:00, t = 16.55, h = 24
422016-08-26 11:00:00, t = 23.12, h = 16
432016-08-26 17:00:00, t = 24.25, h = 19
442016-08-26 23:00:00, t = 18.74, h = 23
452016-08-27 05:00:00, t = 16.34, h = 32
462016-08-27 11:00:00, t = 24.60, h = 34
472016-08-27 17:00:00, t = 26.56, h = 32
482016-08-27 23:00:00, t = 20.84, h = 33
492016-08-25 05:00:00, t = 17.40, h = 47
502016-08-25 11:00:00, t = 22.55, h = 36
512016-08-25 17:00:00, t = 23.17, h = 29
522016-08-25 23:00:00, t = 18.96, h = 26
532016-08-26 05:00:00, t = 16.55, h = 24
542016-08-26 11:00:00, t = 23.12, h = 16
552016-08-26 17:00:00, t = 24.25, h = 19
562016-08-26 23:00:00, t = 18.74, h = 23
572016-08-27 05:00:00, t = 16.34, h = 32
582016-08-27 11:00:00, t = 24.60, h = 34
592016-08-27 17:00:00, t = 26.56, h = 32
602016-08-27 23:00:00, t = 20.84, h = 33

 

vitalikost
Offline
Зарегистрирован: 28.11.2014

Итак идем дальше, есть 2.4 tft lcd shield 0x9325, и библиотека MCUFRIEND_kbv. Проверил данный shield на Меге и Уно. Работает без проблем, и без правки библиотек. СД карта на Меге не завелась, так как не соответствуют пины, ну мне пока и не нужно. Пока только визуализировано температуру, в дальнейшем задействую тач, и возможность строить гистограмму не только по температуре, а также и по другим параметрам (влажность, давление, осадки, скорость ветра, облачность). 

Видео : https://yadi.sk/i/HZXLU4QCurniS

 

misha_1006
Offline
Зарегистрирован: 27.06.2020

почему у меня ошибка в    client.println("Host: <a href="http://www.eurometeo.ru" title="www.eurometeo.ru"" rel="nofollow">www.eurometeo.ru"</a>)

 

unable to find string literal operator 'operator""http' with 'const char [15]', 'unsigned int' arguments

помогите если можете

 

misha_1006
Offline
Зарегистрирован: 27.06.2020

почему у меня ошибка в    client.println("Host: <a href="http://www.eurometeo.ru" title="www.eurometeo.ru"" rel="nofollow">www.eurometeo.ru"</a>)

 

unable to find string literal operator 'operator""http' with 'const char [15]', 'unsigned int' arguments

помогите если можете

sadman41
Offline
Зарегистрирован: 19.10.2016

Кавычки внутри кавычек необходимо экранировать символом \

vitalikost
Offline
Зарегистрирован: 28.11.2014
 client.println("Host: <a href="http://www.eurometeo.ru" title="www.eurometeo.ru"" rel="nofollow">www.eurometeo.ru"</a>);

заменить "client.println("Host: www.eurometeo.ru");"

vitalikost
Offline
Зарегистрирован: 28.11.2014

тут можно найти свой город. 

https://eurometeo.ru/ukraina/cherkaska-oblast/cherkasi/export/

Мой город уже в статистику не попадает, а свой проверяйте.

добавлено: По ходу сайт уже давно статистику не обновляет по всем городам