Рубріки: Новини

Сеньйор 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
)

Також розробник надав деякі коментарі:

  1. Ви можете використовувати й інший пін, не обов’язково 17, але тоді треба буде точно знати його id і змінити це значення у коді, інакше сервопривід не буде реагувати на команди вашого коду.
  2. Для максимально точного результату треба буде ввести географічні координати того місця, де буде знаходитися пристрій — від цього залежатиме точний час сходу та заходу сонця, який поверне сервіс api.sunrise-sunset.org, а на цьому базуються всі подальші розрахунки.
  3. Якщо ви знаходитеся в іншому часовому поясі, значення Europe/Kyiv також треба буде змінити, бо сервіс повертає час сходу й заходу сонця виключно в UTC, тому його треба конвертувати у місцевий час.
  4. У розробника пристрій стоїть біля вікна, яке виходить на південь, при чому оточуючі будинки закривають частину неба зліва і справа, так що перші та останні 45 градусів руху сонця випадають. На цьому базуються розрахунки стартової позиції й того, скільки поворотів треба буде зробити і як часто. В залежності від того, куди виходять ваші вікна та яка частина неба є відкритою, ці параметри можуть змінюватися. У розробника підставка обертається від 45° до 135°, що відповідає передачі значень від 4,5 до 9,5 сервоприводу. Там трохи нелінійна залежність, бо параметр 2 відповідає куту 0°, а 12 — 180°. Всі інші значення між ними — це кути, на які може обертатися сервопривід, і для них треба підбирати відповідні значення.

Читайте також:

Львівські розробники створили застосунок для оплати штрафів за паркування

Український розробник з Vacuumlabs створив застосунок для дітей з особливостями розвитку

Python-програміст з 9 роками досвіду «вигорів» і почав виготовляти столи

Останні статті

Юлія Штукатурова стала новою керівницею європейського регіону в GlobalLogic

Компанія GlobalLogic заявила, що європейський регіон відтепер очолюватиме Юлія Штукатурова, повідомили в DOU. У GlobalLogic Юлія…

04.06.2025

Інсайдери OpenAI розповіли, що чекати від GPT-5, яка з’явиться в липні

Флагманська LLM-модель OpenAI GPT-5 з'явиться вже в липні, як стверджують інсайдери. Модель матиме підтримку відео,…

04.06.2025

Безкоштовні користувачі ChatGPT отримали доступ до розширеної функції пам’яті

Функція пам'яті ChatGPT, яка дозволяє звертатися до історії минулих розмов з чат-ботом, тепер стала доступною…

04.06.2025

Розробники Go остаточно відмовились від спроб покращити синтаксис обробки помилок

Після шести років обговорень та сотень пропозицій від ком'юніті команда розробників Go офіційно оголосила, що…

04.06.2025

Оновлення Telegram: з’явились повідомлення адмінам каналів і скорочення голосових повідомлень

Команда Telegram випустила чергове велике оновлення. Адмінам каналів тепер можна надсилати особисті повідомлення, спростилося перемикання…

04.06.2025

У Росії націоналізували одну з найбільших геймдев-компаній. Звинуватили в підтримці ЗСУ

Таганський суд Москви ухвалив рішення про передачу у власність держави 100% уставного капіталу IT-компанії «Леста…

04.06.2025