ЭЛЕКТРОНИКА Автоматика для рефракционной колонны

Pupsoid

✩✩✩✩✩✩✩
12 Авг 2020
2
0
Всем доброго времени суток!
Имеется вот такой код и НАНОдуня, дуня управляет клапанами воды и отбором , а так же реле тэнов....всю голову сломал, то-ли я дурак то-ли одно из двух)) категорический отказывается работать библиотека GyverButton, всё компилируется без ошибок, всё заливается в дуню, обычные кнопки без библиотеки работают норм, библиотечные "нивкакую"((( работа с библиотекой лежит в процедуре WorkButt

alcoholV2:
//подлючение нужных библиотек
#include <Time.h>
#include "RTClib.h"
#include <Wire.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
#include <DallasTemperature.h>
#include <GyverTimer.h>
#include <GyverButton.h>

//подключение и объявление адреса дисплея
LiquidCrystal_I2C lcd(0x3F, 16, 2);

//назначение портов
#define KNOPKA_RESUME A0 // кнопка продолжения прораммы и сброса таймеров подключена на 2 пин (BTN_PIN --- КНОПКА --- GND)
#define TEN_1 3 //Тэн 1квт подключен на 3 пин
#define TEN_12 4 //Тэн 1,2квт подключен на 4 пин
#define TEN_2 5 //Тэн 2квт подключен на 5 пин
#define KRAN_GL 6 //Кран "голов" подключен на 6 пин
#define KRAN_HV 7 //Кран "хвостов" подключен на 7 пин
#define KRAN_VD 8 //Кран "воды" подключен на 8 пин
#define BEEPER 9 //Пьезо динамик подключен на 9 пин
#define UROVEN 10 //Датчик уровня воды подключен на 10
#define ONE_WIRE_BUS 11 // Датчик температуры подключен на 11 пин
#define BEEPER_RELE 12 // Реле бипера
#define DEBOUNCE 100
#define KNOPKA_STAGE 2   // кнопка выбора стадии (BTN_PIN --- КНОПКА --- GND)
#define KNOPKA_STOP A1   // кнопка СТОП (BTN_PIN --- КНОПКА --- GND)


//объявление переменных таймеров
GTimer Timer5(MS);
GTimer Timer60(MS);
GTimer Timer90(MS);
GButton buttstage(KNOPKA_STAGE);
GButton buttstop(KNOPKA_STOP);

//подключение часов реального времени (в будующих версиях)
RTC_DS1307 rtc;

//объявление переменных используемых в программе
boolean TEN_1Flag, TEN_12Flag, TEN_2Flag, KRAN_GLFlag, KRAN_HVFlag, KRAN_VDFlag, beeperFlag, workoffFlag, urovenFlag;
boolean KNOPKA_RESUMEState, KNOPKA_RESUMEFlag;
boolean Stage1Flag, Stage2Flag, Stage3Flag;
unsigned long debounceTimer;
int temp1;
int temp2;
int tempoffall;
int currenttemp;
long interval = 1000;

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensor(&oneWire);

//Загрузка основной части программы, установка начальных параметров
void setup() {
  sensor.begin();
  sensor.setResolution(12);
  OneWire oneWire(ONE_WIRE_BUS);
  DallasTemperature sensor(&oneWire);
  Serial.begin(9600);
  pinMode(KNOPKA_RESUME, INPUT_PULLUP);
  pinMode(UROVEN, INPUT_PULLUP);
  pinMode(TEN_1, OUTPUT);
  pinMode(TEN_12, OUTPUT);
  pinMode(TEN_2, OUTPUT);
  pinMode(KRAN_GL, OUTPUT);
  pinMode(KRAN_HV, OUTPUT);
  pinMode(KRAN_VD, OUTPUT);
  pinMode(BEEPER, OUTPUT);
  pinMode(BEEPER_RELE, OUTPUT);
  digitalWrite(KRAN_GL, HIGH);
  digitalWrite(KRAN_HV, HIGH);
  digitalWrite(KRAN_VD, HIGH);
  digitalWrite(TEN_1, HIGH);
  digitalWrite(TEN_12, HIGH);
  digitalWrite(TEN_2, HIGH);
  digitalWrite(BEEPER_RELE, HIGH);
  lcd.init();
  lcd.backlight();

  // первонаяальная установка флагов и переменных
  temp1 = 65;
  temp2 = 93;
  tempoffall = 97;
  TEN_1Flag = false;
  TEN_12Flag = false;
  TEN_2Flag = false;
  workoffFlag = false;
  KRAN_GLFlag = false;
  KRAN_HVFlag = false;
  KRAN_VDFlag = false;
  beeperFlag = false;
  urovenFlag = false;
  Stage1Flag = false;
  Stage2Flag = false;
  Stage3Flag = false;
}


//Работа основного кода программы
void loop() {
  serialprint();
  ekran ();
  workTen ();
  workKran ();
  workBeep ();
  //workFlagsTemp (); отключено в данной версии
  workTemp ();
  Stage1 ();
  Stage2 ();
  Stage3 ();
  Alarm ();
  WorkButt ();
}

//Процедура работы разгона колонны

void Stage1 () {
  if (Stage1Flag == true)
  {
    TEN_2Flag = true;
  }
  if (Stage1Flag == true && currenttemp >= 65 && TEN_2Flag == true)
  {
    TEN_2Flag = false;
    TEN_1Flag = true;
    KRAN_VDFlag = true;
    Timer60.setTimeout(3600000);
  }
  if (Stage1Flag == true && TEN_1Flag == true && KRAN_VDFlag == true && Timer60.isReady() == true)
  {
    beeperFlag = true;
    Timer5.setTimeout(300000);
  }

  if (Stage1Flag == true && TEN_1Flag == true && KRAN_VDFlag == true && Timer5.isReady() == false && beeperFlag == true && KNOPKA_RESUMEFlag == true)
  {
    Stage1Flag = false;
    Stage2Flag = true;
    Stage3Flag = false;
  }

  if (Stage1Flag == true && TEN_1Flag == true && KRAN_VDFlag == true && Timer5.isReady() == true && beeperFlag == true)
  {
    workoffFlag = true;
  }
}

//Процедура работы отбора голов и тела

void Stage2 () {
  if (Stage2Flag == true)
  {
    KRAN_GLFlag = true;
    Timer90.setTimeout(5400000);
  }

  if (Stage2Flag == true && KRAN_GLFlag == true && Timer90.isReady() == true && TEN_1Flag == true)
  {
    TEN_1Flag = false;
    TEN_12Flag = true;
    Timer5.setTimeout(300000);
    beeperFlag = true;
  }

  if (Stage2Flag == true && TEN_12Flag == true && KRAN_VDFlag == true && Timer5.isReady() == false && beeperFlag == true && KNOPKA_RESUMEFlag == true)
  {
    Stage1Flag = false;
    Stage2Flag = false;
    Stage3Flag = true;
  }

  if (Stage2Flag == true && TEN_12Flag == true && KRAN_VDFlag == true && Timer5.isReady() == true && beeperFlag == true)
  {
    workoffFlag = true;
  }

}

//Процедура работы отбора хвостов и отключения системы

void Stage3 () {
  if (Stage3Flag == true && currenttemp >= temp2 && currenttemp < tempoffall)
  {
    KRAN_GLFlag = false;
    KRAN_HVFlag = true;
  }

  if (Stage3Flag == true && currenttemp >= temp2 && currenttemp > tempoffall)
  {
    TEN_12Flag = false;
    Timer5.setTimeout(300000);
  }

  if (Stage3Flag == true && TEN_12Flag == false && KRAN_VDFlag == true && Timer5.isReady() == true)
  {
    KRAN_VDFlag = false;
    workoffFlag = true;
  }
}

//Процедура работы тенов в зависимости от флагов

void workTen () {
  if (TEN_1Flag == true)
  {
    digitalWrite (TEN_1, LOW);
  }
  else
  {
    digitalWrite (TEN_1, HIGH);
  }

  if (TEN_12Flag == true)
  {
    digitalWrite (TEN_12, LOW);
  }
  else
  {
    digitalWrite (TEN_12, HIGH);
  }
  if (TEN_2Flag == true)
  {
    digitalWrite (TEN_2, LOW);
  }
  else
  {
    digitalWrite (TEN_2, HIGH);
  }
  if (workoffFlag == true)
  {
    digitalWrite (TEN_1, HIGH);
    digitalWrite (TEN_12, HIGH);
    digitalWrite (TEN_2, HIGH);
  }
}

//Процедура работы кранов в зависимости от флагов

void workKran () {
  if (KRAN_GLFlag == true)
  {
    digitalWrite (KRAN_GL, LOW);
  }
  else
  {
    digitalWrite (KRAN_GL, HIGH);
  }
  if (KRAN_HVFlag == true)
  {
    digitalWrite (KRAN_HV, LOW);
  }
  else
  {
    digitalWrite (KRAN_HV, HIGH);
  }
  if (KRAN_VDFlag == true)
  {
    digitalWrite (KRAN_VD, LOW);
  }
  else
  {
    digitalWrite (KRAN_VD, HIGH);
  }
  if (workoffFlag == true)
  {
    digitalWrite (KRAN_GL, HIGH);
    digitalWrite (KRAN_HV, HIGH);
    digitalWrite (KRAN_VD, HIGH);
  }
}

//Процедура работы Бипера

void workBeep () {
  if (beeperFlag == true) {
    tone(BEEPER, 1000);
  }
  else {
    noTone(BEEPER);
  }

  if (urovenFlag == true) {
    tone(BEEPER, 1000);
  }
  else {
    noTone(BEEPER);
  }

  KNOPKA_RESUMEState = !digitalRead(KNOPKA_RESUME);  // читаем состояние кнопки с инверсией. 1 - нажата, 0 - нет // если нажата и была отпущена (KNOPKA_RESUMEFlag 0) и прошло не менее DEBOUNCE времени
  if (KNOPKA_RESUMEState && !KNOPKA_RESUMEFlag && (millis() - debounceTimer > DEBOUNCE)) {
    KNOPKA_RESUMEFlag = true;              // запомнили что нажата
    debounceTimer = millis();    // запомнили время нажатия
  }
  if (!KNOPKA_RESUMEState && KNOPKA_RESUMEFlag) {    // если отпущена и была нажата (KNOPKA_RESUMEFlag 1)
    KNOPKA_RESUMEFlag = false;             // запомнили что отпущена
    debounceTimer = millis();    // запомнили время отпускания
  }
  if (KNOPKA_RESUMEFlag == true) {
    beeperFlag = false;
    urovenFlag = false;
  }
}

//Процедура работы экрана

void ekran () {
  // Print a message to the LCD.
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("C:");
  lcd.setCursor(2, 0);
  lcd.print(currenttemp);
  lcd.setCursor(5, 0);
  lcd.print("T1:");
  lcd.setCursor(8, 0);
  lcd.print(TEN_1Flag);
  lcd.setCursor(10, 0);
  lcd.print("T2:");
  lcd.setCursor(13, 0);
  lcd.print(TEN_12Flag);
  lcd.setCursor(0, 1);
  lcd.print("K1:");
  lcd.setCursor(3, 1);
  lcd.print(KRAN_GLFlag);
  lcd.setCursor(5, 1);
  lcd.print("K2:");
  lcd.setCursor(8, 1);
  lcd.print(KRAN_HVFlag);
  lcd.setCursor(10, 1);
  lcd.print("OFF:");
  lcd.setCursor(14, 1);
  lcd.print(workoffFlag);
}

//Процедура работы датчика температуры

void workTemp () {
  // переменная для хранения температуры
  float temperature;
  // отправляем запрос на измерение температуры
  sensor.requestTemperatures();
  // считываем данные из регистра датчика
  temperature = sensor.getTempCByIndex(0);
  // выводим температуру в Serial-порт
  Serial.print("Temp C: ");
  Serial.println(temperature);
  currenttemp = temperature;
  }

//Процедура работы сериалпорта

void serialprint () {
  Serial.print("t1: ");
  Serial.println(TEN_1Flag);
  Serial.print("t1_2: ");
  Serial.println(TEN_12Flag);
  Serial.print("t2: ");
  Serial.println(TEN_2Flag);
  Serial.print("KRAN_GL: ");
  Serial.println(KRAN_GLFlag);
  Serial.print("KRAN_HV: ");
  Serial.println(KRAN_HVFlag);
  Serial.print("KRAN_VD: ");
  Serial.println(KRAN_VDFlag);
  Serial.print("Off: ");
  Serial.println(workoffFlag);
  Serial.print("Stage1: ");
  Serial.println(Stage1Flag);
  Serial.print("Stage2: ");
  Serial.println(Stage2Flag);
  Serial.print("Stage3: ");
  Serial.println(Stage3Flag);
  Serial.print("beeper: ");
  Serial.println(beeperFlag);
  Serial.print("Uroven: ");
  Serial.println(urovenFlag);
  Serial.print("Knopka resume: ");
  Serial.println(KNOPKA_RESUMEFlag);

}

//Процедура защиты системы

void Alarm () {
  if (currenttemp >= 99)
  {
    beeperFlag = true;
  }
    if (digitalRead(UROVEN)) {
    urovenFlag = true;
  }
  else
  {
    urovenFlag = false;
  }

  if (beeperFlag == true)
  {
    digitalWrite (BEEPER_RELE, LOW);
  }
  else
  {
    digitalWrite (BEEPER_RELE, HIGH);
  }

  if (workoffFlag == true)
  {
    Stage1Flag = false;
    Stage2Flag = false;
    Stage3Flag = false;
  }

}

void WorkButt () {
  buttstage.tick();
  if (buttstage.isSingle()) {
    Stage1Flag = true; // проверка на один клик и запуск стадии 1
    Serial.println("Single");
  }
  if (buttstage.isDouble()) {
    Stage2Flag = true; // проверка на двойной клик и запуск стадии 2
  }
  if (buttstage.isTriple()) {
    Stage3Flag = true; // проверка на тройной клик и запуск стадии 3
  }
  buttstop.tick();
  if (buttstop.isSingle()) {
    workoffFlag = true;     // проверка на один клик и остановка всего
  }
}

куда копать?
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
208
Для начала сделать простейший скетч и схему с одной гайвер-кнопкой и добиться, чтоб всё работало.