QuantumPixie & Kebab
Kebab Kebab
Привет, я тут экспериментирую с новым ритуалом ароматизации специями, и подумал, тебе бы понравилось бы взломать девайс, который считывает аромат и температуру, чтобы идеально получилось с шашлыками – ну, типа кулинария и программирование в одном флаконе, как тебе?
QuantumPixie QuantumPixie
Звучит восхитительно! Давай превратим это в умного шашлычного мастера! Схвати Arduino, дешёвый газовый датчик MQ для аромата, DS18B20 для температуры и небольшое реле, чтобы управлять нагревательным элементом твоего гриля. Загрузи скетч, который будет считывать оба датчика, усреднять “индекс аромата специй” с температурой и включать/выключать реле, пока не найдёшь идеальную точку. Добавь маленький LCD-дисплей или уведомление на телефон, чтобы ты знал, когда шашлык готов. Получится что-то вроде кулинарного AI, но у тебя на кухне! Если нужна основа кода или советы по подключению датчиков – просто скажи, удачного хакинга!
Kebab Kebab
Это отличная схема — теперь переходим к деталям. Сначала подключи Vcc датчика газа MQ к выводу 5В, GND к земле, а аналоговый выход – к A0. Для DS18B20 нужен подтягивающий резистор – 4,7 кОм – между линией данных и 5В, затем подключи данные к D2, Vcc к 5В, GND к земле. Для реле используй гальванически изолированный модуль, чтобы Arduino безопасно его управлял; подключи входной пин к D8, выход – к цепи нагревательного элемента гриля, и не забудь диод обратной связи через катушку реле. В скетче считывай данные с датчика MQ функцией analogRead, конвертируй их в ppm, используя калибровочную кривую из документации, и подавай на фильтр скользящего среднего для сглаживания скачков. То же самое сделай для DS18B20, считывай данные каждые 250 миллисекунд. Затем вычислить взвешенную сумму – скажем, 70% аромат и 30% температура – чтобы получить твой «индекс специй». Когда индекс превысит твой порог, подавай короткий импульс на реле – на секунду вверх, затем вниз; повторяй, пока индекс не стабилизируется. Для дисплея подключи LCD дисплей 16x2 с I2C и отправляй текущий индекс и целевое значение каждую секунду. Если тебе лень возиться с проводами, я могу нарисовать схему подключения. Просто скажи, на каком этапе возникли трудности – не переживай, быстро приведём тебя в чувство.
QuantumPixie QuantumPixie
Отлично! Ты схватил проводку на лету, теперь немного подправим код. Вот тебе набросок, чтобы ты не терял темп: ```cpp #include <OneWire.h> #include <DallasTemperature.h> #include <LiquidCrystal_I2C.h> OneWire oneWire(D2); DallasTemperature sensors(&oneWire); LiquidCrystal_I2C lcd(0x27, 16, 2); int mqPin = A0; int relayPin = D8; float mqRaw, mqPPM, mqAvg = 0; float tempC, tempAvg = 0; int mqSamples = 10, tempSamples = 10; float weightAroma = 0.7, weightTemp = 0.3; float targetIndex = 200; // подкрути это void setup() { pinMode(relayPin, OUTPUT); digitalWrite(relayPin, LOW); sensors.begin(); lcd.init(); lcd.backlight(); } void loop() { // Read MQ-9 mqRaw = analogRead(mqPin); mqPPM = ppmFromRaw(mqRaw); // добавь свою калибровочную функцию mqAvg = movingAvg(mqPPM, mqSamples); // Read DS18B20 sensors.requestTemperatures(); tempC = sensors.getTempCByIndex(0); tempAvg = movingAvg(tempC, tempSamples); // Compute spice index float index = weightAroma * mqAvg + weightTemp * tempAvg; // Control relay if (index > targetIndex) { digitalWrite(relayPin, HIGH); delay(1000); digitalWrite(relayPin, LOW); } // Display lcd.clear(); lcd.setCursor(0,0); lcd.print("Idx:"); lcd.print(index,1); lcd.setCursor(0,1); lcd.print("T:"); lcd.print(tempAvg,1); lcd.print("C A:"); lcd.print(mqAvg,1); delay(1000); } ``` Только добавь `ppmFromRaw()` использующую кривую MQ‑9 и простой `movingAvg()` сохраняющий последние N сэмплов. Поиграй с весами, чтобы шашлык выглядел и пах как надо. Если столкнешься с трудностями с кривой калибровки или понадобится хитрость, чтобы реле не гудело – обращайся, удачного хакинга!
Kebab Kebab
Звучит здорово — только небольшая доработка: убедись, что `ppmFromRaw()` использует передаточную функцию MQ‑9; самый простой способ — подставить исходное напряжение в уравнение из даташита, и получишь ppm. Для `movingAvg()` можешь использовать кольцевой буфер с последними 10 значениями и вычислять среднее значение в каждой итерации. И еще, подумай о добавлении гистерезиса, чтобы реле не переключалось слишком часто; например, переключай только если индекс отклоняется от целевого на более чем на 5%. Ну и напоследок, если нагревательный элемент гриля немного "тупит", попробуй увеличить длительность импульса или даже используй ШИМ для более плавного повышения температуры. Удачи с настройками — пусть твой шашлык получится идеальным!