Официальный сайт компании Arduino по адресу arduino.cc
Реле времени (готовый проэкт)
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Вс, 10/03/2019 - 00:47
#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); //задержка для стабильности }
В связи с тем, что это мой первый проект ( не считая ctr+с & ctr+v других проэктов с сети) хотелось бы услышать мнение, а главное критику, желательно обоснованную. И рекоммендации в оптимизации. Заранее благодарен!
В связи с тем, что это мой первый проект ( не считая ctr+с & ctr+v других проэктов с сети) хотелось бы услышать мнение, а главное критику, желательно обоснованную. И рекоммендации в оптимизации. Заранее благодарен!
вы этом случае вам, кроме кода, стоит выложить пояснение - что это, для чего и как этим кодом пользоваться - для тех, кто захочет повторить проект.
потребавалось реле времени с точной регулировкой времени срабатывания в момент подачи сигнала с концевика. Работает с концевиком CSH-223. Построено на базе Arduino Nano, 2 кнопки, концевик CSH-223, lcd дисплей 16*2.
1)умеет регулировать задержку в диапазоне от 0,01сек до 2,00сек.
2)При однократном нажатии шаг 0,01, при длительном удержании кнопки быстро с шагом 0,1.
3)При достижении минимума и максимума значений сигнализирует об этом.
4)Реализовано сохранение значений таймера.
Как минимум половина кода лишняя , а обработчик кнопок просто кошмарный.
Переменные типа float в принципе не нужны в этом коде.
А мне особенно понравились функции maximumm() и minimumm() - вместо того что реально ограничивать значения. они просто пишут на дисплее "Максимум" %)
В общем, очередной бесполезный проект. Автор чуть освоится и сам поймет, что выкладывать такие примеры нет смысла - написать свой код быстрее, чем вылавливать косяки в чужом.
Ну почему бесполезный?
Если автору хочется научиться выкладывать проекты, то почему не потренироваться на негодном?
Правда, то, что выложегно - не проект:
- где описание целей и задач проекта?
- где схема?
- где фото?
- где описание процесса с указанием возникших проблем?
И еще, то, что содержится в коде - это не комментарии. От слова "совсем". Комментарии должны не дублировать код, а объяснять, зачем это делается.
Ну и еще по поводу коментариев:
- строка 009 - ладно, понятно: два концевика (только почему слово в единственном числе?)
- строка 010 - а зачем в проекте 12 индикаторов?
- почему в строках 16-17 и 20-21 кнопки называются "+" и "-", а в строках 86 и 93 уже "первая" и "второая"?
Можно конкретнее по поводу обработчика кнопок и если не float то на дисплей выводится 0 вместо 0.2
А мне особенно понравились функции maximumm() и minimumm() - вместо того что реально ограничивать значения. они просто пишут на дисплее "Максимум" %)
В общем, очередной бесполезный проект. Автор чуть освоится и сам поймет, что выкладывать такие примеры нет смысла - написать свой код быстрее, чем вылавливать косяки в чужом.
Если Вы посмотрите внимательнее, то увидите что значение ограничивается в лупе. И почему он бесполезный? Этот проект полноценно работает( да, были коррективы, но не существенные)
Ну почему бесполезный?
Если автору хочется научиться выкладывать проекты, то почему не потренироваться на негодном?
Правда, то, что выложегно - не проект:
- где описание целей и задач проекта?
- где схема?
- где фото?
- где описание процесса с указанием возникших проблем?
И еще, то, что содержится в коде - это не комментарии. От слова "совсем". Комментарии должны не дублировать код, а объяснять, зачем это делается.
Ну и еще по поводу коментариев:
- строка 009 - ладно, понятно: два концевика (только почему слово в единственном числе?)
- строка 010 - а зачем в проекте 12 индикаторов?
- почему в строках 16-17 и 20-21 кнопки называются "+" и "-", а в строках 86 и 93 уже "первая" и "второая"?
Концевика не 2 и индикаторов не 12... Это пины...
Схемы нет т.к. в проекте всего 3 кнопки .
Краткое описание было 2м комментарием. И спасибо первому и второму автору комментариев за единственные полезные советы.
И почему он бесполезный?
Бесполезный не в том смысле, что никуда не годится - а в смысле, что вряд ли кому-то принесет пользу. кроме вас. Новый под свои нужды быстрее написать, чем в вашем разбираться, тем более что косяков в коде хватает.
Не обижайтесь. И если хотите выкладывать действительно полезные проекты - прислушайтесь к замечаниям в сообщении #7. Проект, предназаначенный для широкого доступа - должен быть правильно оформлен, снабжен грамотным описанием и внятными комментариями, схемой и фото. Для "полезного" проекта это обязательные условия.
Начиная с какого количества кнопок появляется схема?
Процитируйте, пожалуйста, а то я в упор не вижу ничего, что хоть немного напоминало бы описание проекта.
И, кстати, второй пост в теме - не Ваш.
Да чего Вы спорите-то? Посмотрите другие проекты. Или чукча не читатель, чукча - писатель.
Кстати, Вы просили критику - немного получили. Зачем начинаете спорить?
Начиная с какого количества кнопок появляется схема?
Процитируйте, пожалуйста, а то я в упор не вижу ничего, что хоть немного напоминало бы описание проекта.
И, кстати, второй пост в теме - не Ваш.
Да чего Вы спорите-то? Посмотрите другие проекты. Или чукча не читатель, чукча - писатель.
Кстати, Вы просили критику - немного получили. Зачем начинаете спорить?
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.
И если я, всего лишь некомпитентный автор поста и неумелый "программист" ( о чем я и сказал). То Вы безграмотный и хамовитый выскочка. Вот только я смогу научиться писать, а Вы...?.
"Критикуешь - предлагай" КРИТИКА́НСТВО - Неодобр. Придирчивая, но поверхностная и пристрастная критика.
К сожалению я не знаю как изменить тему или удалить. На этом я предлагаю остановить обсуждение во избежания послесловия.