Помогите с кодом

TynuK
Offline
Зарегистрирован: 05.02.2017
// накапливаем счетчик позиции на вывод на экран
    Serial.println(results.value, DEC);
    Serial.println("Ок");

 

TynuK
Offline
Зарегистрирован: 05.02.2017

даже эта часть в монитор порта не попадает, хотя как я думаю должно выходить?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Тогда должно работать, если к пинам подключено аналогично как в примерах

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Значит программа сюда не попадает, другого не дано, расставляйте вывод в порт в разных участках программы и смотрите

TynuK
Offline
Зарегистрирован: 05.02.2017

Все также подключенно, но не работает. А есть функция которая отвечает именно в каком виде код приходит с пульта? Что то искал,но не нашел ни чего

TynuK
Offline
Зарегистрирован: 05.02.2017

#include <Wire.h> Зачем это здесь? не вижу ни чего чтоб было с этой библиотекой связанно, или я что то пропустил?

bwn
Offline
Зарегистрирован: 25.08.2014

I2C, Карл, I2C....
Если есть желание получить что то толковое, препарируй это чудо на самодостаточные блоки, добивайся их работы по отдельности, заворачивай в функции и собирай все по новой, предварительно написав требуемый алгоритм. Перерывать всю ту простыню вряд ли у кого желание появится.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

TynuK, Вот Вы не верите, ну лучший совет для Вс оодержится в посте №9. Пока Вы ему не последуете

TynuK пишет:

#include <Wire.h> Зачем это здесь? не вижу ни чего чтоб было с этой библиотекой связанно, или я что то пропустил?

"эта музыка будет вечной"!
TynuK
Offline
Зарегистрирован: 05.02.2017

Спасибо. Попробую

TynuK
Offline
Зарегистрирован: 05.02.2017

Возможно это и так,но я достаточно упрям что бы добить этот код до конца, а вот без этой библиотеки он тоже компилируется и работает так же, вряд ли она сдесь была с чем то связана

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

TynuK пишет:

Возможно это и так,но я достаточно упрям что бы добить этот код до конца, 

При условии, что ua6em не надоест кормить Вас с ложечки. В ином случае, Вы не в состоянии добить этот код независимо от Вашего упрямства до тех пор, пока не последуете моему совету.

А #include не выбрасывайте. То, что без неё хорошо работает - это Вам так кажется. Завтра поменяете веррсию IDE и Вас ждёт неприятный сюрприз. Оставьте в покое, она же Вам не мешает. Не чините то, что не сломано.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

TynuK пишет:

Возможно это и так,но я достаточно упрям что бы добить этот код до конца, 

При условии, что ua6em не надоест кормить Вас с ложечки. В ином случае, Вы не в состоянии добить этот код независимо от Вашего упрямства до тех пор, пока не последуете моему совету.

А #include не выбрасывайте. То, что без неё хорошо работает - это Вам так кажется. Завтра поменяете веррсию IDE и Вас ждёт неприятный сюрприз. Оставьте в покое, она же Вам не мешает. Не чините то, что не сломано.

Я такой длинный код даже прочитать от корки до корки не смогу, мой мозг этому сопротивляется, чёрный ящик одолел (почти) иногда взбрыкивает и вылетает за диапазон удержания, напрячь извилины не могу, 20 строк проанализировать куда двигать не то что )))
Вот осциллограмки еще глянуть, в какую точку приводит моя программа, лень, прибор работает, спину греет ))) жеж, я и затеялся с программированием, чтобы ручку не крутить

TynuK
Offline
Зарегистрирован: 05.02.2017

Вот что бы вы ни говорили , а версию IDE менял, разницы ноль кроме той что приходилось некоторые библиотеки поменять чтоб скомпилился.

TynuK
Offline
Зарегистрирован: 05.02.2017

А я его полностью и не читаю, вот в фуекции "void loop" кроме как вывод инфы на дисплей и кнопки пульта зайти в меню, да так проверить переешивать больше и нет ни чего, все лежит в "void setup", сегодня попробую опять все повырезать сначала то что больше не нужно в этом коде 

TynuK
Offline
Зарегистрирован: 05.02.2017

Интересно и с чего же такой вывод "ua6em не надоест кормить Вас с ложечки" если вы внимательно читали, то 

надо было наверно заметить что все что предлогалось я уже и сам попробовал, и это не помогло.

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

bwn
Offline
Зарегистрирован: 25.08.2014

TynuK пишет:

А я его полностью и не читаю, вот в фуекции "void loop" кроме как вывод инфы на дисплей и кнопки пульта зайти в меню, да так проверить переешивать больше и нет ни чего, все лежит в "void setup", сегодня попробую опять все повырезать сначала то что больше не нужно в этом коде 

В Сетапе лежит только то, что там лежит. Как вы собираетесь играть "сонату", если не знаете, что есть тромбон, а что есть скрипка? Упрямство весчь хорошая, но в меру. Может есть смысл потратить его на изучение раздела "Программирование" в версии "лайт" и написать код из 100 строк, которого для ваших настоящих хотелок будет достаточно, а не тратить время на борьбу с никому не нужным пультом. Потом поднабравшись опыта спокойно будете пилить свое меню, если его так хочется иметь (старое, даже если работало, все равно кривое до невозможности).
Процесс написания первого меню с нуля, это полет фантазии и сумеречное состояние души. Меню составляет 8/10 от всего кода и несет в основном декоративную функцию. Думайте, что вам важнее - работающее оборудование или красивые картинки с пульта?

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Так вот я то как раз понимаю в чём проблема. Это Вы не понимаете. Ну, удачи. Посильнее лбом - стена и прогнётся.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Так вот я то как раз понимаю в чём проблема. Это Вы не понимаете. Ну, удачи. Посильнее лбом - стена и прогнётся.

"...Либо не знают и не ведают, что творят, либо знают, но стригут с этого купоны..." В.Высоцкий

TynuK
Offline
Зарегистрирован: 05.02.2017

Там как раз то и много лишнего есть, зачем в настройках этого меню настраивать время отображения инфы на экране? или к примеру температура котла которого уже нет давным давно, или корекция датчика газа который другой щай стоит. Все это убрать,а оставить только настроить время перемешивания большего и не надо, так вот, с начала удалю,а потом буду смотреть что и где и как поправить.

P.S. Если не можешь помочь не трать время на пустые разговоры.

bwn
Offline
Зарегистрирован: 25.08.2014

TynuK пишет:

 Все это убрать,а оставить только настроить время перемешивания большего и не надо, так вот, с начала удалю,а потом буду смотреть что и где и как поправить.

P.S. Если не можешь помочь не трать время на пустые разговоры.

Так я и задаю в третий раз вопрос: НАХЕРА ЭТО МЕНЮ НУЖНО, ЕСЛИ НАСТРАИВАЕМ ОДИН ПАРАМЕТР? За трое потраченных суток, скетч можно было 100500 раз перезалить с новым параметром и подобрать оптимальный. Потом заблокировать все кнопки чтобы руки шаловливые не лазали. Усе, устал.

TynuK
Offline
Зарегистрирован: 05.02.2017

А если в процесе работы устройства надо изменить цыкл, лезь с ноутбуком и перезаливать все с новыми параметрами? и так допустим 3 раза в неделю? Не очень то и удобно будет если в день придется несколько раз менять время перемешивания или допустим интервал.

 

bwn
Offline
Зарегистрирован: 25.08.2014

Та дело ваше. Охота Франкенштейна воскрешать, на здоровье.

TynuK
Offline
Зарегистрирован: 05.02.2017
oid loop() {
  mix_process(mix_time, mix_period); // проверяем, не пора ли перемешивать
 // irrecv.resume();// запросим значение кнопки на пульте управления
  // если нажали * то переходим в меню настроек
 if (irrecv.decode(&results)) {
    Serial.println(results.value);
  if (results.value == 16728765) {
    lcd.clear();// очищаем экран
    lcd.setCursor(1, 1);
    lcd.print("Please, wait");
    IR_setup(true);}
    delay(1000);
    irrecv.resume(); // Receive the next value
  }
    Serial.println(results.value, DEC);

 

TynuK
Offline
Зарегистрирован: 05.02.2017

Вот так выходит в меню, но пока что виснет, может у кого есть какие мысли?

TynuK
Offline
Зарегистрирован: 05.02.2017
 switch (count_IR) {

     case 1:
  {   
  //Интервал перемешивания, мин mix_period
 lcd.clear();// очищаем экран 
    lcd.setCursor(1, 1);
    lcd.print("Mix period, min");
    lcd.setCursor(1, 4);
    lcd.print("Press < > for correct");
    Serial.println("Mix period");
    delay(100);   
 if(results.value == 16761405) {mix_period=+5;} // шаг - пять минут
if(results.value == 16720605) {mix_period=-5;}
if(mix_period>240) {mix_period=240;} //зададим пределы параметра 
if(mix_period<15) {mix_period=15;}
} 
    irrecv.resume(); // Receive the next value
Serial.println(results.value);
Serial.println(results.value, DEC);
}
lcd.setCursor(5, 2);
 lcd.print(mix_period);
 Serial.println("Mix period"+ String(mix_period,4));
 delay(200);
 if(results.value == 16736925) {count_IR++;}
 if(results.value == 16754775) {count_IR--;}   
Serial.println(results.value);
while (count_IR=1);   
      break;

 

TynuK
Offline
Зарегистрирован: 05.02.2017

Нужна помощь в этой части, есть те кто реально может помочь? Хотя бы просто показать пример как правильно тут сделать.

bwn
Offline
Зарегистрирован: 25.08.2014

С Франкенштейном возится не буду, на пример с 221 поста, как человек делал. Есть желание можешь целиком холивар почитать. ТС написал все с нуля за два месяца. Говнокода много и в моих советах в том числе. Сейчас делал бы иначе. Но все взлетело и уже пару лет работает.

TynuK
Offline
Зарегистрирован: 05.02.2017

И за это спасибо.

TynuK
Offline
Зарегистрирован: 05.02.2017

ООО да это же то что и нужно мне, спасибо "ФРАНКЕНШТЕЙН" будет жить/

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

TynuK пишет:

ООО да это же то что и нужно мне, спасибо "ФРАНКЕНШТЕЙН" будет жить/

Только там сравнивается в хексах

   irrecv.resume();}
  Serial.println(val,HEX);
  Serial.println(" ");
  if (val == 0x8D47834C) return 5; //Right
  if (val == 0xFA3301F0) return 4; //Down
  if (val == 0xE52E70B2) return 3; //Up
  if (val == 0x14FD8504) return 2; //Left
  if (val == 0x520C78C2) return 1;
  else  return 0;
}

 

045
046  
047
048

 

TynuK
Offline
Зарегистрирован: 05.02.2017

Да я это знаю, вот проверил у себя все работает, теперь осталось каким то хитрым образом переделать так как мне необходимо, но это будет позже. А сейчас пытаюсь отгадать загадку, вот написана программка для гидростанции, простая очень.. всего одна библиотека  Bounce2. В общем суть такая, 5 реле 4 кнопки , и вот пятое реле -это предохранительный клапан который срабатывает с любым из 4 реле одновременно, после того как все было написанно загруженно на плату NANO, при включении реле на 8 пине, то меря напрежение было так4.20v,а на

другом реле 10 пин (предохранительный клапан) который вместе с ним должен был включиться 0.20v, а все остальные 3 кнопки нормально работают, пытался другие входы ставить, также и кнопки, убирал дрожание кнопок, грузил на другие платы, и все равно таже песня." Где то напрежение гуляет" Вот код

#include <Bounce2.h>
// обрабатываем кнопки джойстика 
 #define BUTTON_PIN_UP 2
#define BUTTON_PIN_DOWN 3
#define BUTTON_PIN_LEFT 4
#define BUTTON_PIN_RIGHT 5

// Концевики транспортного положения
#define transport 0

// Концевик верхнего положения стола
#define table_up 12

// Концевик нижнего положения стола 
#define table_down 11

// порты твердотельных реле джойстика 
#define RELAY_UP 6
#define RELAY_DOWN 7
#define RELAY_LEFT 8
#define RELAY_RIGHT 9
#define RELAY_FASE 10 

// порт для включения-выключения сигнальной красной лампы
#define red_lamp 1

// порт включения двигтеля гидростанции 
#define motor 13 

int interval_button = 50; //  время дрожания кнопки в мс 

// установим объекты обработки дрожания кнопок управления UP  
Bounce debouncer1 = Bounce(); // UP

// установим объекты обработки дрожания кнопок управления  DOWN
Bounce debouncer2 = Bounce(); // DOWN

// установим объекты обработки дрожания кнопок управления LEFT
Bounce debouncer3 = Bounce(); // LEFT

// установим объекты обработки дрожания кнопок управления RIGHT 
Bounce debouncer4 = Bounce(); // RIGHT

// установим объекты обработки дрожания транспортных концевиков
Bounce debouncer5 = Bounce(); // транспортные концевики 

// установим объекты обработки дрожания концевиков верхнего положения стола 
Bounce debouncer6 = Bounce(); // верх стола 

// установим объекты обработки дрожания концевиков нижнего положения стола 
Bounce debouncer7 = Bounce(); // нижнее положение стола 

void setup() {

  // Настройки кнопки UP 
  //pinMode(BUTTON_PIN_UP,INPUT_PULLUP);
  pinMode(BUTTON_PIN_UP,INPUT_PULLUP);
  // After setting up the button, setup the Bounce instance :
  debouncer1.attach(BUTTON_PIN_UP);
  debouncer1.interval(interval_button); // установим время дрожания кнопок в мс
  
   
   // Настройки кнопки DOWN 
  pinMode(BUTTON_PIN_DOWN,INPUT_PULLUP);
  // After setting up the button, setup the Bounce instance :
  debouncer2.attach(BUTTON_PIN_DOWN);
  debouncer2.interval(interval_button); // установим время дрожания кнопок в мс


   // Настройки кнопки LEFT 
  pinMode(BUTTON_PIN_LEFT,INPUT_PULLUP);
  // After setting up the button, setup the Bounce instance :
  debouncer3.attach(BUTTON_PIN_LEFT);
  debouncer3.interval(interval_button); // установим время дрожания кнопок в мс
 

  
   // Настройки кнопки RIGHT
  pinMode(BUTTON_PIN_RIGHT,INPUT_PULLUP);
  // After setting up the button, setup the Bounce instance :
   debouncer4.attach(BUTTON_PIN_RIGHT);
  debouncer4.interval(interval_button); // установим время дрожания кнопок в мс

 
 // Настройки порта транспортных концевиков
  pinMode(transport,INPUT_PULLUP);
  // After setting up the button, setup the Bounce instance :
  debouncer5.attach(transport);
  debouncer5.interval(interval_button); // установим время дрожания кнопок в мс

// Настройки порта концевика верхнего положения стола
  pinMode(table_up,INPUT_PULLUP);
  // After setting up the button, setup the Bounce instance :
  debouncer6.attach(table_up);
  debouncer6.interval(interval_button); // установим время дрожания кнопок в мс
  

// Настройки порта концевика нижнего положения стола
  pinMode(table_down,INPUT_PULLUP);
  // After setting up the button, setup the Bounce instance :
  debouncer7.attach(table_down);
  debouncer7.interval(interval_button); // установим время дрожания кнопок в мс




  //Setup the LED :
//  pinMode(LED_PIN,OUTPUT);

// порты твердотельного реле объявим и переведем их в закрытое состояние 
pinMode(RELAY_UP,OUTPUT);
digitalWrite(RELAY_UP, LOW );

pinMode(RELAY_DOWN,OUTPUT);
digitalWrite(RELAY_DOWN, LOW );

pinMode(RELAY_LEFT,OUTPUT); //отпускает
digitalWrite(RELAY_LEFT, LOW );

pinMode(RELAY_RIGHT,OUTPUT); // затягивает 
digitalWrite(RELAY_RIGHT, LOW );

pinMode(RELAY_FASE,OUTPUT);
digitalWrite(RELAY_FASE, LOW );

// порт для включения-выключения двигателя гидростанции. Выключим его при старте обязательно
pinMode(motor,OUTPUT);
digitalWrite(motor, LOW );

// порт для включения-выключения красной лампы. Изначально она включена
pinMode(red_lamp,OUTPUT);
digitalWrite(red_lamp, HIGH );

}

void loop() {
  // Посмотрим состояние объектов кнопок и возьмем их состояние 
  debouncer1.update(); // джойстик
  debouncer2.update();
  debouncer3.update();
  debouncer4.update();
  
  debouncer5.update(); // концевики транспортные

  debouncer6.update(); // концевик верхнего положения стола

  debouncer7.update(); // концевик нижнего положения стола 
  
// присваиваем переменные состояния джойстика 
  int value_UP = debouncer1.read();
  int value_DOWN = debouncer2.read();
  int value_LEFT = debouncer3.read();
  int value_RIGHT = debouncer4.read();
 
 // Состояние транспортных концевиков 
 int transport_value=debouncer5.read();

 // Состояние концевика верхнего положения стола 
 int table_up_value=debouncer6.read();

// Состояние концевика нижнего положения стола 
 int table_down_value=debouncer7.read();

 
  // Обрабатываем события
// погасим красную лампу и включим двигатель гидростанции
if(transport_value == LOW){
 // выключаем красную лампу 
digitalWrite(red_lamp, LOW );
// включим двигатель станции
digitalWrite(motor, HIGH );
}
else {
digitalWrite(red_lamp, HIGH );
digitalWrite(motor, LOW );
  }

  
// джойстик в положение верх 
if(value_UP==LOW && table_up_value==HIGH){  

// включаем предохранительный клапан гидростанции 
   digitalWrite(RELAY_FASE, HIGH);
// включаем клапан на подъем стола 
digitalWrite(RELAY_UP, HIGH);}
else {
 // выключаем предохранительный клапан гидростанции 
 digitalWrite(RELAY_FASE, LOW);
// выключаем клапан на подъем стола 
digitalWrite(RELAY_UP, LOW); 
  }

// джойстик в положение вниз
if( value_DOWN==LOW && table_down_value==HIGH){  

// включаем предохранительный клапан гидростанции 
   digitalWrite(RELAY_FASE, HIGH);
// включаем клапан на спуск стола 
digitalWrite(RELAY_DOWN, HIGH);}
else {
 // выключаем предохранительный клапан гидростанции 
 //  digitalWrite(RELAY_FASE, LOW);
// выключаем клапан на подъем стола 
digitalWrite(RELAY_DOWN, LOW); 
  }

// затягиваем (джойстик вправо)
if(value_RIGHT==LOW){  
// включаем предохранительный клапан гидростанции 
   digitalWrite(RELAY_FASE, HIGH);
// включаем клапан гидромотора на затягивание зверя 
digitalWrite(RELAY_RIGHT, HIGH);}
else {
 // выключаем предохранительный клапан гидростанции 
 //  digitalWrite(RELAY_FASE, LOW);
// выключаем клапан на подъем стола 
digitalWrite(RELAY_RIGHT, LOW); 
  }

  // оптускаем(джойстик влево)
if(value_LEFT==LOW){  
// включаем предохранительный клапан гидростанции 
   digitalWrite(RELAY_FASE, HIGH);
// включаем клапан гидромотора на отпусакние зверя 
digitalWrite(RELAY_LEFT, HIGH);}
else {
 // выключаем предохранительный клапан гидростанции 
 //  digitalWrite(RELAY_FASE, LOW);
// выключаем клапан на подъем стола 
digitalWrite(RELAY_LEFT, LOW); 
  } 
}

 

TynuK
Offline
Зарегистрирован: 05.02.2017
// джойстик в положение верх 
if(value_UP==LOW && table_up_value==HIGH){  

// включаем предохранительный клапан гидростанции 
   digitalWrite(RELAY_FASE, HIGH);
// включаем клапан на подъем стола 
digitalWrite(RELAY_UP, HIGH);}
else {
 // выключаем предохранительный клапан гидростанции 
 digitalWrite(RELAY_FASE, LOW);
// выключаем клапан на подъем стола 
digitalWrite(RELAY_UP, LOW); 
  }

// джойстик в положение вниз
if( value_DOWN==LOW && table_down_value==HIGH){  

// включаем предохранительный клапан гидростанции 
   digitalWrite(RELAY_FASE, HIGH);
// включаем клапан на спуск стола 
digitalWrite(RELAY_DOWN, HIGH);}
else {
 // выключаем предохранительный клапан гидростанции 
 //  digitalWrite(RELAY_FASE, LOW);
// выключаем клапан на подъем стола 
digitalWrite(RELAY_DOWN, LOW); 
  }

// затягиваем (джойстик вправо)
if(value_RIGHT==LOW){  
// включаем предохранительный клапан гидростанции 
   digitalWrite(RELAY_FASE, HIGH);
// включаем клапан гидромотора на затягивание зверя 
digitalWrite(RELAY_RIGHT, HIGH);}
else {
 // выключаем предохранительный клапан гидростанции 
 //  digitalWrite(RELAY_FASE, LOW);
// выключаем клапан на подъем стола 
digitalWrite(RELAY_RIGHT, LOW); 
  }

  // оптускаем(джойстик влево)
if(value_LEFT==LOW){  
// включаем предохранительный клапан гидростанции 
   digitalWrite(RELAY_FASE, HIGH);
// включаем клапан гидромотора на отпусакние зверя 
digitalWrite(RELAY_LEFT, HIGH);}
else {
 // выключаем предохранительный клапан гидростанции 
 //  digitalWrite(RELAY_FASE, LOW);
// выключаем клапан на подъем стола 
digitalWrite(RELAY_LEFT, LOW); 
  } 
}

 

TynuK
Offline
Зарегистрирован: 05.02.2017

И да вот еще, после того как закоментировал, все эти строчки , кроме как самой первой, то все заработало,но напрежение все равно ниже чем должно быть, реле стоит 5v управлением, вроде работает и при 4v. Но хочется разобраться, какие мысли будут? Мож кто сталкивался с этим?

// выключаем предохранительный клапан гидростанции 

 //  digitalWrite(RELAY_FASE, LOW); Вот эти
// выключаем клапан на подъем стола 
digitalWrite(RELAY_DOWN, LOW); 
  }
TynuK
Offline
Зарегистрирован: 05.02.2017

Всем привет, вот и вернулся я к меню. Все там понял меню переделал, спасибо "bwn".
Теперь осталось 1 проблема, а именно надо сделать таймер с часами ds1302(просто все что есть под рукой)
Таймер должен включать реле (допустим через каждый час на 5 минут), с часами разобрался включается, а вот с
минутами ни как не могу.Задумка такая сохранить текущее время (минуты) на момент включения реле, и потом к этим
минутам прибавить за ранее установленное значение. Вроде все сделал прибавляет, а вот как только минута на часах меняется
то и соответственно то что мне нужно тоже меняется, подскажите как записать эту минуту чтоб она уже не обновлялась пока,
реле не отключится. Ну как то так. вот код

TynuK
Offline
Зарегистрирован: 05.02.2017
#include <EEPROM.h> // для записи во внутреннию память
// датчики температуры
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 8 // подключаем ds18b20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);// стартуем датчик температуры
//ЧАСЫ
#include <RTC.h>
RTC   time;
//IR-приемник
#include <IRremote.h>
#define RECV_PIN 11
uint32_t val; // для обнуления 
IRrecv irrecv(RECV_PIN);
decode_results results;
// Библиотека работы с экраном
#include <Wire.h>
#include <LCD_1602_RUS.h>
LCD_1602_RUS lcd(0x27, 20, 4);
// порт включения сигнала аварии
#define alarm 10
//кнопка на перемешивание
const int mix_button = 7;
//реле насосов на перемешивание
const int mix = 4;
//ПИНЫ дальномеров
const int Trig1 = 9;
const int Trig2 = 5;
const int Echo1 = 3;
const int Echo2 = 6;
//обьявим переменные для дальномеров
unsigned int time_us1 = 0;
unsigned int time_us2 = 0;
unsigned int distance_sm1 = 0;
unsigned int distance_sm2 = 0;
//переменные для пересчета в литры
int litr1;
int litr2;
//подключаем датчи газа mq9
#define MQ_PIN A0
float mqValue;// переменная для хранения значения, полученного с датчика MQ9
float ch4; // переменная для хранения уровня газа в процентах
//
boolean mix_status = false; // состояние перемешивания
int mix_count=0; // количество циклов перемешивания
long previousMillis = 0; // стек переменной времени
//  Переменные для меню
int ch4_volume = 10; // значение датчика утечек метана
int mix_period = 1; // интервал между перемешиваниями, час
int mix_time = 2; // время перемешивания в минутах
int Sound_control = 0;// работа контроллера со звуковым сигналом
int mik = 1200; // звук
int h;
int m;
int win;       //Номер экрана меню
unsigned long temp[2]; //Массив для задержек меню
//адреса датчиков ds18b20
DeviceAddress barrel1_temp, barrel2_temp, room_temp;
void setup()
{
  //Установка  часов для запуска-
  time.begin(RTC_DS1302,2, 13, 12);
 //time.settime(0,27,2,18,3,17,5);  // 0  сек, 17 мин, 15 час, 1, октября, 2015 года, четверг
// инициализируем экран
  Wire.begin();
  lcd.init(); 
  lcd.backlight();
  // Приветствие
  lcd.setCursor(1, 1);
  lcd.print("UMIUM BCS-01");
  delay (3000);
  lcd.clear();// очищаем экран
  // перемешивание
  pinMode(mix_button, OUTPUT); // Инициируем порт кнопки перемешивания
  pinMode(mix, OUTPUT); // термореле на включение насосов перемешивания  //настраиваем порты дальномеров
 //дальномеры
  pinMode(Trig1, OUTPUT);
  pinMode(Trig2, OUTPUT);
  pinMode(Echo1, INPUT);
  pinMode(Echo2, INPUT);
  // присвоим соответствующие адреса температурным датчикам
  sensors.getAddress(barrel1_temp, 0);
  sensors.getAddress(barrel2_temp, 2);
  sensors.getAddress(room_temp, 1);
  // установим максимальную точность снятия температуры 12 бит
  sensors.setResolution(barrel1_temp, 12);
  sensors.setResolution(barrel2_temp, 12);
  sensors.setResolution(room_temp, 12);
 //скорость порта
  Serial.begin(9600);
  //пульт
  irrecv.enableIRIn();
  //запишем в память
    mix_period = EEPROM.read(1); // период перемешивания
    mix_time = EEPROM.read(2); // время перемешивания
    Sound_control = EEPROM.read(3); //звуковой сигнал
    ch4_volume = EEPROM.read(4); // предельное значение датчика утечек газа
    mik = EEPROM.read(5);// звук
} 
//+++++++++++++++++++++++Программа управления перемешиванием+++++++
  void mix_process(float time_mixing, float period_mixing){
int hor;
int mir;  
     
     hor = time.Hours + mix_period;
 // mir =  time.minutes +  mix_time;

  if (hor > 23) hor = 0; //Ограничиваем значения
  if (mir > 59) mir = 0; //Ограничиваем значения
  if (time.Hours == hor && time.minutes == time.minutes) // Включается реле
  { digitalWrite(mix, HIGH);
 mix_status = true;// статус перемешивания - включено
    lcd.clear();// очищаем экран
    lcd.setCursor(10, 0); // отступ
    lcd.print("on ");
 
  Serial.print(hor);
   
  if (time.Hours == time.Hours && time.minutes == mir) // Выключатся реле   
  digitalWrite(mix, LOW);
   mix_count++; // прибавляем счетчик числа процессов перемешивания
    mix_status = false; // статус перемешивания - выключено
    lcd.setCursor(10, 0); // отступ первой строки слева 0 .
    lcd.print("off");
  Serial.print(mir);

  //выводим время
  lcd.setCursor(0, 0); // отступ первой строки слева 0 .
  lcd.print(time.gettime("H:i:s"));    //  час:минуты:секунды
}
// Принудительное перемешивание

  if (digitalRead(mix_button) == HIGH) {
    digitalWrite(mix, HIGH);// включаем перемешивание
    mix_status = true;// статус перемешивания - включено
   lcd.clear();// очищаем экран
    lcd.setCursor(10, 0); // отступ
    lcd.print("on ");
    if (time.Hours == time.Hours && time.minutes == mir) // Выключатся реле   
   digitalWrite(mix, LOW);
    lcd.setCursor(10, 0); // отступ первой строки слева 0 .
    lcd.print("off");
    mix_count++; // прибавляем счетчик числа процессов перемешивания
    mix_status = false; // статус перемешивания - выключено
    //выводим время
  lcd.setCursor(0, 0); // отступ первой строки слева 0 .
  lcd.print(time.gettime("H:i:s"));    //  час:минуты:секунды
    }
  }
//обработкакнопок пульта
byte key() {
  if (irrecv.decode(&results)) {
    val = results.value;   //Сверяем значение из переменной val
    irrecv.resume();
  }
  if (val == 16761405) return 5; //в право
  if (val == 16754775) return 4; //в низ
  if (val == 16736925) return 3; //вверх
  if (val == 16720605) return 2; //в лево
  if (val == 16712445) return 1; // ok для входя в меню,сохранения и выхода
  else  return 0;
}
//меню
 //1 экран
void set0() {
  byte pos = 8;
  //Считываем записанные значения таймеров.
  ch4_volume = EEPROM.read(4); //
  lcd.clear();

  while (key() != 1) //Крутим цикл пока не будет Setup
  {
    byte KEY = key(); // читаем состояние кнопок
    val = 0;
    lcd.setCursor(1, 1);
    lcd.print(L"ок/соxранить");
    // выводим инфу
    lcd.setCursor(3, 0);
    lcd.print("CH4  ");
    lcd.setCursor(8, 0);
    if (ch4_volume < 10)
      lcd.print(ch4_volume,DEC);
    lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции

    if (pos == 8 && KEY == 3) ch4_volume++;
    if (pos == 8 && KEY == 4) ch4_volume--;

    if (ch4_volume > 50) ch4_volume = 0; //Ограничиваем значения
    if (ch4_volume <= 0) ch4_volume = 50; //Ограничиваем значения
  }// конец цикла
  lcd.clear();
   //Записываем значения
  EEPROM.write(4, ch4_volume);

  lcd.setCursor(0, 0);
  lcd.print(L"соxраняем");
  delay(1500);

}// 2 экран
void set1() {
  byte pos = 12;
  //Считываем записанные значения таймеров.
  mix_period = EEPROM.read(1); //
  mix_time = EEPROM.read(2);
  lcd.clear();

  while (key() != 1) //Крутим цикл пока не будет Setup
  {
    byte KEY = key(); // читаем состояние кнопок
    val = 0;
    lcd.setCursor(1, 1);
    lcd.print(L"ок/соxранить");
   lcd.setCursor(2, 0);     // выводим инфу
     if (mix_period < 10) lcd.print("0");
    lcd.print(mix_period,DEC);
    lcd.print(":");
     if (mix_time < 10) lcd.print("0"); 
    lcd.print(mix_time,DEC);  
    
    lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции
    
    if (pos<3) pos=3;
    if (KEY == 5 && pos < 6) pos += 3; // крутим позицию право-лево
    else if (KEY == 2 && pos > 3) pos -= 3;
    
    else if (pos == 3 && KEY == 3)mix_period++; // крутим значения
    else if (pos == 3 && KEY == 4) mix_period--;
    else if (pos == 6 && KEY == 3) mix_time++;
    else if (pos == 6 && KEY == 4) mix_time--;    

    if ( mix_period > 23)  mix_period = 0; //Ограничиваем значения
    if ( mix_period < 0)  mix_period = 23; //Ограничиваем значения
  if ( mix_time > 59)  mix_period = 0; //Ограничиваем значения
    if ( mix_period < 0)  mix_period = 59; //Ограничиваем значения
  }// конец цикла
  lcd.noBlink();
  lcd.clear();

  EEPROM.write(1, mix_period);
  EEPROM.write(2, mix_time);
  lcd.setCursor(0, 0);
  lcd.print(L"соxраняем");
  delay(1500);
}
// 3 экран
void set2() {
    byte pos = 0;   
     
      //Считываем время с модуля. 
 time.Hours=h; //h=time.Hours;
    //m=time.minutes;
    lcd.clear();

    while(key() != 1) //Крутим цикл пока не будет Setup
    {   
    byte KEY = key(); // читаем состояние кнопок
    val=0;
    lcd.setCursor(1, 1);
    lcd.print(L"ок/соxранить");
    lcd.setCursor(0, 0);
    lcd.print(pos/3,DEC);    //Печатаем номер прогр.таймера.
    
    lcd.setCursor(2, 0);     // выводим инфу
     if (h < 10) lcd.print("0");
    lcd.print(h,DEC);
    lcd.print(":");
     if (m < 10) lcd.print("0"); 
    lcd.print(m,DEC);  
    
    lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции
    
    if (pos<3) pos=3;
    if (KEY == 5 && pos < 11) pos += 3; // крутим позицию право-лево
    else if (KEY == 2 && pos > 3) pos -= 3;
    
    else if (pos == 3 && KEY == 3) h++; // крутим значения
    else if (pos == 3 && KEY == 4) h--;
    else if (pos == 6 && KEY == 3) m++;
    else if (pos == 6 && KEY == 4) m--;        
    
    if (h > 23) h = 0;  //Ограничиваем значения
   if (h < 0) h = 23;  //Ограничиваем значения
    if (m > 59) m = 0;
    if (m < 0) m =59;
  }// конец цикла
   lcd.clear();
time.settime(0,m,h,-1,-1,-1,-1);
   lcd.print(L"cоxраняем");
   delay(1500);
}
// 4 экран
void set3() {
  byte pos = 7;
 
  //Считываем записанные значения.
  Sound_control = EEPROM.read(3);
  mik = EEPROM.read(5);
  
  lcd.clear();
  while (key() != 1) //Крутим цикл пока не будет Setup
  {
    byte KEY = key(); // читаем состояние кнопок
    val = 0;
    lcd.setCursor(1, 3);
    lcd.print(L"ок/соxранить");
    ////////////////////////////
    lcd.setCursor(0, 0);    // выводим инфу
    lcd.print(L"    звук аварии    ");
    if (Sound_control < 2)

      if (pos == 7 && KEY == 3)Sound_control++;
    if (pos == 7 && KEY == 4)Sound_control--;

    lcd.setCursor(pos, 1); // устанавливаем курсор согласно позиции
    if (Sound_control >= 2)Sound_control = 0;
    if (Sound_control >= 1)mik = 1200;
    if (Sound_control >= 1)lcd.print(L"вкл. ");
    if (Sound_control < 0 )Sound_control = 1;
    if (Sound_control <= 0 )mik = 0;
    if (Sound_control <= 0)lcd.print(L"откл.");
    //Serial.println(mik);
  }// конец цикла
  lcd.clear();

  EEPROM.write(3, Sound_control);
  EEPROM.write(5, mik);
  lcd.setCursor(0, 0);
  lcd.print(L"cоxраняем");
  delay(1500);
}///
//_________________________________________________________________
void menu()
{
  //Массив с наименованиями для экрана
  char menuTxt[4][20] = {"CH4_control >>", "mix_period >>>", "set_clokc     >>>", "Sound_control >>"};
  byte pos = 0;
  byte KEY;

  while (1) //Бесконечный цикл
  {
    KEY = 0;
    if (temp[1] < millis()) KEY = key(); //Если прошел интервал, читаем код
    val = 0;
    lcd.setCursor(0, 0);
    lcd.print(pos + 1); //Печатаем номер.
    lcd.print(".");
    lcd.print(menuTxt[pos]); //Печатаем название
    // Уменьшить увеличить + блокировка кнопки
    if (KEY == 3 && pos > 0) {
      pos--;
      temp[1] = millis() + 400;
    }
    if (KEY == 4 && pos < 3) {
      pos++;
      temp[1] = millis() + 400;
    }
    // Сейчас можно перейти на разные подменю.
    if (KEY == 5 && pos == 0) set0();
    if (KEY == 5 && pos == 1) set1();
    if (KEY == 5 && pos == 2) set2();
    if (KEY == 5 && pos == 3) set3();
    //Выход из меню с проверкой и установкой блокировки от возврата
    if (KEY == 1 && temp[0] < millis())
    {
      temp[0] = millis() + 2000;
      lcd.clear();
      break;
    }
  }
}
//_________________________________________________________________
void loop()
{
  //***ВХОД В МЕНЮ и проверка блокировки от возврата.
  byte KEY = key();          //Принимаем код клавиши
  val = 0;
  //Serial.println(KEY,DEC);
  if (KEY == 1 && temp[0] < millis())
  {
    temp[0] = millis() + 2000;
    lcd.clear();
    menu();
  }
  mix_process(mix_time, mix_period); // проверяем, не пора ли перемешивать
  //Если setup идем в меню
  //____________________________________________________________
    digitalWrite(Trig1, HIGH); // Подаем сигнал на выход микроконтроллера
    digitalWrite(Trig1, LOW); // Затем убираем
    time_us1 = pulseIn(Echo1, HIGH);
   
    digitalWrite(Trig2, HIGH);
    digitalWrite(Trig2, LOW);
    time_us2 = pulseIn(Echo2, HIGH);
  
  // вызываем на экран информацию
  //выводим время
  lcd.setCursor(0, 0); // отступ первой строки слева 0 .
  lcd.print(time.gettime("H:i:s"));    //  час:минуты:секунды
  // температура помещения
   sensors.requestTemperatures();
    float tem = sensors.getTempC(barrel1_temp);
    lcd.setCursor(0, 1);
    lcd.print(L"В помещении ");
    lcd.print(String(tem, 1));
    lcd.print(" C");
    lcd.print(L"°");
    // температура 1 ферментера
    lcd.setCursor(0, 2);
    float fer1 = sensors.getTempC(barrel2_temp);
    lcd.print(String(fer1, 1));
    lcd.print(" C");
     lcd.print(L"°");
    // температура 2 ферментера
    lcd.setCursor(0, 3);
    float fer2 = sensors.getTempC(room_temp);
    lcd.print(String(fer2, 1));
    lcd.print(" C");
    lcd.print(L"°");
  //обьем ферментеров
  //1 реактор  
    distance_sm1 = time_us1 / 58 + 0.8; // Пересчитываем в сантиметры
    litr1 = (70 - distance_sm1) * 14.3;
  //пересчитываем в литры
//  Serial.println(distance_sm1);
  lcd.setCursor(9, 2);
  lcd.print(litr1);
  lcd.print(L"л.");
  //2 реактор
    distance_sm2 = time_us2 / 58 + 0.8;
    litr2 = (70 - distance_sm2) * 14.3;
   // пересчитыаем в литры
 // Serial.println(distance_sm2);
  lcd.setCursor(9, 3);
  lcd.print(litr2);
  lcd.print(L"л.");
  // выведем показания датчика газа
  //ПЕРЕВОДИМ В ПРОЦЕНТЫ
    mqValue = analogRead(MQ_PIN);
    ch4 = mqValue / 1024 * 100 - 2;
 // Serial.print(ch4);
  lcd.setCursor(10, 0);
  lcd.print("CH4");
  lcd.setCursor(14, 0);
  lcd.print(String(ch4));
  lcd.print("%");
  if (ch4 < ch4_volume) {
  }
  else {
    lcd.clear();// очищаем экран
    lcd.setCursor(1, 1);
    lcd.print(L"CH4 Высокий Уровень");
    lcd.setCursor(2, 2);
    lcd.print(String(ch4));
    lcd.print(" %");

    //if (Sound_control >= 1)mik=1200;
    analogWrite (alarm, mik); // включаем на пьезодинамик
    delay (3000);
    analogWrite (alarm, 0);
    lcd.clear();// очищаем экран
  }
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

TynuK пишет:
Вроде все сделал прибавляет, а вот как только минута на часах меняется то и соответственно то что мне нужно тоже меняется, подскажите как записать эту минуту чтоб она уже не обновлялась пока, реле не отключится. Ну как то так. вот код

Код не смотрел (оч длинный), надо добавить условие, когда реле HIGH или LOW (не знаю как у Вас), минуты перезаписывать запрещено. Как то так.

TynuK
Offline
Зарегистрирован: 05.02.2017

У меня только одна просьба помочь провильно сделать вот такой код, часы прибавляет реле включается,а с минутами когда доходит до 2 минут то прибавляет получается 4 и соответсвенно выключение реле переходит на 4 минуты ,а не на 2, как мне можно сделать чтоб это прибавление было после того как выключится реле?

задержку надо как то сделать я не знаю как

#include <RTC.h>
#include <LCD_1602_RUS.h>
LCD_1602_RUS lcd(0x27, 20, 4);
RTC    time;
int Relay = 4;
int h = 1;
int m = 2;
int ho;
int mi;
int hor;
int mir;
void setup() {
  lcd.init(); // инициализируем экран
  lcd.backlight();
  // Приветствие
  lcd.setCursor(1, 1);
  lcd.print("UMIUM BCS-01");
  delay (3000);
  lcd.clear();// очищаем экран
  Serial.begin(9600);
  pinMode(Relay, OUTPUT);
  time.begin(RTC_DS1302, 2, 13, 12);
  time.settime(45, 59, 12);
}
void loop() {
  // time.gettime();
 // time.period(1);
  time.Hours = ho;
  time.minutes = mi;

   hor = ho+h;
    
  if (time.Hours == hor) // Включается реле в 6 утра
    {  digitalWrite(Relay, HIGH);
 Serial.print(hor);
  }
   mir = mi + m;
    if (time.Hours == ho && time.minutes == mir) // Выключатся реле в 23:00
     { digitalWrite(Relay, LOW);
 Serial.print(   mir   );
  }
  //выводим время
  lcd.setCursor(0, 0); // отступ первой строки слева 0 .
  lcd.print(time.gettime("H:i:s"));    //  час:минуты:секунды
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Давно хотел написать такой код . Может кому-то пригодится Полный скетч здесь https://yadi.sk/d/xlmiqDin3G7huc

Головной сюда 

/*Class_IR_btn.ino 
  IRremote->11 (Recv_pin)
  ИК кнопки вверх вниз влево вправо выбор
  up = 0xFF629D;
  down = 0xFFA857;
  left = 0xFF22DD;
  right = 0xFFC23D;
  select = 0xFF02FD;
*/

//  lcd1602_I2C
#include "Cl_IR_btn.h"
const byte Recv_pin = 11;
void Do_up() {
  Serial.println("Press Do_up");
};
void Do_down() {
  Serial.println("Press Do_down");
};
void Do_left() {
  Serial.println("Press Do_left");
};
void Do_right() {
  Serial.println("Press Do_right");
};
void Do_select() {
  Serial.println("Press Do_select");
};
Cl_IR_btn IR_btn(Recv_pin,
                 & Do_up, &Do_down, &Do_left, &Do_right, &Do_select);
void setup() {
  Serial.begin(9600);
  IR_btn.setup();

}

void loop() {
  IR_btn.loop();

}

 

TynuK
Offline
Зарегистрирован: 05.02.2017

Интересная возможность обрабатывать кнопки пульта, но мне это не поможет, с кнопками я уже давно разобрался

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Мне бы еще несколько подобных "кубиков" и я буду влет собирать такие программы как вы тут приводите. 

TynuK
Offline
Зарегистрирован: 05.02.2017

Я рад за вас, но мне б этот "кубик" решить для начала, а потом возможнои тоже смогу в "лет" собирать))

bwn
Offline
Зарегистрирован: 25.08.2014

Перед 33 строкой if (digitalRead(Relay) == LOW), а 37 строку поставить перед фиг.скобкой 36 строки. Не забыть фигурные скобки для нового ифа. Вроде так.
Алгоритм - проверяем время только если реле выключено, достигли нужного, включаем реле, запоминаем минуты и пока не выключится больше в этот иф не попадаем.

TynuK
Offline
Зарегистрирован: 05.02.2017

Спасибо, щас буду пробовать, так сделать

TynuK
Offline
Зарегистрирован: 05.02.2017

теперь вообще перестал включаться, или я что то не так сделал?

hor = ho+ h;
  if (hor > 23) hor = 0; //Ограничиваем значения

Serial.print(" hor>  ");
  Serial.print(hor);
 Serial.print(" <hor  ");
  
if (digitalRead(Relay) == LOW)
    {time.minutes = mi;}

  if (time.Hours == hor) // Включается реле в 6 утра
  {
    digitalWrite(Relay, HIGH);
  mir = mi +  m;
  }

 if (mir > 59) mir = 0; //Ограничиваем значения
  Serial.print(" mir>  ");
  Serial.print(   mir   );
  Serial.print(" <mir  ");
  if (time.minutes == mir) // Выключатся реле в 23:00
  {
    digitalWrite(Relay, LOW);
  }

 

TynuK
Offline
Зарегистрирован: 05.02.2017

TynuK пишет:

теперь вообще перестал включаться, или я что то не так сделал? А все понял не то написал, теперь работает

hor = ho+ h;
  if (hor > 23) hor = 0; //Ограничиваем значения

Serial.print(" hor>  ");
  Serial.print(hor);
 Serial.print(" <hor  ");
  
if (digitalRead(Relay) == LOW)
    {time.minutes = mi;} //time.Hours = ho

  if (time.Hours == hor) // Включается реле в 6 утра
  {
    digitalWrite(Relay, HIGH);
  mir = mi +  m;
  }

 if (mir > 59) mir = 0; //Ограничиваем значения
  Serial.print(" mir>  ");
  Serial.print(   mir   );
  Serial.print(" <mir  ");
  if (time.minutes == mir) // Выключатся реле в 23:00
  {
    digitalWrite(Relay, LOW);
  }

 

TynuK
Offline
Зарегистрирован: 05.02.2017

Спасибо "bwn" еще раз, теперь вроде работает как я и хотел, осталось проверить дальше как будет, допустим если 4 часа поставить, и минут 15 к примеру, потом смотреть как будет включаться и выключаться

bwn
Offline
Зарегистрирован: 25.08.2014

TynuK, Вы все таки примеры от qwone изучите и возьмите на вооружение. Он пишет правильно, эт я в лоб долблю.

TynuK
Offline
Зарегистрирован: 05.02.2017

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

TynuK
Offline
Зарегистрирован: 05.02.2017

подскажите пожалуйста, что это значит "if (mix_period < 10) "

lcd.setCursor(2, 0);     // выводим инфу
    if (mix_period < 10)
lcd.print("0");
    lcd.print(mix_period, DEC);
    lcd.print(":");
    if (mix_time < 10)
lcd.print("0");
    lcd.print(mix_time, DEC);
это кусок из меню, вроде вовсем разобрался,а вот эту часть понять не могу
что за 10, вроде ни чего с ней не связанно
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

TynuK пишет:

подскажите пожалуйста, что это значит "if (mix_period < 10) "

lcd.setCursor(2, 0);     // выводим инфу
    if (mix_period < 10)
lcd.print("0");
    lcd.print(mix_period, DEC);
    lcd.print(":");
    if (mix_time < 10)
lcd.print("0");
    lcd.print(mix_time, DEC);
это кусок из меню, вроде вовсем разобрался,а вот эту часть понять не могу
что за 10, вроде ни чего с ней не связанно

это значит вывести в формате 4 цифр, когда меньше 10 выводим сначала 0