Следующая версия | Предыдущая версия |
products:laboratory_iot_c:exp69 [2024/12/16 15:07] – создано labuser30 | products:laboratory_iot_c:exp69 [2024/12/16 15:29] (текущий) – [Программный код эксперимента] labuser30 |
---|
==== Программный код эксперимента ==== | ==== Программный код эксперимента ==== |
| |
<file python Exp69.py[enable_line_numbers="2", start_line_numbers_at="1"]> | <file arduino Exp69.ino[enable_line_numbers="2", start_line_numbers_at="1"]> |
from machine import Pin | #include <ESP8266WiFi.h> |
import network | #include <WiFiClient.h> |
import gc | #include <ESP8266HTTPClient.h> |
import time | #include <ArduinoJson.h> |
import socket | |
import json | |
| |
_init() | #define WIFI_NAME "WiFi_name" |
gc.collect() | #define WIFI_PASSWORD "WiFi_pass" |
| |
| String httpGet(String url) { |
| WiFiClient client; |
| HTTPClient http; |
| String data = ""; |
| |
wlan_id = "WiFi_name" | if (http.begin(client, url)) { |
wlan_pass = "WiFi_pass" | Serial.println("[HTTP] GET"); |
| int httpCode = http.GET(); |
| if (httpCode > 0) { |
wlan = network.WLAN(network.STA_IF) | Serial.printf("[HTTP] GET code: %d\n", httpCode); |
wlan.active(True) | if (httpCode == HTTP_CODE_OK) { |
wlan.connect(wlan_id, wlan_pass) | data = http.getString(); |
time.sleep(1) | } else { |
| Serial.printf("[HTTP] GET failed, error: %s\n", http.errorToString(httpCode).c_str()); |
| } |
while wlan.isconnected() == False: | http.end(); |
pass | } else { |
| Serial.println("[HTTP] Unable to connect"); |
print('Device IP:', wlan.ifconfig()[0]) | } |
| } |
| return data; |
| } |
def http_get(url, port=80): | |
_, _, host, path = url.split('/', 3) | void setup() { |
addr = socket.getaddrinfo(host, port)[0][-1] | Serial.begin(9600); |
| Serial.println(); |
s = socket.socket() | |
s.connect(addr) | Serial.print("Connecting to WiFi"); |
s.send(bytes('GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n' % (path, host), 'utf8')) | WiFi.mode(WIFI_STA); |
| WiFi.begin(WIFI_NAME, WIFI_PASSWORD); |
text = '' | while (WiFi.status() != WL_CONNECTED) { |
| Serial.print("."); |
| delay(500); |
| } |
| Serial.println(); |
| Serial.println("WiFi connected"); |
| Serial.print("IP address: "); |
| Serial.println(WiFi.localIP()); |
| |
while True: | String API_key = "YourApiKey"; |
data = s.recv(100) | String city_name = "Moscow"; |
if data: | |
text += str(data, 'utf8') | |
pass | |
else: | |
a = text.split('\r\n\r\n', 2)[1] | |
return a | |
break | |
| |
| String json_data = httpGet("http://api.weatherbit.io/v2.0/current?city=" + city_name + "&key=" + API_key); |
| Serial.println(json_data); |
| |
apiKey = 'YourApiKey' | JsonDocument json_doc; |
cityName = 'Moscow,RU' | deserializeJson(json_doc, json_data); |
| float temp = json_doc["data"][0]["temp"]; |
| Serial.println(temp, 1); |
| } |
| |
json_data = http_get('http://api.weatherbit.io/v2.0/current?city=' + cityName + '&key=' + apiKey) | void loop() { |
data = json.loads(json_data) | } |
print(data) | |
print(data['data'][0]['temp']) | |
</file> | </file> |
| |
</code> | </code> |
| |
Проверяем установилось ли соединение с беспроводной сетью до тех пор, пока оно не будет установлено | |
<code python[enable_line_numbers="2", start_line_numbers_at="22"]> | |
while wlan.isconnected() == False: | |
pass | |
</code> | |
| |
Выводим IP адрес, который получил наш микроконтроллер при подключении к Wi-Fi сети | |
<code python[enable_line_numbers="2", start_line_numbers_at="25"]> | |
print('Device IP:', wlan.ifconfig()[0]) | |
</code> | |
| |
Функция http_get предназначена для формирования запроса к веб-серверу. В качестве параметров она принимает адрес веб страницы (url) и порт (по умолчанию 80, стандартный для веб-страниц). Функция возвращает данные, полученные от веб сервиса. | Функция httpGet предназначена для формирования запроса к веб-серверу. В качестве параметров она принимает адрес веб страницы (url) и порт (по умолчанию 80, стандартный для веб-страниц). Функция возвращает данные, полученные от веб сервиса. |
| |
Здесь необходимо ввести свой ключ доступа к сервису weatherbit.io, который был получен после регистрации. Moscow,RU - это название города, по которому мы хотим получить погодные данные. В нашем случае это Москва. Названия для других городов можно получить на сайте сервиса [[https://www.weatherbit.io/api]] | Здесь необходимо ввести свой ключ доступа к сервису weatherbit.io, который был получен после регистрации. Moscow - это название города, по которому мы хотим получить погодные данные. В нашем случае это Москва. Названия для других городов можно получить на сайте сервиса [[https://www.weatherbit.io/api]] |
<code python[enable_line_numbers="2", start_line_numbers_at="50"]> | <code arduino[enable_line_numbers="2", start_line_numbers_at="48"]> |
apiKey = 'YourApiKey' | String API_key = "YourApiKey"; |
cityName = 'Moscow,RU' | String city_name = "Moscow"; |
</code> | </code> |
| |
Отправляем запрос сервису на предоставления данный о текущей погоде | Отправляем запрос сервису на предоставления данный о текущей погоде |
<code python[enable_line_numbers="2", start_line_numbers_at="53"]> | <code arduino[enable_line_numbers="2", start_line_numbers_at="51"]> |
json_data = http_get('http://api.weatherbit.io/v2.0/current?city=' + cityName + '&key=' + apiKey) | String json_data = httpGet("http://api.weatherbit.io/v2.0/current?city=" + city_name + "&key=" + API_key); |
</code> | </code> |
| |
</WRAP> | </WRAP> |
| |
В переменной ''json_data'' мы получили просто текстовую строку в формате JSON в которой находится информация. Чтобы мы могли работать с ней как с данными нам необходимо преобразовать ее в структуру данных Python. | Выведем полученную строку. |
<code python[enable_line_numbers="2", start_line_numbers_at="54"]> | <code arduino[enable_line_numbers="2", start_line_numbers_at="54"]> |
data = json.loads(json_data) | Serial.println(json_data); |
</code> | </code> |
| |
Теперь в переменно ''data'' находится структура данных к которой мы можем обращаться. Выведем ее в терминал, чтобы посмотреть что в ней находится | В твоем случае данные будут другими так как запрос будет сделан в другое время и будет другая погода). В них много различных параметров, даже больше, чем нам будет нужно. |
<code python[enable_line_numbers="2", start_line_numbers_at="55"]> | <code> |
print(data) | {'count': 1, 'data': [{'wind_cdir_full': 'south', 'weather': {'code': '804', 'icon': 'c04d', 'description': 'Overcast clouds'}, 'datetime': '2020-06-15:13', 'temp': 23.9, 'station': 'E8051', 'elev_angle': 39.93, 'app_temp': 23.4, 'state_code': '48', 'wind_dir': 183, 'last_ob_time': '2020-06-15T12:46:00', 'solar_rad': 125, 'sunrise': '00:43', 'slp': 1006.8, 'pod': 'd', 'vis': 5, 'pres': 992.6, 'wind_cdir': 'S', 'wind_spd': 1.34, 'ghi': 625.24, 'ts': 1592225160, 'snow': 0, 'uv': 6.73402, 'clouds': 100, 'city_name': 'Moscow', 'precip': 0, 'timezone': 'Europe/Moscow', 'country_code': 'RU', 'dni': 824.53, 'dhi': 102.47, 'sunset': '18:15', 'ob_time': '2020-06-15 12:46', 'h_angle': 40, 'dewpt': 8.7, 'aqi': 42, 'lat': 55.7522, 'rh': 38, 'lon': 37.6156}]} |
</code> | </code> |
| |
В нашем случае выводится строка (в вашем случае данные будут другими так как запрос будет сделан в другое время и будет другая погода) | |
<code> | В переменной ''json_data'' мы получили просто текстовую строку в формате JSON в которой находится информация. Чтобы мы могли работать с ней как с данными нам необходимо преобразовать ее в объект типа ''JsonDocument''. Для работы с JSON мы установили и подключили библиотеку "ArduinoJson". |
{'count': 1, 'data': [{'wind_cdir_full': 'south', 'weather': {'code': '804', 'icon': 'c04d', 'description': 'Overcast clouds'}, 'datetime': '2020-06-15:13', 'temp': 23.9, 'station': 'E8051', 'elev_angle': 39.93, 'app_temp': 23.4, 'state_code': '48', 'wind_dir': 183, 'last_ob_time': '2020-06-15T12:46:00', 'solar_rad': 125, 'sunrise': '00:43', 'slp': 1006.8, 'pod': 'd', 'vis': 5, 'pres': 992.6, 'wind_cdir': 'S', 'wind_spd': 1.34, 'ghi': 625.24, 'ts': 1592225160, 'snow': 0, 'uv': 6.73402, 'clouds': 100, 'city_name': 'Moscow', 'precip': 0, 'timezone': 'Europe/Moscow', 'country_code': 'RU', 'dni': 824.53, 'dhi': 102.47, 'sunset': '18:15', 'ob_time': '2020-06-15 12:46', 'h_angle': 40, 'dewpt': 8.7, 'aqi': 42, 'lat': 55.7522, 'rh': 38, 'lon': 37.6156}]} | |
| <code arduino[enable_line_numbers="2", start_line_numbers_at="4"]> |
| #include <ArduinoJson.h> |
| </code> |
| |
| В следующих строках мы создаем объект (структуру данных) ''json_doc'' и с помощью функции ''deserializeJson'' сохраняем в него данные строки "json_data". |
| <code arduino[enable_line_numbers="2", start_line_numbers_at="54"]> |
| JsonDocument json_doc; |
| deserializeJson(json_doc, json_data); |
</code> | </code> |
| |
Это и есть данные, полученные от сервиса. В них много различных параметров, даже больше, чем нам будет нужно. Попробуем выбрать из них температуру и вывести ее в терминал | Теперь в переменной ''json_doc'' находится структура данных к которой мы можем обращаться. Попробуем выбрать данных температуру и вывести ее в терминал |
<code python[enable_line_numbers="2", start_line_numbers_at="56"]> | <code aarduino[enable_line_numbers="2", start_line_numbers_at="56"]> |
print(data['data'][0]['temp']) | float temp = json_doc["data"][0]["temp"]; |
| Serial.println(temp, 1); |
</code> | </code> |
| |