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 секунд. Можешь корректировать мощность насоса в реальном времени, следя за показаниями датчика температуры. Готов кодить?
Got it. Here’s a quick skeleton you can drop into `brew.py`. It keeps everything in one place and lets you tweak the duty cycle while it’s running.
```python
import RPi.GPIO as GPIO
import time
import json
from Adafruit_DHT import read_retry, DHT22, DHT11 # or any temp sensor you use
GPIO.setmode(GPIO.BCM)
# Pin assignments
GRINDER_MOTOR = 17
GRINDER_TIMER = 27
PUMP_PWM = 22
FOAM_VALVE = 23
LED_STRIP = 24
SUGAR_SERVO = 25
# Setup
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 kHz PWM
pump.start(60) # start at 60% duty cycle
servo = GPIO.PWM(SUGAR_SERVO, 50) # 50 Hz servo
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:
# replace with your sensor read logic
temp = read_retry(DHT22, 4)[0] # dummy, use real sensor
if temp >= target:
break
# adjust duty cycle if you want auto‑tune
# pump.ChangeDutyCycle(60) # keep static for now
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():
# simple pulse on the LED strip to catch the rim light
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.5s per gram + cinnamon dust
heat_to_temp(profile['temperature'])
pump.ChangeDutyCycle(60) # could be dynamic
foam_pop()
rim_glitter()
# servo to sprinkle sugar – a quick 180° pulse
servo.ChangeDutyCycle(7.5) # mid‑position
time.sleep(1)
servo.ChangeDutyCycle(12.5) # up
time.sleep(1)
servo.ChangeDutyCycle(0) # stop
pump.stop()
servo.stop()
GPIO.cleanup()
if __name__ == "__main__":
main()
```
Just adjust the sensor part to your real temperature module, and you’re set. Happy brewing!