Реле не включаются/отключаются при первоначальном запросе в коде настройки для Arduino ATmega2560 и прототипа экрана 2560.
Следующий код — это то, что я написал на данный момент. Все мои контакты, объявления и записи кажутся правильными, но когда я реализую код, ни одно из моих реле (модулей реле смарт-платы) не отключается сразу, как это было в предыдущем коде.
Примечание: у меня каждый соленоид/насос подключен к соответствующему реле, и этот проект правильно подключен к источнику переменного тока для всех дополнительных требований по току.
Я протестировал реле, используя базовый код проекта, и они все еще работают, поэтому я считаю, что проблемы вызывают моя программа. Я приложу оба набора кода для справки.
Все места расположения контактов были тщательно проверены и проверены. Огромное спасибо за любую помощь, которую вы можете оказать!
Текущий код:
// Возникли проблемы (26.01.2024)
// - реле не включаются/отключаются, проверенная проблема с программным обеспечением
// -
// Список дел для себя:
// - интегрируем датчики потока в код
// - создаем функции концентрации & информация для графического интерфейса Nextion
// - интеграция готового кода Steamer (проверенная работоспособность и в SharePoint)
// - периодически обновлять примечания к версии
// - обновить графический интерфейс Nextion по мере необходимости & в конце концов переформатируйте дисплей
// Примечания к версии: (24.01.2024)
// - ИСПОЛЬЗОВАТЬ СЛЕДУЮЩИЙ ФАЙЛ 24.01.2024 ДЛЯ GUI
// - добавлен дополнительный код емкости воды для графического интерфейса Nextion
// - ПРИМЕЧАНИЕ: производительность все равно необходимо калибровать на основе данных датчика расхода.
// и на данный момент каждая кнопка должна выдавать одинаковое количество
// воды при нажатии
// - необходимо интегрировать датчики потока в код (на данный момент чисто временные)
// Примечания к версии: (18.01.2024)
// - начали вести примечания к версии
// - в этой версии специально исправлена проблема двойного касания, возникшая в предыдущей версии
// это было сделано путем корректировки скорости передачи данных до 9600
// - объем воды необходимо измерять с помощью временного кода или с помощью датчиков
// ПРИМЕЧАНИЯ: - нужно ли вручную нажимать кнопку сброса на плате, чтобы код выполнился?
// - пароварка, насосы, соленоиды все активны НИЗКИЙ
// - необходимо измерить другие объемы воды
/*********************************************************************************************************************************/
// Импортируем библиотеки
#include <SoftwareSerial.h> // эта библиотека была включена в исходный код Steamer?
#include "EasyNextionLibrary.h" // включаем библиотеку Nextion для использования с сенсорным экраном
// Объект сенсорного экрана, использующий библиотеку
EasyNex myNex(Serial1);
// Глобальные переменные
// 1. Расположение контактов платы интеллектуального реле (4)
const int pumpBROWN = 24; // КОРИЧНЕВЫЙ кон. насос
const int pumpGREEN = 25; // ЗЕЛЕНЫЙ кон. насос
const int pumpYELLOW = 26; // ЖЕЛТЫЙ кон. насос
const int pumpBLUE = 27; // СИНИЙ (водяной) насос
// 2. Расположение контактов платы интеллектуального реле (8)
const int WipeDisp = 30; // дозатор салфеток
const int solenoidWaterForCon = 31; // вода для концентрата
const int solenoidWaterDisp = 32; // обычный диспенсер для воды
const int solenoidSteam = 33; // вода в пароварку
const int solenoidMASTER = 34; // главный водяной соленоид
const int solenoidBrownCon = 35; // соленоид коричневого концентрата
const int solenoidGreenCon = 36; // соленоид зеленого концентрата
const int solenoidYellowCon = 37; // соленоид желтого концентрата
// 6. Другие расположения контактов & Переменные (спросите об этом)
bool dispensing = false; // дозатор активен?
float flow_duration = 0; // продолжительность выдачи
float capacity = 0;
/*********************************************************************************************************************************/
void setup()
{
// Настройка Nextion & Настройка связи
myNex.begin(9600); // Сенсорный экран со скоростью передачи данных 9600 бод
waitSecs(1); // Пользовательская функция ожидания (функция задержки глючная)
Serial.begin(9600); // Подключаемся к ноутбуку со скоростью 9600 бод
// Объявления выводов насоса (4)
pinMode(pumpBROWN, OUTPUT); // Устанавливаем КОРИЧНЕВЫЙ насос в качестве ВЫХОДА
pinMode(pumpGREEN, OUTPUT); // Устанавливаем ЗЕЛЕНЫЙ pumpPin как ВЫХОД
pinMode(pumpYELLOW, OUTPUT); // Устанавливаем ЖЕЛТЫЙ pumpPin как ВЫХОД
pinMode(pumpBLUE, OUTPUT); // Устанавливаем СИНИЙ pumpPin как ВЫХОД
// Объявления соленоида (8)
pinMode(WipeDisp, OUTPUT); // Устанавливаем WipeDisp как ВЫХОД
pinMode(solenoidWaterForCon, OUTPUT); // Устанавливаем соленоидWaterForCon как ВЫХОД
pinMode(solenoidWaterDisp, OUTPUT); // Устанавливаем соленоидWaterDisp как ВЫХОД
pinMode(solenoidSteam, OUTPUT); // Устанавливаем соленоидSteam как ВЫХОД
pinMode(solenoidMASTER, OUTPUT); // Устанавливаем соленоидMASTER как ВЫХОД
pinMode(solenoidBrownCon, OUTPUT); // Устанавливаем соленоидBrownCon как ВЫХОД
pinMode(solenoidGreenCon, OUTPUT); // Устанавливаем соленоидGreenCon как ВЫХОД
pinMode(solenoidYellowCon, OUTPUT); // Устанавливаем соленоидYellowCon как ВЫХОД
// Отключение всех насосов/соленоидов (12)
digitalWrite(pumpBROWN, HIGH);
digitalWrite(pumpGREEN, HIGH);
digitalWrite(pumpYELLOW, HIGH);
digitalWrite(pumpBLUE, HIGH);
digitalWrite(WipeDisp, HIGH);
digitalWrite(solenoidWaterForCon, HIGH);
digitalWrite(solenoidWaterDisp, HIGH);
digitalWrite(solenoidSteam, HIGH);
digitalWrite(solenoidMASTER, HIGH);
digitalWrite(solenoidBrownCon, HIGH);
digitalWrite(solenoidGreenCon, HIGH);
digitalWrite(solenoidYellowCon, HIGH);
}
/*********************************************************************************************************************************/
void loop() {
// Следующий
myNex.NextionListen(); // Проверяем следующий ввод
if (dispensing) // Если активная подача воды
{
waitSecs(5);
}
}
/*********************************************************************************************************************************/
// Ниже приведены пользовательские функции для основного кода:
void waitSecs(float secs) {
unsigned long start_time = millis();
while ((millis() - start_time) < (secs * 1000)) {
continue;
}
}
// Следующие триггерные функции
/*********************************************************************************************************************************/
/*********************************************************************************************************************************/
// Начало подачи воды 16 унций 16 унций ВОДЫ
// Если воды достаточно, включаем дозатор
// Из следующего: 23 02 54 00
void trigger0() {
digitalWrite(pumpBLUE, LOW); // Включаем насос
digitalWrite(solenoidWaterDisp, LOW); // Открываем соленоид
dispensing = true;
}
// Конечная подача воды 16 унций
// Из следующего: 23 02 54 01
void trigger1() {
// Отключить дозатор
digitalWrite(pumpBLUE, HIGH); // ВЫКЛЮЧАЕМ насос
digitalWrite(solenoidWaterDisp, HIGH); // ЗАКРЫТЬ соленоид
dispensing = false;
waitSecs(0.5);
}
/*********************************************************************************************************************************/
// Начало подачи воды 24 унции 24 унции ВОДЫ
// Если воды достаточно, включаем дозатор
// Из следующего: 23 02 54 02
void trigger2() {
digitalWrite(pumpBLUE, LOW); // Включаем насос
digitalWrite(solenoidWaterDisp, LOW); // Открываем соленоид
dispensing = true;
}
// Конечная подача воды 24 унции
// Из следующего: 23 02 54 03
void trigger3() {
// Отключить дозатор
digitalWrite(pumpBLUE, HIGH); // ВЫКЛЮЧАЕМ насос
digitalWrite(solenoidWaterDisp, HIGH); // ЗАКРЫТЬ соленоид
dispensing = false;
waitSecs(0.5);
}
/*********************************************************************************************************************************/
// Начало подачи воды 32 унции 32 унции ВОДЫ
// Если воды достаточно, включаем дозатор
// Из следующего: 23 02 54 04
void trigger4() {
digitalWrite(pumpBLUE, LOW); // Включаем насос
digitalWrite(solenoidWaterDisp, LOW); // Открываем соленоид
dispensing = true;
}
// Конечная подача воды 32 унции
// Из следующего: 23 02 54 05
void trigger5() {
// Отключить дозатор
digitalWrite(pumpBLUE, HIGH); // ВЫКЛЮЧАЕМ насос
digitalWrite(solenoidWaterDisp, HIGH); // ЗАКРЫТЬ соленоид
dispensing = false;
waitSecs(0.5);
}
/*********************************************************************************************************************************/
// Начало подачи воды 40 унций 40 унций ВОДЫ
// Если воды достаточно, включаем дозатор
// Из следующего: 23 02 54 06
void trigger6() {
digitalWrite(pumpBLUE, LOW); // Включаем насос
digitalWrite(solenoidWaterDisp, LOW); // Открываем соленоид
dispensing = true;
}
// Конечная подача воды 40 унций
// Из следующего: 23 02 54 07
void trigger7() {
// Отключить дозатор
digitalWrite(pumpBLUE, HIGH); // ВЫКЛЮЧАЕМ насос
digitalWrite(solenoidWaterDisp, HIGH); // ЗАКРЫТЬ соленоид
dispensing = false;
waitSecs(0.5);
}
Базовый код отказоустойчивости:
// Этот конкретный скетч отключил плату реле насоса (загорелись красные индикаторы). Реле активно ВЫСОКИЙ. Используйте этот код в качестве основы для остальной части скетча.
// ПРИМЕЧАНИЯ: необходимо вручную нажать кнопку сброса на плате, чтобы код выполнился???
// насосы, соленоиды и пароварка активны НИЗКИЙ уровень
const int pumpBROWN = 24; // КОРИЧНЕВЫЙ кон. насос
const int pumpGREEN = 25; // ЗЕЛЕНЫЙ кон. насос
const int pumpYELLOW = 26; // ЖЕЛТЫЙ кон. насос
const int pumpBLUE = 27; // СИНИЙ (водяной) насос
const int solenoidWaterDisp = 32; // обычный диспенсер для воды
void setup() {
pinMode(pumpBROWN, OUTPUT); // Устанавливаем pumpPin как ВЫХОД
pinMode(pumpGREEN, OUTPUT); // Устанавливаем pumpPin как ВЫХОД
pinMode(pumpYELLOW, OUTPUT); // Устанавливаем pumpPin как ВЫХОД
pinMode(pumpBLUE, OUTPUT); // Устанавливаем pumpPin как ВЫХОД
pinMode(solenoidWaterDisp, OUTPUT); // Устанавливаем pumpPin как ВЫХОД
// Немедленно отключаем все насосы
digitalWrite(pumpBROWN, HIGH); // Выключаем насос
digitalWrite(pumpGREEN, HIGH); // Выключаем насос
digitalWrite(pumpYELLOW, HIGH); // Выключаем насос
digitalWrite(pumpBLUE, HIGH); // Выключаем насос
}
void loop() {
digitalWrite(solenoidWaterDisp, LOW); // Включаем соленоид
digitalWrite(pumpBLUE, LOW); // Включаем насос
delay(60000);
digitalWrite(pumpBLUE, HIGH); // Выключаем насос
digitalWrite(solenoidWaterDisp, HIGH); // Выключаем насос
while (1) {
// Ничего не делать, просто оставаться в этом состоянии до сброса
}
}
@Jacie Graber, 👍-1
Обсуждение1 ответ
Ваш флаг выдачи установлен в значение true при запуске выдачи воды, но он не сбрасывается в значение false после завершения выдачи в ваших триггерных функциях. Обязательно задайте dispensing = false в конце каждого процесса выдачи.
- Цикл Arduino над функцией всегда отображает 0 в качестве конечных значений.
- Как заставить 5-вольтовое реле работать с NodeMCU
- Когда следует использовать транзистор, МОП-транзистор, а когда следует использовать реле?
- Причины, по которым нельзя подключать реле непосредственно к цифровому контакту Arduino
- Проблема с датчиком температуры и влажности DHT11
- Esp8266 Vin контакт
- Получение ошибки ets 8 января 2013,rst cause:4,boot mode(1,6) wdt reset
- Правильный PIN для активации беспроводного реле с ESP8266 ESP-01
работает ли «предыдущий код» так, как ожидалось? ... пожалуйста, добавьте «предыдущий код» в свое сообщение, @jsotola
В setup() вашего основного кода реле отключаются, устанавливая на их контакты высокий уровень. После setup() автоматически вызывается функция Loop(), но в Loop() нет ничего, что могло бы управлять реле. Как вы ожидаете, что реле будут работать? Похоже, вы ожидаете, что эта функция
myNex.NextionListen()
каким-то образом будет вызывать такие функции, какtrigger0()
, но неясно, как это сделать., @6v6gtПри использовании дисплея Nextion вам необходимо настроить сопоставление между объектами на экране и функциями вашей программы. Пример см. здесь: https://randomnerdtutorials.com/nextion-display-with-arduino-getting-started/. Похоже, что это сопоставление отсутствует в вашем коде., @6v6gt