Goodday & Turtlex
Привет, Дэн. Слушай, я тут кое-что замутил – небольшой open-source проект. Превратил обычную кофемашину в мастерскую для цифрового искусства. Теперь можно скриптом управлять процессом: мелет кофе, регулирует температуру, даже добавляет новые вкусы на ходу – что-то вроде творческой палитры для эспрессо. Интересно, что за безумные кофейные шедевры мы могли бы вместе создать?
Ого, звучит просто безумно! Я уже представляю себе латте с неоновыми разводами, который меняет цвет, когда пар поднимается. Может, добавить немного корицы и капельку матчи для этого зеленого свечения? Или как насчет слоя "радужной пены", которая лопается, когда кофе попадает в чашку? Давай замутим это в небольшой программу, чтобы можно было выбирать "настроение", а машина смешивала зерна, температуру и какой-то секретный ингредиент... как живая картина, короче. С чего начнем? Какое настроение на примете?
Думаю, начну с настроения "Полуночный уголёк". Глубокая обжарка, чуть пониженная температура заваривания, чтобы эспрессо оставался насыщенным, щепотка корицы для теплого аромата и капля сиропа с активированным углем – чтобы пена слегка светилась ночным синим. Программа будет загружать JSON-профиль, настраивать кофемолку, регулировать время работы помпы и активировать клапан для взбивания пены, как только эспрессо попадёт в чашку. Получится, конечно, конструктор Lego, но зато какая интересная задача — создать машину для кофе, которая будет казаться живой картиной.
Звучит как самый крутой ночной движ, который только может вместить твоя кухня! Крепкий, с легкой обжаркой, с нотками корицы и угольным свечением – как дымная луна в чашке. Я бы еще добавил блестящий сахарный ободок, чтобы подхватить этот синий отблеск. Эта кофейная лаборатория скоро станет настоящей арт-инсталляцией. Готов закодировать волшебство?
Конечно, давай набросаем основу на Python с Raspberry Pi и контроллером трехфазного соленоида. Сначала JSON для настроек:
```json
{
"name":"Midnight Ember",
"beans":"dark roast",
"temperature":85,
"cinnamon":1,
"charcoal_syrup":2,
"foam_spike":true,
"rim_glitter":"blue"
}
```
Потом скрипт, который:
1. Читает профиль,
2. Отправляет крутящий момент и время помола через GPIO,
3. Управляет скоростью помпы через ШИМ, чтобы добиться целевой температуры,
4. Активирует клапан для пены во время подачи эспрессо,
5. Запускает небольшую светодиодную ленту для эффекта свечения угля,
6. Посыпает сахар на край чашки с помощью микросервопривода.
Сохраним логику в одном файле `brew.py`, используем `RPi.GPIO` для управления железом и `json` для профилей. Хочешь сразу углубиться в конкретные GPIO пины или формулы для расчета времени?
Звучит круто! Давай зафиксируем: пин 17 – для мотора кофемолки, 27 – для реле таймера кофемолки, 22 – для ШИМ насоса, 23 – для клапана подачи пены, 24 – для светодиодной ленты, и 25 – для сервопривода дозатора сахара. По таймингу: кофемолка работает примерно 1.5 секунды на грамм зерен, затем насос работает на 60% мощности до тех пор, пока температура заваривания не достигнет 85 градусов, после чего открываем клапан пены на 0.8 секунд. Можешь корректировать мощность насоса в реальном времени, следя за показаниями датчика температуры. Готов кодить?
Понял. Вот тебе набросок, который ты сможешь вставить в `brew.py`. Всё будет в одном месте, и ты сможешь менять рабочий цикл прямо во время работы.
```python
import RPi.GPIO as GPIO
import time
import json
from Adafruit_DHT import read_retry, DHT22, DHT11 # или любой другой датчик температуры
GPIO.setmode(GPIO.BCM)
# Назначение контактов
GRINDER_MOTOR = 17
GRINDER_TIMER = 27
PUMP_PWM = 22
FOAM_VALVE = 23
LED_STRIP = 24
SUGAR_SERVO = 25
# Настройка
GPIO.setup(GRINDER_MOTOR, GPIO.OUT)
GPIO.setup(GRINDER_TIMER, GPIO.OUT)
GPIO.setup(PUMP_PWM, GPIO.OUT)
GPIO.setup(FOAM_VALVE, GPIO.OUT)
GPIO.setup(LED_STRIP, GPIO.OUT)
GPIO.setup(SUGAR_SERVO, GPIO.OUT)
pump = GPIO.PWM(PUMP_PWM, 1000) # 1 кГц ШИМ
pump.start(60) # начинаем с 60% рабочего цикла
servo = GPIO.PWM(SUGAR_SERVO, 50) # 50 Гц сервопривод
servo.start(0)
def load_profile(name):
with open('profiles.json') as f:
data = json.load(f)
return data[name]
def grind(grams, grind_time_sec):
GPIO.output(GRINDER_TIMER, GPIO.HIGH)
time.sleep(grind_time_sec * grams)
GPIO.output(GRINDER_TIMER, GPIO.LOW)
def heat_to_temp(target):
while True:
# замени на логику чтения твоего датчика температуры
temp = read_retry(DHT22, 4)[0] # фиктивное значение, используй реальный датчик
if temp >= target:
break
# регулируй рабочий цикл, если хочешь настроить автоматическую подстройку
# pump.ChangeDutyCycle(60) # пока держим статичный
time.sleep(0.1)
def foam_pop():
GPIO.output(FOAM_VALVE, GPIO.HIGH)
time.sleep(0.8)
GPIO.output(FOAM_VALVE, GPIO.LOW)
def rim_glitter():
# короткий импульс на светодиодной ленте для подсветки ободка
GPIO.output(LED_STRIP, GPIO.HIGH)
time.sleep(0.2)
GPIO.output(LED_STRIP, GPIO.LOW)
def main():
profile = load_profile('Midnight Ember')
grind(profile['cinnamon'] + 1, 1.5) # 1.5 сек на грамм + порошок корицы
heat_to_temp(profile['temperature'])
pump.ChangeDutyCycle(60) # может быть динамическим
foam_pop()
rim_glitter()
# сервопривод для посыпки сахаром – короткий импульс на 180°
servo.ChangeDutyCycle(7.5) # среднее положение
time.sleep(1)
servo.ChangeDutyCycle(12.5) # вверх
time.sleep(1)
servo.ChangeDutyCycle(0) # стоп
pump.stop()
servo.stop()
GPIO.cleanup()
if __name__ == "__main__":
main()
```
Просто подстрой часть с датчиком под свой модуль температуры, и всё готово. Приятного приготовления!