Проект "Розумний астрономічний таймер" є програмою на мові LUA для NodeMCU V3 ESP8266, яка використовує модуль реле 5V для Arduino PIC ARM AVR для управління зовнішнім освітленням. Програма використовує Wi-Fi для синхронізації часу, а також можливість ручного налаштування часу. Вона також отримує дані про погоду та астрономічні дані з Інтернету для аналізу та автоматичного включення світла під час потемніння. Крім того, програма підтримує вмикання/вимикання світла через мережу з допомогою команд.
Для виконання програми потрібно:
- NodeMCU V3 ESP8266
- 2-канальний модуль реле 5V для Arduino PIC ARM AVR
- Інтернет-підключення
- Підключіть NodeMCU V3 ESP8266 та модуль реле до комп'ютера.
- Встановіть програму Arduino IDE на свій комп'ютер.
- Відкрийте Arduino IDE та перейдіть до меню "Файл" -> "Налаштування".
- У вікні "Налаштування" у полі "Додаткові дошки URL" введіть наступне значення:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
- Натисніть кнопку "OK" та закрийте вікно "Налаштування".
- Перейдіть до меню "Інструменти" -> "Плата" та оберіть "NodeMCU 1.0 (ESP-12E Module)".
- Перейдіть до меню "Інструменти" -> "Версія" та оберіть "Latest".
- Перейдіть до меню "Інструменти" -> "Завантажити бібліотеки" та завантажте наступні бібліотеки: "WiFiManager", "Time", "NTPClient", "ArduinoJson".
- Відкрийте файл "smart_astronomical_timer.lua" в Arduino IDE та завантажте програму на NodeMCU V3 ESP8266.
- Підключіть NodeMCU V3 ESP8266 та модуль реле до джерела живлення.
- Підключіть зовнішнє освітлення до модуля реле.
- Підключіть NodeMCU V3 ESP8266 до Wi-Fi мережі.
- Після підключення до Wi-Fi мережі програма автоматично синхронізує час з Інтернету.
- Якщо потрібно, можна налаштувати час вручну за допомогою команди "/settime HH:MM:SS".
- Програма автоматично отримує дані про погоду та астрономічні дані з Інтернету та вмикатиме світло під час потемніння.
- Якщо потрібно, можна вмикати/вимикати світло через мережу з допомогою команд "/on" та "/off".
Програма підтримує наступні команди через Wi-Fi:
- /settime HH:MM:SS - налаштувати час вручну.
- /on - вмикнути світло.
- /off - вимкнути світло.
Ігор Коляса
Приклад коду на мові LUA для проекту
Розумний астрономічний таймер
-- Завантаження модулів для роботи з Wi-Fi, HTTP та часом
wifi = require("wifi")
http = require("http")
sntp = require("sntp")
-- Налаштування змінних для зберігання конфігурації
ssid = "mywifi"
password = "mypassword"
server = "api.openweathermap.org"
path = "/data/2.5/weather"
city = "Kyiv"
appid = "myappid"
-- Налаштування змінних для зберігання астрономічних даних та налаштувань
lat = 50.43
lon = 30.52
offset = 2
sunset = 0
sunrise = 0
-- Налаштування пінів для керування реле
pin_relay_1 = 1
pin_relay_2 = 2
gpio.mode(pin_relay_1, gpio.OUTPUT)
gpio.mode(pin_relay_2, gpio.OUTPUT)
-- Функція для вмикання світла
function switch_on()
gpio.write(pin_relay_1, gpio.HIGH)
gpio.write(pin_relay_2, gpio.HIGH)
print("Light turned on")
end
-- Функція для вимикання світла
function switch_off()
gpio.write(pin_relay_1, gpio.LOW)
gpio.write(pin_relay_2, gpio.LOW)
print("Light turned off")
end
-- Функція для отримання погодних даних з сервера
function get_weather_data()
http.get("http://" .. server .. path .. "?q=" .. city .. "&appid=" .. appid, nil, function(code, data)
if (code < 0) then
print("HTTP request failed")
else
print("HTTP request successful")
weather_data = sjson.decode(data)
end
end)
end
-- Функція для отримання астрономічних даних
function get_astronomical_data()
http.get("http://api.sunrise-sunset.org/json?lat=" .. lat .. "&lng=" .. lon .. "&formatted=0", nil, function(code, data)
if (code < 0) then
print("HTTP request failed")
else
print("HTTP request successful")
astronomical_data = sjson.decode(data)
sunset = astronomical_data.results.sunset
sunrise = astronomical_data.results.sunrise
end
end)
end
-- Функція для визначення поточного часу
function get_current_time()
sntp.sync(nil, function(sec, usec, server, info)
print("Time synchronized")
end, nil, 1)
end
-- Функція для визначення, чи настав час вмикання світла
function isTimeToTurnOnLight(astronomicalData, currentTime, timeZone)
local sunriseTime = astronomicalData.sunrise
local sunsetTime = astronomicalData.sunset
local twilightBegin = astronomicalData.twilight_begin
local twilightEnd = astronomicalData.twilight_end
-- Перевірка, чи поточний час після заходу сонця та перед ранком
if currentTime >= sunsetTime and currentTime < sunriseTime then
return true
end
-- Перевірка, чи поточний час в межах світла
if currentTime >= twilightBegin and currentTime < twilightEnd then
return true
end
return false
end
Функція отримує три параметри: astronomicalData
, currentTime
та timeZone
. astronomicalData
- це таблиця, що містить дані про сходи/заходи сонця та інші астрономічні події для поточного дня. currentTime - поточний час, в мілісекундах з початку доби, який отримується з функції getTimeOfDay(). timeZone
- часовий пояс, в якому працює пристрій, який можна задати в коді.
Функція спочатку отримує значення часу заходу/сходу сонця та початку/кінця світла з astronomicalData
. Потім перевіряє, чи поточний час після заходу сонця та перед ранком, або чи поточний час в межах світла. Якщо так, то функція повертає true, що означає, що настав час вмикання світла.
Наступна частина коду містить функцію для вимкнення світла:
-- Функція для вимкнення світла
function turnOffLight()
gpio.write(lightPin, gpio.HIGH)
lightOn = false
end
Ця функція просто встановлює вихідний сигнал на піні, до якого підключене реле, в значення "високий рівень" (HIGH), що призводить до вмикання світла.
Код функції:
function switchLightsOn()
gpio.write(relayPin, gpio.HIGH)
print("Lights turned on")
end
Тут gpio.write(relayPin, gpio.HIGH) встановлює пін у високий рівень. Функція також виводить повідомлення "Lights turned on" у консоль.