Регулятор давления для скважены

Тема в разделе "Arduino & Shields", создана пользователем Дмитрий76, 5 апр 2017.

  1. Дмитрий76

    Дмитрий76 Нерд

    Доброе время суток. Господа Помогите доделать скеч. Нужно создать меню для настройки нижнего и верхнего придела включения и выключения. Кто может подскажите куда копать дальше. Проект делаю в первый раз. Не пинайте сильно.
    Заранее спасибо.
    Код (C++):
    /* адрес eeprom
      Давление
      EEPROM 0 Минимальное значение давления
      EEPROM 1 Максимальное значение давления
    */


    // Подключаем библиотеки:
    //*****************************************
    //#include <EEPROM.h>                        // подключаем библиотеку для работы с EEPROM
    #include <Wire.h>                            // подключаем библиотеку для работы с шиной I2C
    #include "LCD_1602_RUS.h"                    // подключаем библиотеку для работы с LCD дисплеем с русским языком
    //*****************************************

    LCD_1602_RUS lcd(0x3F, 20, 4);               // объявляем  переменную для работы с LCD дисплеем
    //*****************************************

    int sensor = A1;                             // Пин датчика давления "аналоговый"
    int dig_out;
    int RelePin = 10;                            // Пин реле "насоса"
    int ledPin_Rele = 11;                        // Пин светодиода "вклюсение насоса" автоматический режим
    int ledPin_Error = 12;                       // Пин светодиода "авария насоса"
    int ledPin_Rele_manual = 13;                 // Пин светодиода "вклюсение насоса" ручной режим
    int buttonPin_manual = 2;                    // Пин кнопка "вклюсение насоса" ручной режим
    int buttonPin_SET = 3;                       // Пин кнопка "SET"
    int buttonPin_UP = 4;                        // Пин кнопка "UP"
    int buttonPin_DOWN = 5;                      // Пин кнопка "DOWN"
    int val = 0;

    //*****************************************
    void setup()
    {
      pinMode(RelePin, OUTPUT);                  // устанавливает режим работы - выход
      pinMode(ledPin_Rele, OUTPUT);              // устанавливает режим работы - выход
      pinMode(ledPin_Error, OUTPUT);             // устанавливает режим работы - выход
      pinMode(ledPin_Rele_manual, OUTPUT);       // устанавливает режим работы - выход
      pinMode(buttonPin_manual, INPUT);          // устанавливает режим работы - вход
      pinMode(buttonPin_SET, INPUT);             // устанавливает режим работы - вход
      pinMode(buttonPin_UP, INPUT);              // устанавливает режим работы - вход
      pinMode(buttonPin_DOWN, INPUT);            // устанавливает режим работы - вход
      pinMode(sensor, INPUT);                    // устанавливает режим работы - выход
      {
        lcd.init();                              // инициируем LCD дисплей
        lcd.backlight();                         // включаем подсветку LCD дисплея
        Serial.begin(9600);
      }
    }
    void loop()
    {
      float dig_out = analogRead(sensor = A1);    // Считываем входное напряжение
      dig_out = dig_out * 5.0 / 1024.0;           // Преобразуем значение
      dig_out = 1.111 * dig_out - 0.555;

      if (dig_out < 0 )
    {
        ('-', false);
        dig_out *= 0;

      }
          val = digitalRead(buttonPin_manual);       // нажата кнопка "вклюсение насоса" ручной режим
          digitalWrite(RelePin, val);                // включает реле
          digitalWrite(ledPin_Rele_manual, val);     // включаем светодиод

          //******************************************
          Serial.println(dig_out);
          lcd.setCursor(1, 0);
          lcd.print(L"РЕЛЕ ДАВЛЕНИЯ");            // Выводим надпись
          lcd.setCursor(0, 2);
          lcd.print("MPa");                            // Выводим надпись
          lcd.setCursor(8, 2);
          lcd.print("MPa");                            // Выводим надпись
          lcd.setCursor(16, 2);
          lcd.print("MPa");                            // Выводим надпись
          lcd.setCursor(8, 3);
          lcd.print(dig_out);                          // Выводим давление

          delay(500);                                  // Время задержки
        }
     
  2. qwone

    qwone Гик

    А у вас там косяк на косяке. Сначало надо косяки поубирать.
    Код (C++):
    /* адрес eeprom
      Давление
      EEPROM 0 Минимальное значение давления
      EEPROM 1 Максимальное значение давления
    */

    //#include <EEPROM.h>
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>

    LiquidCrystal_I2C lcd(0x27 , 16, 2);
    //*****************************************

    int sensor_pin = A1;          // Пин датчика давления
    int pressure;                 // величина давления
    const int pressure_max = 900; // величина давления максимумально возможное
    const int pressure_min = 300; // величина давления минимально возможное
    int pressure_ON = 400;        // величина давления когда насос сам вкл
    int pressure_OFF = 700;       // величина давления когда насос сам выкл

    int pump_pin = 10;       // Пин реле "насоса"
    bool high = 0;           // уровень вкл насоса
    int Error_Led_pin = 12;  // Пин светодиода "авария насоса"

    byte Auto_Led_pin = 11;   // Пин светодиода "включение насоса" автоматический режим
    byte Manual_Led_pin = 13; // Пин светодиода "включение насоса" ручной режим
    byte Manual_btn_pin = 2;  // Пин кнопки перек режима  "Авто-Ручной" ручной режим
    bool mode_avto = 1; // 0 ручной /1 автомат

    byte Set_btn_pin = 3;     // Пин кнопка "SET"
    byte Up_btn_pin = 4;      // Пин кнопка "UP" / "ON_PUMP"
    byte Down_btn_pin = 5;    // Пин кнопка "DOWN"/"OFF_PUMP"


    //*****************************************
    void setup() {
      Serial.begin(9600);
      lcd.init();                     // инициируем LCD дисплей
      lcd.backlight();                // включаем подсветку LCD дисплея
      pinMode(sensor_pin, INPUT);     // устанавливает режим работы - выход

      pinMode(pump_pin, OUTPUT);       // устанавливает режим работы - выход
      pinMode(Error_Led_pin, OUTPUT);  // устанавливает режим работы - выход

      pinMode(Auto_Led_pin, OUTPUT);   // устанавливает режим работы - выход
      pinMode(Manual_Led_pin, OUTPUT); // устанавливает режим работы - выход
      pinMode(Manual_btn_pin, INPUT);  // устанавливает режим работы - вход

      pinMode(Set_btn_pin, INPUT);     // устанавливает режим работы - вход
      pinMode(Up_btn_pin, INPUT);      // устанавливает режим работы - вход
      pinMode(Down_btn_pin, INPUT);    // устанавливает режим работы - вход
    }
    void loop() {
      delay(500);                                // Время задержки
      pressure = analogRead(sensor_pin = A1);    // Считываем входное напряжение
      Serial.println(pressure);
      lcd.setCursor(1, 0);
      lcd.print("PRESSURE SWITCH");               // Выводим надпись
      lcd.setCursor(8, 3);
      lcd.print(pressure);                        // Выводим давление
      if (mode_avto) {
        if ( pressure < pressure_ON)digitalWrite(pump_pin, high);
        if ( pressure > pressure_OFF)digitalWrite(pump_pin, !high);
      }
    }
    Ну там дальше чистить и чистить.
     
    Последнее редактирование: 6 апр 2017
  3. Дмитрий76

    Дмитрий76 Нерд

    Спорить не буду, косяки наверняка есть. В программировании не селен. Пытаюсь но не все и сразу получается. Если можете, ткните носом на ошибки. Просто вроде работает и давление показывает. Но без ошибок не научится.
     
  4. serg_admin

    serg_admin Гик

    Если поставить два энкодера то меню для настройки вообще не нужно.
     
  5. Дмитрий76

    Дмитрий76 Нерд

    Скеч писать все равно нужно.
     
  6. qwone

    qwone Гик

    Ну конечно меню там еще нет. Да и собрать , отладить надо. А так должно работать . Пакет здесь https://yadi.sk/d/LsRWQgdC3GjG2r
    Код (C++):
    /* pressure_swith.ino
      реле насоса              -> 10  1  вкл / 1 откл
      светодиод авто. режим    -> 11  1  вкл / 1 откл
      светодиод работа насоса  -> 12  1  вкл / 1 откл
      светодиод ручной. режим  -> 13  1  вкл / 1 откл
      датчик давления          -> A1  0 нажата / 1 нет
      кнопка "Auto-Manual"     -> 2   0 нажата / 1 нет
      кнопка "SET"             -> 3   0 нажата / 1 нет
      кнопка "UP" / "ON_PUMP"  -> 4   0 нажата / 1 нет
      кнопка "DOWN"/"OFF_PUMP" -> 5   0 нажата / 1 нет
      Давление
      EEPROM 0 Минимальное значение давления
      EEPROM 1 Максимальное значение давления
    */

    int pressure;                 // величина давления
    const int pressure_max = 900; // величина давления максимумально возможное
    const int pressure_min = 300; // величина давления минимально возможное
    int pressure_ON = 400;        // величина давления когда насос сам вкл
    int pressure_OFF = 700;       // величина давления когда насос сам выкл
    const byte delta = 5; // минимальное расстояние между pressure_ON и pressure_OFF
    void pressure_ON_plus() {
      ++pressure_ON;
      if (pressure_ON > (pressure_OFF - delta))pressure_ON = pressure_OFF - delta;
    }
    void pressure_ON_minus() {
      --pressure_ON;
      if (pressure_ON < pressure_min)pressure_ON = pressure_min;
    }
    void pressure_OFF_plus() {
      ++pressure_OFF;
      if (pressure_OFF > pressure_max)pressure_OFF = pressure_max;
    }
    void pressure_OFF_minus() {
      --pressure_OFF;
      if (pressure_OFF < (pressure_ON + delta))pressure_OFF = pressure_ON + delta;
    }
    bool mode_Auto = 0 ;// 0 ручной режим / 1 автомат
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27 , 16, 2);
    // шины выхода
    #include "Cl_digitalOut.h"
    Cl_digitalOut Out[] = {
      Cl_digitalOut(10) , // 0- выход 10  реле насоса
      Cl_digitalOut(11) , // 1- выход 11  светодиод авто. режим
      Cl_digitalOut(12) , // 2- выход 12  светодиод авария насоса
      Cl_digitalOut(13)   // 3- выход 13  светодиод ручной. режим
    };
    // шины входа аналоговые
    #include "Cl_analogIn.h"
    Cl_analogIn aIn = Cl_analogIn(A1); // аналог.вход датчика давления
    // шины входа цифровые
    #include "Cl_digitalIn.h"
    Cl_digitalIn In[] = {
      Cl_digitalIn(2), //  0- вход 2  кнопка "Auto-Manual"
      Cl_digitalIn(3), //  1- вход 3  кнопка "SET"
      Cl_digitalIn(4), //  2- вход 4  кнопка "UP" / "ON_PUMP"
      Cl_digitalIn(5)  //  3- вход 5  кнопка "DOWN"/"OFF_PUMP"
    };
    // насос
    #include "Cl_led.h"
    Cl_led * Pump = new Cl_led(&Out[0], 1); // реле насоса

    // светодиоды
    Cl_led *Led[] = {
      new Cl_led(&Out[1], 1), //0- светодиод авто. режим
      new Cl_led(&Out[2], 1), //1- светодиод работа насоса
      new Cl_led(&Out[3], 1)  //2- светодиод ручной. режим
    };
    // кнопки
    void Do_Auto_Manual() {
      mode_Auto = !mode_Auto;
      if (mode_Auto) {
        Led[0]->ON(); Led[2]->OFF();
      }
      else {
        Led[0]->OFF(); Led[2]->ON();
      }
    }
    void Do_SET() {
    }
    void Do_UP_ON_PUMP() {
      if (!mode_Auto) {
        Pump->ON();
        Led[1]->ON();
      }
    }
    void Do_DOWN_OFF_PUMP() {
      if (!mode_Auto) {
        Pump->OFF();
        Led[1]->OFF();
      }
    }
    #include "Cl_do_btn.h"
    Cl_do_btn * Btn[] =  {
      new Cl_do_btn(&In[0] , 0, &Do_Auto_Manual ), //кнопка "Auto-Manual"     0 нажата / 1 нет
      new Cl_do_btn(&In[1] , 0, &Do_SET)         , //кнопка "SET"             0 нажата / 1 нет
      new Cl_do_btn(&In[2] , 0, &Do_UP_ON_PUMP ) , //кнопка "UP" / "ON_PUMP"  0 нажата / 1 нет
      new Cl_do_btn(&In[3] , 0, &Do_DOWN_OFF_PUMP), //кнопка "DOWN"/"OFF_PUMP" 0 нажата / 1 нет
    };
    // датчик давления
    void Do_change();
    #include "Cl_do_analog_sens.h"
    Cl_do_analog_sens * Sens = new Cl_do_analog_sens(&aIn, &Do_change);
    void Do_change() {
      pressure = Sens->value;
      lcd.clear();
      lcd.print(pressure);// Выводим давление
      if (mode_Auto) {
        if (pressure <= pressure_ON) {
          Pump->ON();
          Led[1]->ON();
        }
        if (pressure >= pressure_OFF) {
          Pump->OFF();
          Led[1]->OFF();
        }
      }
    }
    void setup() {
      //Serial.begin(9600);
      lcd.init();                     // инициируем LCD дисплей
      lcd.backlight();                // включаем подсветку LCD дисплея
      Sens->setup();
      Pump->setup();
      for (byte i = 0; i < 3; ++i)Led[i]->setup();
      for (byte i = 0; i < 4; ++i)Btn[i]->setup();
    }
    void loop() {
      Sens->loop();
      Pump->loop();
      for (byte i = 0; i < 3; ++i)Led[i]->loop();
      for (byte i = 0; i < 4; ++i)Btn[i]->loop();
    }
     
  7. Дмитрий76

    Дмитрий76 Нерд

    Попробовал сделать меню. Кнопки работают, ми и макс давление выставляется. Реле не срабатывает по давлению. Подскажите пожалуйста где снова на косячел ?
    Код (C++):
    // Подключаем библиотеки:
    //*****************************************
    #include <Wire.h>                            // подключаем библиотеку для работы с шиной I2C
    #include "LCD_1602_RUS.h"                    // подключаем библиотеку для работы с LCD дисплеем с русским языком
    //*****************************************

    LCD_1602_RUS lcd(0x3F, 20, 4);               // объявляем  переменную для работы с LCD дисплеем
    //*****************************************

    #define sensor_pin 1                             // Пин датчика давления "аналоговый"
    #define buttonPin_SET 3                      // Пин кнопка "SET"
    bool f_SET;
    #define buttonPin_UP 4                       // Пин кнопка "UP"
    bool f_UP;
    #define buttonPin_DOWN 5                     // Пин кнопка "DOWN"
    #define pump_pin 10                         // Пин реле "насоса"
    bool f_DOWN;
    int ekran = 0;                               //перем. ЭКРАНА
    float min_dig = 98;                          //Перем. Минимума
    float macs_dig = 104;                        //Перем. МАКСИМУМА
    unsigned long period;

    int pressure;                 // величина давления
    bool mode_avto = 1;           // 0 ручной /1 автомат
    bool high = 0;                // уровень вкл насоса

    //*****************************************
    void setup()
    {
      pinMode(buttonPin_SET, INPUT);             // устанавливает режим работы - вход
      pinMode(buttonPin_UP, INPUT);              // устанавливает режим работы - вход
      pinMode(buttonPin_DOWN, INPUT);            // устанавливает режим работы - вход
      pinMode(sensor_pin, INPUT);                // устанавливает режим работы - выход
      pinMode(pump_pin, OUTPUT);                 // устанавливает режим работы - выход
       
       lcd.init();                               // инициируем LCD дисплей
       lcd.backlight();                          // включаем подсветку LCD дисплея
     
     

    }
    void loop(){
      delay(500);                                // Время задержки
      pressure = analogRead(sensor_pin);    // Считываем входное напряжение
    //  }
    //{
      //Кнопкой SET переключаем экраны
      if (digitalRead(buttonPin_SET) == HIGH && f_SET == 0) {
        period = millis();
        ekran++;
        if (ekran > 2)ekran = 0;
        f_SET = 1;
        delay(500);
      }
      if (f_SET == 1 && digitalRead(buttonPin_SET) == LOW)f_SET = 0;

      //Кнопкой UP увеличуем установки в зависимости от екрана
      if (digitalRead(buttonPin_UP) == HIGH && f_UP == 0) {
        period = millis();
        if (ekran == 1)macs_dig++;
        if (ekran == 2)min_dig++;
        f_UP = 1;
        delay(500);
      }
      if (f_UP == 1 && digitalRead(buttonPin_UP == LOW))f_UP = 0;

      //Кнопкой DOWN уменьшаем установки в зависимости от екрана
      if (digitalRead(buttonPin_DOWN) == HIGH && f_DOWN == 0) {
        period = millis();
        if (ekran == 1)macs_dig--;
        if (ekran == 2)min_dig--;
        f_DOWN = 1;
        delay(500);
      }
      if (f_DOWN == 1 && digitalRead(buttonPin_DOWN == LOW))f_DOWN = 0;

      //Прошло 10 секунды без нажатий - включаем основной екран
      if (millis() - period >= 10000)ekran = 0;

    //******************************************
      if (ekran == 0) {
        lcd.setCursor(0, 0);
        lcd.print("  PRESSURE SWITCH  ");            // Выводим надпись
        lcd.setCursor(0, 2);
        lcd.print("MPa    ");                        // Выводим надпись
        lcd.setCursor(0, 3);
        lcd.print(min_dig);
        lcd.setCursor(8, 2);
        lcd.print("MPa     ");                       // Выводим надпись
        lcd.setCursor(8, 3);
        lcd.print(pressure);
        lcd.setCursor(16, 2);
        lcd.print("MPa");                           // Выводим надпись
        lcd.setCursor(15, 3);
        lcd.print(macs_dig);                         // Выводим давление
     
      }
      //Экран установки максимума, минимума
      if (ekran == 1) {
        lcd.setCursor(0, 0);
        lcd.print("       Maxsim       ");
        lcd.setCursor(0, 1);
        lcd.print(macs_dig); lcd.print("              ");
      }
      if (ekran == 2) {
        lcd.setCursor(0, 0);
        lcd.print("       Minimal      ");
        lcd.setCursor(0, 1);
        lcd.print(min_dig); lcd.print("              ");
        if (mode_avto) {
        if ( pressure <= min_dig)digitalWrite(pump_pin, high);
        if ( pressure >= macs_dig)digitalWrite(pump_pin, !high);
      }
    }
    }
     
     
  8. Дмитрий76

    Дмитрий76 Нерд

    Попробовал сделать меню. Кнопки работают, ми и макс давление выставляется. Реле не срабатывает по давлению. Подскажите пожалуйста где снова на косячел ?
    Код (C++):
    // Подключаем библиотеки:
    //*****************************************
    #include <Wire.h>                            // подключаем библиотеку для работы с шиной I2C
    #include "LCD_1602_RUS.h"                    // подключаем библиотеку для работы с LCD дисплеем с русским языком
    //*****************************************

    LCD_1602_RUS lcd(0x3F, 20, 4);               // объявляем  переменную для работы с LCD дисплеем
    //*****************************************

    #define sensor_pin 1                             // Пин датчика давления "аналоговый"
    #define buttonPin_SET 3                      // Пин кнопка "SET"
    bool f_SET;
    #define buttonPin_UP 4                       // Пин кнопка "UP"
    bool f_UP;
    #define buttonPin_DOWN 5                     // Пин кнопка "DOWN"
    #define pump_pin 10                         // Пин реле "насоса"
    bool f_DOWN;
    int ekran = 0;                               //перем. ЭКРАНА
    float min_dig = 98;                          //Перем. Минимума
    float macs_dig = 104;                        //Перем. МАКСИМУМА
    unsigned long period;

    int pressure;                 // величина давления
    bool mode_avto = 1;           // 0 ручной /1 автомат
    bool high = 0;                // уровень вкл насоса

    //*****************************************
    void setup()
    {
      pinMode(buttonPin_SET, INPUT);             // устанавливает режим работы - вход
      pinMode(buttonPin_UP, INPUT);              // устанавливает режим работы - вход
      pinMode(buttonPin_DOWN, INPUT);            // устанавливает режим работы - вход
      pinMode(sensor_pin, INPUT);                // устанавливает режим работы - выход
      pinMode(pump_pin, OUTPUT);                 // устанавливает режим работы - выход
       
       lcd.init();                               // инициируем LCD дисплей
       lcd.backlight();                          // включаем подсветку LCD дисплея
     
     

    }
    void loop(){
      delay(500);                                // Время задержки
      pressure = analogRead(sensor_pin);    // Считываем входное напряжение
    //  }
    //{
      //Кнопкой SET переключаем экраны
      if (digitalRead(buttonPin_SET) == HIGH && f_SET == 0) {
        period = millis();
        ekran++;
        if (ekran > 2)ekran = 0;
        f_SET = 1;
        delay(500);
      }
      if (f_SET == 1 && digitalRead(buttonPin_SET) == LOW)f_SET = 0;

      //Кнопкой UP увеличуем установки в зависимости от екрана
      if (digitalRead(buttonPin_UP) == HIGH && f_UP == 0) {
        period = millis();
        if (ekran == 1)macs_dig++;
        if (ekran == 2)min_dig++;
        f_UP = 1;
        delay(500);
      }
      if (f_UP == 1 && digitalRead(buttonPin_UP == LOW))f_UP = 0;

      //Кнопкой DOWN уменьшаем установки в зависимости от екрана
      if (digitalRead(buttonPin_DOWN) == HIGH && f_DOWN == 0) {
        period = millis();
        if (ekran == 1)macs_dig--;
        if (ekran == 2)min_dig--;
        f_DOWN = 1;
        delay(500);
      }
      if (f_DOWN == 1 && digitalRead(buttonPin_DOWN == LOW))f_DOWN = 0;

      //Прошло 10 секунды без нажатий - включаем основной екран
      if (millis() - period >= 10000)ekran = 0;

    //******************************************
      if (ekran == 0) {
        lcd.setCursor(0, 0);
        lcd.print("  PRESSURE SWITCH  ");            // Выводим надпись
        lcd.setCursor(0, 2);
        lcd.print("MPa    ");                        // Выводим надпись
        lcd.setCursor(0, 3);
        lcd.print(min_dig);
        lcd.setCursor(8, 2);
        lcd.print("MPa     ");                       // Выводим надпись
        lcd.setCursor(8, 3);
        lcd.print(pressure);
        lcd.setCursor(16, 2);
        lcd.print("MPa");                           // Выводим надпись
        lcd.setCursor(15, 3);
        lcd.print(macs_dig);                         // Выводим давление
     
      }
      //Экран установки максимума, минимума
      if (ekran == 1) {
        lcd.setCursor(0, 0);
        lcd.print("       Maxsim       ");
        lcd.setCursor(0, 1);
        lcd.print(macs_dig); lcd.print("              ");
      }
      if (ekran == 2) {
        lcd.setCursor(0, 0);
        lcd.print("       Minimal      ");
        lcd.setCursor(0, 1);
        lcd.print(min_dig); lcd.print("              ");
        if (mode_avto) {
        if ( pressure <= min_dig)digitalWrite(pump_pin, high);
        if ( pressure >= macs_dig)digitalWrite(pump_pin, !high);
      }
    }
    }
     
     
  9. Дмитрий76

    Дмитрий76 Нерд

    Огромное спасибо. Буду разбираться. :)
     
  10. qwone

    qwone Гик

    delay(500); это есть основное горе. От этого надо всегда избаляться. millis() использовать
    А мой стиль хотя и непривычен. Но позволяет мне легко модернизировать программу.
     
    Дмитрий76 нравится это.
  11. Дмитрий76

    Дмитрий76 Нерд

    Еще раз спасибо. Весь вечер сидел думал почему кнопки тормозят при нажатии. А дело было delay(500); всю голову сломал. :):mad:
     
  12. Дмитрий76

    Дмитрий76 Нерд

    qwone подскажи пожалуйста. Скеч залил но на экране тишина. Нет никаких надписей. Адрес поменял. Что не так делаю?
     
  13. qwone

    qwone Гик

    тишина. Значить давление не прыгает. Там только кнопки работают Автоматический -ручной светодиоды. В ручном мотор вкл, выкл . Повесте на А1 потенциометр(питание -А1-земля) и покрутите
    Данных нет, там в одной библиотеке у одной библиотеке тип bool, а надо int
     
    Последнее редактирование: 7 апр 2017
  14. Дмитрий76

    Дмитрий76 Нерд

    qwone добрый день. немного неправильно объяснил. на дисплее нет вообще никаких надписей в том числе и давления "lcd.print(pressure);" просто горит подсветка и все!

    Включаю монитор порта и тоже нет данных!
     
    Последнее редактирование: 7 апр 2017
  15. qwone

    qwone Гик

    Вот новый вариант https://yadi.sk/d/NlSAAsia3Gm5cV . Но что-то он плоховатенько работает, хотя меню там есть. Код рабочий
    Код (C++):
    /* pressure_swith_v2.ino
      реле насоса              -> 10  1  вкл / 1 откл
      светодиод авто. режим    -> 11  1  вкл / 1 откл
      светодиод работа насоса  -> 12  1  вкл / 1 откл
      светодиод ручной. режим  -> 13  1  вкл / 1 откл
      датчик давления          -> A1  0 нажата / 1 нет
      кнопка "Auto-Manual"     -> 2   0 нажата / 1 нет
      кнопка "SET"             -> 3   0 нажата / 1 нет
      кнопка "UP" / "ON_PUMP"  -> 4   0 нажата / 1 нет
      кнопка "DOWN"/"OFF_PUMP" -> 5   0 нажата / 1 нет
      Давление
      EEPROM 0 Минимальное значение давления
      EEPROM 1 Максимальное значение давления
    */

    //#1 menu
    #include "Cl_menu_A.h"
    bool mode_Auto = 0 ;// 0 ручной режим / 1 автомат
    // шины выхода
    #include "Cl_digitalOut.h"
    Cl_digitalOut Out[] = {
      Cl_digitalOut(10) , // 0- выход 10  реле насоса
      Cl_digitalOut(11) , // 1- выход 11  светодиод авто. режим
      Cl_digitalOut(12) , // 2- выход 12  светодиод авария насоса
      Cl_digitalOut(13)   // 3- выход 13  светодиод ручной. режим
    };
    // шины входа аналоговые
    #include "Cl_analogIn.h"
    Cl_analogIn aIn = Cl_analogIn(A1); // аналог.вход датчика давления
    // шины входа цифровые
    #include "Cl_digitalIn.h"
    Cl_digitalIn In[] = {
      Cl_digitalIn(2), //  0- вход 2  кнопка "Auto-Manual"
      Cl_digitalIn(3), //  1- вход 3  кнопка "SET"
      Cl_digitalIn(4), //  2- вход 4  кнопка "UP" / "ON_PUMP"
      Cl_digitalIn(5)  //  3- вход 5  кнопка "DOWN"/"OFF_PUMP"
    };
    // насос
    #include "Cl_led.h"
    Cl_led * Pump = new Cl_led(&Out[0], 0); // реле насоса

    // светодиоды
    Cl_led *Led[] = {
      new Cl_led(&Out[1], 1), //0- светодиод авто. режим
      new Cl_led(&Out[2], 1), //1- светодиод работа насоса
      new Cl_led(&Out[3], 1)  //2- светодиод ручной. режим
    };
    // кнопки
    void Do_Auto_Manual() {
      mode_Auto = !mode_Auto;
      if (mode_Auto) {
        Led[0]->ON(); Led[2]->OFF();
      }
      else {
        Led[0]->OFF(); Led[2]->ON();
      }
    }
    void Do_SET() {
      Menu_select();
    }
    void Do_UP_ON_PUMP() {
      if (!mode_Auto) {
        Pump->ON();
        Led[1]->ON();
      }
      else Menu[line]->up();
    }
    void Do_DOWN_OFF_PUMP() {
      if (!mode_Auto) {
        Pump->OFF();
        Led[1]->OFF();
      }
      else Menu[line]->down();
    }
    #include "Cl_do_btn.h"
    Cl_do_btn * Btn[] =  {
      new Cl_do_btn(&In[0] , 0, &Do_Auto_Manual ), //кнопка "Auto-Manual"     0 нажата / 1 нет
      new Cl_do_btn(&In[1] , 0, &Do_SET)         , //кнопка "SET"             0 нажата / 1 нет
      new Cl_do_btn(&In[2] , 0, &Do_UP_ON_PUMP ) , //кнопка "UP" / "ON_PUMP"  0 нажата / 1 нет
      new Cl_do_btn(&In[3] , 0, &Do_DOWN_OFF_PUMP), //кнопка "DOWN"/"OFF_PUMP" 0 нажата / 1 нет
    };
    // датчик давления
    void Do_change();
    #include "Cl_do_analog_sens.h"
    Cl_do_analog_sens * Sens = new Cl_do_analog_sens(&aIn, &Do_change);
    void Do_change() {
      pressure = Sens->value;
      if (mode_Auto) {
        if (pressure <= pressure_ON) {
          Pump->ON();
          Led[1]->ON();
        }
        if (pressure >= pressure_OFF) {
          Pump->OFF();
          Led[1]->OFF();
        }
      }
    }
    void setup() {
      //Serial.begin(9600);
      Menu_setup();// инициализация дисплея
      Sens->setup();
      Pump->setup();
      for (byte i = 0; i < 3; ++i)Led[i]->setup();
      for (byte i = 0; i < 4; ++i)Btn[i]->setup();
    }
    void loop() {
      Menu_viev();// вывод текущей информации
      Sens->loop();
      Pump->loop();
      for (byte i = 0; i < 3; ++i)Led[i]->loop();
      for (byte i = 0; i < 4; ++i)Btn[i]->loop();
    }
     
  16. Дмитрий76

    Дмитрий76 Нерд

    этот скеч срабатывает по давлению но нет инфы на дисплее и в порту. еще при старте ардуино непонятно что стоит автомат или мануал. светодиод не горит. Не могу понять твой скеч. Весь день муча и мучался и так не понял ни чего. Подскажи пожалуйста, как сделать кнопку авто - мануал переключение по удержанию? чтобы исключить случайное нажатие.
     
  17. Дмитрий76

    Дмитрий76 Нерд

    И если можно прокомментируй свой скеч. я в программирование наволочек. электроникой занимаюсь лет 20. но с программированием пытаюсь недавно.
     
  18. qwone

    qwone Гик

    Скеч отображает информацию на дисплей. Вот только я делал под то что есть у меня LCD1602 подключение под I2c. само меню находится здесь
    Код (C++):
    /*Cl_menu_A.cpp
    */

    #include "Arduino.h"
    #include "Cl_menu_A.h"
    int pressure;                 // величина давления
    const int pressure_max = 900; // величина давления максимумально возможное
    const int pressure_min = 300; // величина давления минимально возможное
    int pressure_ON = 400;        // величина давления когда насос сам вкл
    int pressure_OFF = 700;       // величина давления когда насос сам выкл
    const byte delta = 5; // минимальное расстояние между pressure_ON и pressure_OFF
    void pressure_ON_plus() {
      ++pressure_ON;
      if (pressure_ON > (pressure_OFF - delta))pressure_ON = pressure_OFF - delta;
    }
    void pressure_ON_minus() {
      --pressure_ON;
      if (pressure_ON < pressure_min)pressure_ON = pressure_min;
    }
    void pressure_OFF_plus() {
      ++pressure_OFF;
      if (pressure_OFF > pressure_max)pressure_OFF = pressure_max;
    }
    void pressure_OFF_minus() {
      --pressure_OFF;
      if (pressure_OFF < (pressure_ON + delta))pressure_OFF = pressure_ON + delta;
    }
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27 , 16, 2);
    void Menu_setup() {  // инициализация дисплея
      lcd.init();        // инициируем LCD дисплей
      lcd.backlight();   // включаем подсветку LCD дисплея
      lcd.setCursor(0, 0);
      lcd.print("P:");     // Выводим надпись
      lcd.setCursor(0, 1);
      lcd.print("ON:");    // Выводим надпись
      lcd.setCursor(8, 1);
      lcd.print("OFF:");       // Выводим надпись
    }
    void Menu_viev() {
      static uint32_t past = 0;
      static bool stat_blk = 0;
      if (millis() - past >= 500) {
        past = millis();
        lcd.setCursor(2, 0);
        lcd.print("    ");
        lcd.setCursor(2, 0);
        lcd.print(pressure);
        lcd.setCursor(3, 1);
        lcd.print("    ");
        lcd.setCursor(3, 1);
        lcd.print(pressure_ON);
        lcd.setCursor(12, 1);
        lcd.print("    ");
        lcd.setCursor(12, 1);
        lcd.print(pressure_OFF);
        if (stat_blk = !stat_blk) Menu[line]->viev();
      }
    }
    void viev_0() {
    }
    void viev_1() {
      lcd.setCursor(3, 1);
      lcd.print("    ");
    }
    void viev_2() {
      lcd.setCursor(12, 1);
      lcd.print("    ");
    }
    void none() {} ; // заглушка
    int line = 1   ; // текущая линия в меню
    Cl_menu_line * Menu[max_line] = {
      //переменная на экране,отображение экрана,действие вверх,действие вниз
      new Cl_menu_line(0, & viev_0, & none              , & none             ),
      new Cl_menu_line(1, & viev_1, & pressure_ON_minus , & pressure_ON_plus ),
      new Cl_menu_line(2, & viev_2, & pressure_OFF_minus, & pressure_OFF_plus)
    };
    void Menu_select() {
      ++ line;
      if (line >= max_line) line = 0;
    }
     
  19. qwone

    qwone Гик

    Код (C++):
    Cl_menu_line * Menu[max_line] = {
      //переменная на экране,отображение экрана,действие вверх,действие вниз
      new Cl_menu_line(0, & viev_0, & none              , & none             ),
      new Cl_menu_line(1, & viev_1, & pressure_ON_minus , & pressure_ON_plus ),
      new Cl_menu_line(2, & viev_2, & pressure_OFF_minus, & pressure_OFF_plus)
    };
    Да код очень сыроват. Так что надо просто еще подумать как все организовать попонятнее.
     
  20. Дмитрий76

    Дмитрий76 Нерд

    Дисплей тоже буду ставить LCD1602. сейчас просто другой. завтра получу
    1602