Реле не включаются/отключаются при первоначальном запросе в коде настройки для 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) {
    // Ничего не делать, просто оставаться в этом состоянии до сброса
  }
}

, 👍-1

Обсуждение

работает ли «предыдущий код» так, как ожидалось? ... пожалуйста, добавьте «предыдущий код» в свое сообщение, @jsotola

В setup() вашего основного кода реле отключаются, устанавливая на их контакты высокий уровень. После setup() автоматически вызывается функция Loop(), но в Loop() нет ничего, что могло бы управлять реле. Как вы ожидаете, что реле будут работать? Похоже, вы ожидаете, что эта функция myNex.NextionListen() каким-то образом будет вызывать такие функции, как trigger0(), но неясно, как это сделать., @6v6gt

При использовании дисплея Nextion вам необходимо настроить сопоставление между объектами на экране и функциями вашей программы. Пример см. здесь: https://randomnerdtutorials.com/nextion-display-with-arduino-getting-started/. Похоже, что это сопоставление отсутствует в вашем коде., @6v6gt


1 ответ


0

Ваш флаг выдачи установлен в значение true при запуске выдачи воды, но он не сбрасывается в значение false после завершения выдачи в ваших триггерных функциях. Обязательно задайте dispensing = false в конце каждого процесса выдачи.

,