Реле времени (готовый проэкт)

Eltelinon
Offline
Зарегистрирован: 10.01.2018
#include <OneButton.h>                           //подключаем библиотеку OneButton
#include <EEPROM.h>                               //подключаем библиотеку EEPROM
#include <Wire.h>                                 //подключаем библиотеку Wire
#include <LiquidCrystal_I2C.h>                    //подключаем библиотеку LiquidCrystal_I2C
#include <SimpleTimer.h>                          //SimpleTimer( в этом скетче не используется)

LiquidCrystal_I2C lcd(0x27, 16, 2);               // пишем какой дисплей

int button =            2;                        //концевик (LimitSwitch)
int led =               12;                       //индикатор
float Step =            10.00;                    //шак увеличения значения времени
float RelayTime_check = 0;                        //значение для сравнения
float RelayTime =       100.00;                   //время на которое срабатывает индикатор
int addr =              0;                        //адрес епрома

OneButton button1(5, INPUT_PULLUP);               //кнопка +
OneButton button2(6, INPUT_PULLUP);               //кнопка -

unsigned long lastflash;                          //время включения концевика
unsigned long drebezgPlus;                        //время кнопки +
unsigned long drebezgMinus;                       //время кнопки -
unsigned long SerialPort;                         //маркер для сериал порта
unsigned long EEPROMWrite;                        // таймер записи EEPROM

void maximumm(){
  lcd.setCursor(5, 1);                           
  lcd.print("MAXIMUM");
  
}

void minimumm(){
  lcd.setCursor(5, 1);                           
  lcd.print("MINIMUM");
}

void LimitSwitch() { 
  
  digitalWrite(led, HIGH);                        //включаем светодиод
  lastflash=millis();                             //запомнить время последнего включения

} 

void click1() {                                   //дейсвие при одиночном нажатии кнопки +
  if ((millis()-drebezgPlus)>200) {               //условие для выполнение команды не чаще чем раз в 200 мсек
     RelayTime += Step;                           //добавляем шаг к времени
     drebezgPlus = millis();                      //ставим маркер времени
  }
} 

void click2() {                                   //дейсвие при одиночном нажатии кнопки -
  if ((millis()-drebezgPlus)>200) {               //условие для выполнение команды не чаще чем раз в 200 мсек
     RelayTime -= Step;                           //отнимаем шаг от времени
     drebezgPlus = millis();                      //ставим маркер времени
  }
}

void longPress1() {                               //дейсвие при длинном нажатии кнопки +
  if ((millis()-drebezgPlus)>150) {               //условие для выполнение команды не чаще чем раз в 150 мсек
      RelayTime += Step*10;                       //добавляем шаг*10(100) к времени
      drebezgPlus = millis();                     //ставим маркер времени
  }
}

void longPress2() {                               //дейсвие при длинном нажатии кнопки -
  if ((millis()-drebezgPlus)>150) {               //условие для выполнение команды не чаще чем раз в 150 мсек
      RelayTime -= Step*10;                       //отнимаем шаг*10(100) от времени
      drebezgPlus = millis();                     //ставим маркер времени
  }
} 

void setup() {
  
  Serial.begin(9600);                             //открыть сериал порт
  
  lcd.init();                                     //Инициируем работу с LCD дисплеем
  lcd.backlight();                                //Инициируем работу подсветки на LCD дисплея
  
  EEPROM.get(addr,RelayTime);                     //считываем данные из EEprom и записываем в переменную RelayTime
  EEPROM.get(addr,RelayTime_check);               //считываем данные из EEprom и записываем в переменную RelayTime_check
  
  attachInterrupt(0,LimitSwitch,RISING);          //подключить прерывание на 2 пин при повышении сигнала 
 
  pinMode(led, OUTPUT);                           //индикатор 
  pinMode(button, INPUT);                         // концевик
  
  // функции первой кнопки
  button1.attachClick(click1);                    //определяем 1 клик первой кнопки
  //button1.attachDoubleClick(doubleclick1);
  //button1.attachLongPressStart(longPressStart1);
  //button1.attachLongPressStop(longPressStop1);
  button1.attachDuringLongPress(longPress1);      //определяем удерживание первой кнопки

  // функции второй кнопки
  button2.attachClick(click2);                    //определяем 1 клик второй кнопки
  //button2.attachDoubleClick(doubleclick2);
  //button2.attachLongPressStart(longPressStart2);
 // button2.attachLongPressStop(longPressStop2);
  button2.attachDuringLongPress(longPress2);      //определяем удерживание второй кнопки
} 

void loop() {
  
  if ((millis()-lastflash)>RelayTime-20){         //если сигнала нет больше секунды 
    digitalWrite(led, LOW);                       //выключаем светодиод
  }
  
  button1.tick();                                 //обозначаем первую кнопку в лупе
  button2.tick();                                 //обозначаем вторую кнопку в лупе
  
  if ((millis()-EEPROMWrite)>60000){              //лимит на повторение раз в минуту
    if (RelayTime != RelayTime_check);{           //выполнить только если значение RelayTime не равно RelayTime_check
      EEPROM.put(addr,RelayTime);                 //записываем значение из RelayTime в EEPROM
      EEPROM.get(addr,RelayTime_check);           //записываем значение из EEPROM в RelayTime_check
      EEPROMWrite = millis();                     //маркер времени для строки (103)
    }
  }
   
  RelayTime = constrain(RelayTime, 10, 2000);     //ограничение значений RelayTime в нужном диапазон
  
  lcd.setCursor(0, 0);                            // 1 строка 1 символ
  lcd.print("Relay Time=");                       //выводим текст Relay Time=
  lcd.setCursor(11, 0);                           // 1 строка 11 символ
  lcd.print(RelayTime/1000);                      // выводим время срабатывания /1000=0.00
  lcd.setCursor(15, 0);                           // 1 строка 15 символ
  lcd.print("s");                                 //выводим текст s
  //дальше до delay нужно для отладки
if ((millis()-SerialPort)>500){                  //таймер для отправки в порт
  
Serial.print("RelayTime ");                      // сериал принт служит для проверки работы скетча
Serial.println(RelayTime);
Serial.print("RelayTime_check ");
Serial.println(RelayTime_check);

SerialPort = millis();                          // маркер времени для сериал порта
 } 
if(RelayTime == 2000){
  maximumm();
}

if(RelayTime == 10){
  minimumm();
}
if ((millis()-SerialPort)>100){
  if(RelayTime >10 && RelayTime < 2000){
    lcd.setCursor(0, 1);                            
    lcd.print("                ");
  }
}
  delay(1);                                      //задержка для стабильности 
}

 

Eltelinon
Offline
Зарегистрирован: 10.01.2018

В связи с тем, что это мой первый проект ( не считая ctr+с & ctr+v других проэктов с сети) хотелось бы услышать мнение, а главное критику, желательно обоснованную. И рекоммендации в оптимизации. Заранее благодарен!

b707
Offline
Зарегистрирован: 26.05.2017

Eltelinon пишет:

В связи с тем, что это мой первый проект ( не считая ctr+с & ctr+v других проэктов с сети) хотелось бы услышать мнение, а главное критику, желательно обоснованную. И рекоммендации в оптимизации. Заранее благодарен!

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

Eltelinon
Offline
Зарегистрирован: 10.01.2018

потребавалось реле времени с точной регулировкой времени срабатывания в момент подачи сигнала с концевика. Работает с концевиком CSH-223. Построено на базе Arduino Nano, 2 кнопки, концевик CSH-223, lcd дисплей 16*2.
1)умеет регулировать задержку в диапазоне от 0,01сек до 2,00сек.
2)При однократном нажатии шаг 0,01, при длительном удержании кнопки быстро с шагом 0,1.
3)При достижении минимума и максимума значений сигнализирует об этом.
4)Реализовано сохранение значений таймера.

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

Eltelinon пишет:
И рекоммендации в оптимизации. Заранее благодарен!

Как вариант это #87     и разумеется все что выше по теме.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Как минимум половина кода лишняя , а обработчик кнопок просто кошмарный.
Переменные типа float в принципе не нужны в этом коде.

b707
Offline
Зарегистрирован: 26.05.2017

А мне особенно понравились функции maximumm()  и minimumm() - вместо того что реально ограничивать значения. они просто пишут на дисплее "Максимум" %)

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну почему бесполезный? 

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

Правда, то, что выложегно - не проект:

- где описание целей и задач проекта?

- где схема?

- где фото?

- где описание процесса с указанием возникших проблем?

И еще, то, что содержится в коде - это не комментарии. От слова "совсем". Комментарии должны не дублировать код, а объяснять, зачем это делается.

 

Ну и еще по поводу коментариев: 

- строка 009 - ладно, понятно: два концевика (только почему слово в единственном числе?)

- строка 010 - а зачем в проекте 12 индикаторов?

- почему в строках 16-17 и 20-21 кнопки называются "+" и "-", а в строках 86 и 93 уже "первая" и "второая"?

Eltelinon
Offline
Зарегистрирован: 10.01.2018

Можно конкретнее по поводу обработчика кнопок и если не float то на дисплей выводится 0 вместо 0.2

Eltelinon
Offline
Зарегистрирован: 10.01.2018

b707 пишет:

А мне особенно понравились функции maximumm()  и minimumm() - вместо того что реально ограничивать значения. они просто пишут на дисплее "Максимум" %)

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


Если Вы посмотрите внимательнее, то увидите что значение ограничивается в лупе. И почему он бесполезный? Этот проект полноценно работает( да, были коррективы, но не существенные)

Eltelinon
Offline
Зарегистрирован: 10.01.2018

andriano пишет:

Ну почему бесполезный? 

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

Правда, то, что выложегно - не проект:

- где описание целей и задач проекта?

- где схема?

- где фото?

- где описание процесса с указанием возникших проблем?

И еще, то, что содержится в коде - это не комментарии. От слова "совсем". Комментарии должны не дублировать код, а объяснять, зачем это делается.

 

Ну и еще по поводу коментариев: 

- строка 009 - ладно, понятно: два концевика (только почему слово в единственном числе?)

- строка 010 - а зачем в проекте 12 индикаторов?

- почему в строках 16-17 и 20-21 кнопки называются "+" и "-", а в строках 86 и 93 уже "первая" и "второая"?

Концевика не 2 и индикаторов не 12... Это пины...
Схемы нет т.к. в проекте всего 3 кнопки .

Краткое описание было 2м комментарием. И спасибо первому и второму автору комментариев за единственные полезные советы.

b707
Offline
Зарегистрирован: 26.05.2017

Eltelinon][quote=b707 пишет:

И почему он бесполезный?

Бесполезный не в том смысле, что никуда не годится - а в смысле, что вряд ли кому-то принесет пользу. кроме вас. Новый под свои нужды быстрее написать, чем в вашем разбираться, тем более что косяков в коде хватает.

Не обижайтесь. И если хотите выкладывать действительно полезные проекты - прислушайтесь к замечаниям в сообщении #7. Проект, предназаначенный для широкого доступа - должен быть правильно оформлен, снабжен грамотным описанием и внятными комментариями, схемой и фото. Для "полезного" проекта это обязательные условия.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Eltelinon пишет:
Концевика не 2 и индикаторов не 12... Это пины...

Вот и я о том: комментарии, скорееЮ, вредные чем полезные, т.к. либо не несут никакой информации, загромождая код, либо вообще вводят в заблуждение.

Цитата:
Схемы нет т.к. в проекте всего 3 кнопки .
И что?

Начиная с какого количества кнопок появляется схема?

Цитата:
Краткое описание было 2м комментарием.
Равзве?

Процитируйте, пожалуйста, а то я в упор не вижу ничего, что хоть немного напоминало бы описание проекта.

И, кстати, второй пост в теме - не Ваш.

Да чего Вы спорите-то? Посмотрите другие проекты. Или чукча не читатель, чукча - писатель.

Цитата:
И спасибо первому и второму автору комментариев за единственные полезные советы.
Увы, для того, кто не способен понять совет, последний представляется бесполезным.

Кстати, Вы просили критику - немного получили. Зачем начинаете спорить?

Eltelinon
Offline
Зарегистрирован: 10.01.2018

andriano пишет:

Eltelinon пишет:
Концевика не 2 и индикаторов не 12... Это пины...

Вот и я о том: комментарии, скорееЮ, вредные чем полезные, т.к. либо не несут никакой информации, загромождая код, либо вообще вводят в заблуждение.

Цитата:
Схемы нет т.к. в проекте всего 3 кнопки .
И что?

Начиная с какого количества кнопок появляется схема?

Цитата:
Краткое описание было 2м комментарием.
Равзве?

Процитируйте, пожалуйста, а то я в упор не вижу ничего, что хоть немного напоминало бы описание проекта.

И, кстати, второй пост в теме - не Ваш.

Да чего Вы спорите-то? Посмотрите другие проекты. Или чукча не читатель, чукча - писатель.

Цитата:
И спасибо первому и второму автору комментариев за единственные полезные советы.
Увы, для того, кто не способен понять совет, последний представляется бесполезным.

Кстати, Вы просили критику - немного получили. Зачем начинаете спорить?

1) ну для начала я с Вами не спорил и даже не пытался. А ответил на ваши "замечания".

2) продолжим тем, что даже мой племянник который только пол года ходит на робототехнику и учит ардуинку знает, что в начале кода типом данных задается переменная или пин (который потом в сетапе и указывается )

3) вот мой комментарий по поводу описания ( краткого ) в котором есть и цель проекта, и компоненты, и возможности.

"потребавалось реле времени с точной регулировкой времени срабатывания в момент подачи сигнала с концевика. Работает с концевиком CSH-223. Построено на базе Arduino Nano, 2 кнопки, концевик CSH-223, lcd дисплей 16*2.

1)умеет регулировать задержку в диапазоне от 0,01сек до 2,00сек.
2)При однократном нажатии шаг 0,01, при длительном удержании кнопки быстро с шагом 0,1.
3)При достижении минимума и максимума значений сигнализирует об этом.
4)Реализовано сохранение значений таймера."

qwone и b707 дали мне полезные советы, за что я им и благодарен.

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

P.S.

И если я, всего лишь некомпитентный автор поста и неумелый "программист" ( о чем я и сказал). То Вы безграмотный и хамовитый выскочка. Вот только я смогу научиться писать, а Вы...?.

"Критикуешь - предлагай" КРИТИКА́НСТВО - Неодобр. Придирчивая, но поверхностная и пристрастная критика.

К сожалению я не знаю как изменить тему или удалить. На этом я предлагаю остановить обсуждение во избежания послесловия.