17 Марта 2025
13
Вопрос из ленты «Эксперты»

Arduino. Проблема с serial. Нужна помощь

Пишу скетч для управления маленькой сыроварней у себя дома. Нужно в сериал передавать данные температуры рубашки и молока и читать оттуда управляющие команды
сам скетч


#include <OneWire.h>  // Подключаем библиотеку для взаимодействия с устройствами, работающими на шине и по протоколу 1-Wire

#include <DallasTemperature.h>  // Подключаем библиотеку с функциями для работы с DS18B20 (запросы, считывание и преобразование возвращаемых данных)

#define ONE_WIRE_BUS 4  // Указываем пин подключения data-вывода датчика температуры

// Массив для хранения адресов датчиков

DeviceAddress sensor1, sensor2;

// Таймер очередного считывания значений с датчика температуры

unsigned long tempReadTimer;

// Частота считывания температуры с датчика (мс)

int tempReadDuration = 1000;


// Порт для нагревателя

#define HEATER_PIN 12

//Порт для охладителя

#define COOLER_PIN 13

//Порт для активации мешалки

#define BLENDER_PIN 4

//Порт для мешалки правый

#define BLENDER_PIN_R 5

//Порт для мешалки левый

#define BLENDER_PIN_L 6

OneWire oneWire(ONE_WIRE_BUS);  // Сообщаем библиотеке об устройстве, работающем по протоколу 1-Wire

DallasTemperature sensors(&oneWire);  // Связываем функции библиотеки DallasTemperature с нашим 1-Wire устройством (DS18B20)

void setup(void)

{

Serial.begin(9600); // Порт на Nextion

Serial.setTimeout(50); // Таймаут ожидания что все пришло

// Нагреватель

pinMode(HEATER_PIN, OUTPUT);

// Охладитель

pinMode(COOLER_PIN, OUTPUT);

// Мешалка

pinMode(BLENDER_PIN, OUTPUT);

pinMode(BLENDER_PIN_R, OUTPUT);

pinMode(BLENDER_PIN_L, OUTPUT);

// Выключаем порт нагревателя

digitalWrite(COOLER_PIN, LOW);

// Выключаем порт охладителя

digitalWrite(HEATER_PIN, LOW);

//Выключаем порты мешалки

digitalWrite(BLENDER_PIN, LOW);

digitalWrite(BLENDER_PIN_L, LOW);

digitalWrite(BLENDER_PIN_R, LOW);

// Запускаем библиотеку измерения температуры

sensors.begin();

// Запускаем поиск датчиков

if (!sensors.getAddress(sensor1, 0)) {

Serial.println("Датчик 1 не найден!");

}

if (!sensors.getAddress(sensor2, 1)) {

Serial.println("Датчик 2 не найден!");

}

// Установка разрешения датчиков (9-12 бит)

sensors.setResolution(sensor1, 12);

sensors.setResolution(sensor2, 12);

}

void loop() {

// Запрос температуры от всех датчиков

sensors.requestTemperatures();

// Чтение температуры с каждого датчика

float temp1 = sensors.getTempC(sensor1);

float temp2 = sensors.getTempC(sensor2);

if(millis() >= tempReadTimer + tempReadDuration) {

// Отправляем значение температуры молока в Nextion

Serial.print("Main.MilkT.txt=\"");

Serial.print(String(temp1*10));

Serial.print("\"");

Serial.write(0xFF);

Serial.write(0xFF);

Serial.write(0xFF);

// Отправляем значение температуры воды в Nextion

Serial.print("Main.WaterT.txt=\"");

Serial.print(String(temp2*10));

Serial.print("\"");

Serial.write(0xFF);

Serial.write(0xFF);

Serial.write(0xFF);

// Обновляем таймер

tempReadTimer = millis();

}

if (Serial.available() > 0)

{

// Что то пришло на вход

// Считываем данные из порта

String code = Serial.readString();


if(code == "HeaterOn") {

// Включаем порт нагревателя

digitalWrite(HEATER_PIN, HIGH);

// Выключаем порт охладителя

digitalWrite(COOLER_PIN, LOW);

}

else if(code == "HeaterOff") {

// Выключаем порт нагревателя

digitalWrite(HEATER_PIN, LOW);

}

else if(code == "CoolerOn") {

// Включаем порт нагревателя

digitalWrite(COOLER_PIN, HIGH);

// Выключаем порт охладителя

digitalWrite(HEATER_PIN, LOW);

}

else if(code == "CoolerOff") {

// Выключаем порт нагревателя

digitalWrite(COOLER_PIN, LOW);

}

}

}

В текущем виде он не передает значения температур. В мониторе порта видно

Main.MilkT.txt=""���Main.WaterT.txt=""���

Но стоит убрать код обработки команд


if(code == "HeaterOn") {

// Включаем порт нагревателя

digitalWrite(HEATER_PIN, HIGH);

// Выключаем порт охладителя

digitalWrite(COOLER_PIN, LOW);

}

else if(code == "HeaterOff") {

// Выключаем порт нагревателя

digitalWrite(HEATER_PIN, LOW);

}

else if(code == "CoolerOn") {

// Включаем порт нагревателя

digitalWrite(COOLER_PIN, HIGH);

// Выключаем порт охладителя

digitalWrite(HEATER_PIN, LOW);

}

else if(code == "CoolerOff") {

// Выключаем порт нагревателя

digitalWrite(COOLER_PIN, LOW);

}

то температура начинает передаватся нормально
Main.MilkT.txt="201.88"���Main.WaterT.txt="207.50"

Подскажите пожалуйста, где я ошибаюсь. Что я делаю не так.

UPD. Проблема решена. в копию кода не попало еще одно присоединение библиотеки. и оно жрало память. В общем не хватало памяти.

Показать полностью
8

Любите ли вы Патамушту, как люблю её я?

Бессмертное творение Джона Леннона в разных исполнениях и ипостасях. Вот, например, один забавный чувакъ без всяких музыкальных инструментов, а онли токмо голосом, данным от природы. Но как он это делает...

Квартет RYLETONES тоже не отстаёт. Душевно выводят, однако...

Американцы Foxes and Fossils (Лисички и Окаменелости) тоже неплохо умеют...

Симпатичный дуэт юных итальянцев

Rastrelli Cello Quartet - сплошь наши люди, но почему-то ныне в Немеччине прописаны. Виолончель - это человеческий голос, заключённый внутри инструмента. И под смычком мастера он - оживает...

Klaus Waldburg из Германии способен передать настроение своим исполнением на концертной цитре

Американец Jim Palmer не отстаёт со своей арфой

Бразильский коллектив Orquestra Ouro Preto тоже внёс свою достойную лепту

...и на закуску - трио из увлечённых музыкой ребятишек. Ну очень стараются юноши..

Показать полностью 8
4

Одиннадцать и Джимми Феллон на "Угадай мелодию"

Не знаю, что за шоу пародировал Джимми Феллон - но уж очень похоже на "Угадайку" - правда без денежных призов (приз другой). Удивила Милли Бобби. Она ж из себя строит взрослую мадаму. А тут просто дурачится - и нихрена не постановочно. Чем-то напоминает Тейлор Свифт (но Тейлор то и не скрывает, что она деревня и понаприехавшая, чего только стоят её домашние приколы с котами и вечным джинсовым комбезом).

Без перевода, но он и не нужен.

Показать полностью 1
19

Минус один

Знакомый чутка не дотянул до лета.
Нормально, нормально, бодрячком, не болел особо даже, внезапно стало хреново, больница, обследование - а там запущенный рак, операции, химия, полгода - всё.
Не соболезнований для, это не родственник. Просто на философский лад настраивает.

Мои подписки
Подписывайтесь на интересные вам теги, сообщества, авторов, волны постов — и читайте свои любимые темы в этой ленте.
Чтобы добавить подписку, нужно авторизоваться.

Отличная работа, все прочитано! Выберите