Сеньйор SoftServe зібрав smart-підставку для квітів. Ось покрокова інструкція
Senior Software Engineer з компанії SoftServe Олександр Вітер зібрав «smart підставку для квітів», яка може обертати горщик з рослиною оптимальним чином.
Своєю мотивацією та покроковою інструкцією він поділився на форумі DOU.
Hardware & Software
Цю велику задачу він розділив на декілька підзадач, умовно поділених на 2 групи:
Hardware:
- власне, сама підставка, що може обертатися і при цьому витримувати вагу горщика з рослиною;
- двигун, щоб обертати підставку на потрібний кут;
- контролер, щоб керувати двигуном.
Software:
- логіка для передачі команд від контролера до двигуна;
- логіка для визначення потрібного часу для обертання (у різні дні сонце сходить та заходить у різний час, а вночі взагалі немає сенсу обертати рослинку);
- математична логіка для визначення оптимальних кутів повороту підставки, враховуючи такі фактори як: час сходу та заходу сонця; частина світу, на яку виходить вікно, на підвіконні якого стоїть підставка з рослиною; оточуюча архітектура, будинки, що блокують сонячне світло у той чи інший час.
Хардверна частина була закрита наступним чином: у якості підставки розробник використав старий кулер від стаціонарного комп’ютера у поєднанні з деякими елементами конструктора Lego. За рух відповідав сервопривід MG996R, а у якості контролера використовувався міні-комп’ютер Raspberry Pi 4, на якому колись запускались Telegram-боти.
Щодо першого пункту з розділу Software, все було досить нескладно, бо і Raspberry Pi, і обрана модель сервоприводу є досить популярними у DIY (do it yourself) ком’юніті, так що знайти інструкцію з налаштування не склало проблем.
З двома іншими софтверними пунктами довелося трохи згадати геометрію та астрономію, бо ці знання не використовувалися практично зі шкільних років.
Код рішення і коментарі
import time
import json
import pytz
import lgpio
import requests
from dateutil import tz
from datetime import datetime, tzinfo
PIN = 17 # RPi pin id where servo is connected
FREQ = 50 # default for our purpose
LAT, LNG = 46.4769954, 30.7302463 # where your device is located
endpoint = f'https://api.sunrise-sunset.org/json?lat={lat}&lng={lng}&formatted=0'
h = lgpio.gpiochip_open(0)
while True:
response = requests.get(endpoint)
response = json.loads(response.text)
sunrise = datetime.fromisoformat(response['results']['sunrise'])
sunset = datetime.fromisoformat(response['results']['sunset'])
sunrise = sunrise.astimezone(pytz.timezone("Europe/Kyiv"))
sunset = sunset.astimezone(pytz.timezone("Europe/Kyiv"))
now = datetime.now()
if now.hour == sunrise.hour and now.minute == sunrise.minute:
lgpio.tx_pwm(h, PIN, FREQ, 4.5) # go to initial position
delta = sunset - sunrise
light_day = delta.total_seconds()
time.sleep(int(light_day / 4)) # wait until sun will be in the right place
for i in range(100):
)
lgpio.tx_pwm(h, PIN, FREQ, 4.5+((i+1)*0.05))
time.sleep(int(light_day / 200))
else:
time.sleep(60
Також розробник надав деякі коментарі:
- Ви можете використовувати й інший пін, не обов’язково 17, але тоді треба буде точно знати його id і змінити це значення у коді, інакше сервопривід не буде реагувати на команди вашого коду.
- Для максимально точного результату треба буде ввести географічні координати того місця, де буде знаходитися пристрій — від цього залежатиме точний час сходу та заходу сонця, який поверне сервіс api.sunrise-sunset.org, а на цьому базуються всі подальші розрахунки.
- Якщо ви знаходитеся в іншому часовому поясі, значення Europe/Kyiv також треба буде змінити, бо сервіс повертає час сходу й заходу сонця виключно в UTC, тому його треба конвертувати у місцевий час.
- У розробника пристрій стоїть біля вікна, яке виходить на південь, при чому оточуючі будинки закривають частину неба зліва і справа, так що перші та останні 45 градусів руху сонця випадають. На цьому базуються розрахунки стартової позиції й того, скільки поворотів треба буде зробити і як часто. В залежності від того, куди виходять ваші вікна та яка частина неба є відкритою, ці параметри можуть змінюватися. У розробника підставка обертається від 45° до 135°, що відповідає передачі значень від 4,5 до 9,5 сервоприводу. Там трохи нелінійна залежність, бо параметр 2 відповідає куту 0°, а 12 — 180°. Всі інші значення між ними — це кути, на які може обертатися сервопривід, і для них треба підбирати відповідні значення.
Читайте також:
Львівські розробники створили застосунок для оплати штрафів за паркування
Український розробник з Vacuumlabs створив застосунок для дітей з особливостями розвитку
Python-програміст з 9 роками досвіду «вигорів» і почав виготовляти столи
Favbet Tech – це ІТ-компанія зі 100% украінською ДНК, що створює досконалі сервіси для iGaming і Betting з використанням передових технологіи та надає доступ до них. Favbet Tech розробляє інноваційне програмне забезпечення через складну багатокомпонентну платформу, яка здатна витримувати величезні навантаження та створювати унікальний досвід для гравців.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: