Доброго дня. Я только начал изучать программирование на Arduino, и столкнулся с такой проблемой - вопросом. Суть программы - 3 "секундомера", которые начинают свой отсчет по нажатию соответсвующей кнопки. Пока активен один - другие на паузе. Как это возможно реализовать, так как в моем коде появляется своеобразный "приоритет", тот секундомер который "выше" не дает переключаться на другие? Плата Mega 2560
Сразу говорю - это кусок кода всей программы. В программе есть кнопка переключения между программами при соблюдении условия. (OK.flagPress)
З.З.Ы. так же присутствует кнопка для вывода всех показаний сразу ( как результат).
Заранее благодарю, прошу сразу не бросаться в меня :)
#define GK_PIN 22 // Кнопка зеленых
#define RK_PIN 24 // кнопка красных
#define YK_PIN 26 // кнопка желтых
#define EK_PIN 29
#define OK_PIN 50
Button GK(GK_PIN, 20); // создание кнопки зеленых
Button RK(RK_PIN, 20); // создание кнопки красных
Button YK(YK_PIN, 20); // создание кнопки желтых
Button EK(EK_PIN, 20); // создание вывода результатов
Button OK(OK_PIN, 20);
int ledYellow = 27;
int ledRed = 25;
int ledGreen = 23;
unsigned long startR =0;
unsigned long startG=0;
unsigned long startY=0;
unsigned long x = 0;
unsigned long c = 0;
unsigned long z = 0;
unsigned long hourR;
unsigned long minuteR;
unsigned long secondR;
unsigned long hourG;
unsigned long minuteG;
unsigned long secondG;
unsigned long hourY;
unsigned long minuteY;
unsigned long secondY;
void setup(){
hourR = x / 3600;
minuteR = (x - hourR * 3600) / 60;
secondR = (x - minuteR * 60 - hourR * 3600);
hourG = c / 3600;
minuteG = (c - hourG * 3600) / 60;
secondG = (c - minuteG * 60 - hourG * 3600);
hourY = z / 3600;
minuteY = (z - hourY * 3600) / 60;
secondY = (z - minuteY * 60 - hourY * 3600);
pinMode(25, OUTPUT);
pinMode(23, OUTPUT);
pinMode(27, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(GK_PIN,INPUT_PULLUP);
pinMode(RK_PIN,INPUT_PULLUP);
pinMode(YK_PIN,INPUT_PULLUP);
pinMode(EK_PIN,INPUT_PULLUP);
}
void loop() {
OK.scanState();
GK.scanState();
RK.scanState();
YK.scanState();
EK.scanState();
else if (OK.flagPress == false) {
CheckScanStateEK();
CheckScanStateRed();
CheckScanStateGreen();
CheckScanStateYellow();
// Дополнительные функции ----------------------------- Дополнительной программы --------------------------------
void CheckScanStateEK()
{
if (EK.flagPress == true) {
EK.flagPress = true;
myOLED.clrScr();
myOLED.print ("HTPEKMNFNS", CENTER, 0);
myOLED.print("R", LEFT, 10);
myOLED.print(timerR(), CENTER, 10);
myOLED.print("P", LEFT, 20);
myOLED.print(timerG(), CENTER, 20);
myOLED.print(":", LEFT, 30);
myOLED.print(timerY(), CENTER, 30);
myOLED.update();
}
}
void CheckScanStateRed()
{
if (RK.flagClick == true) { // запуск при нажатии кнопки командой
RK.flagClick = true;
GK.flagClick = false;
YK.flagClick = false;
inc_timerR();
digitalWrite(ledRed, HIGH);
digitalWrite(ledGreen, LOW);
digitalWrite(ledYellow, LOW);
myOLED.clrScr();
myOLED.print("RHFCYST", CENTER, 0);
myOLED.print("FRNBDBHJDFKB", CENTER, 20);
myOLED.print("R", LEFT, 40);
myOLED.print(timerR(), CENTER, 40);
myOLED.update();
}
}
void CheckScanStateGreen()
{
if (GK.flagClick == true){
GK.flagClick = true;
RK.flagClick = false;
YK.flagClick = false;
inc_timerG();
digitalWrite(ledRed, LOW);
digitalWrite(ledGreen, HIGH);
digitalWrite(ledYellow, LOW);
myOLED.clrScr();
myOLED.print("PTKTYST", CENTER, 0);
myOLED.print("FRNBDBHJDFKB", CENTER, 20);
myOLED.print("P", LEFT, 40);
myOLED.print(timerG(), CENTER, 40);
myOLED.update();
}
}
void CheckScanStateYellow()
{
if (YK.flagClick == true) {
YK.flagClick = true;
RK.flagClick = false;
GK.flagClick = false;
inc_timerY();
digitalWrite(ledRed, LOW);
digitalWrite(ledGreen, LOW);
digitalWrite(ledYellow, HIGH);
myOLED.clrScr();
myOLED.print(":TKNST", CENTER, 0);
myOLED.print("FRNBDBHJDFKB", CENTER, 20);
myOLED.print(":", LEFT, 40);
myOLED.print(timerY(), CENTER, 40);
myOLED.update();
}
}
void inc_timerR()
{
Serial.println (startR);
Serial.println(millis());
if (startR<millis()) {
x++;
startR = millis() + 500;
hourR = x / 3600;
minuteR = (x - hourR * 3600) / 60;
secondR = (x - minuteR * 60 - hourR * 3600);
//time_controlR();
Serial.println (startR);
Serial.println(millis());
}
}
void inc_timerG()
{
Serial.println (startG);
Serial.println(millis());
if (startG<millis()) {
c++;
startG = millis() + 500;
hourG = c / 3600;
minuteG = (c - hourG * 3600) / 60;
secondG = (c - minuteG * 60 - hourG * 3600);
//time_controlG();
}
}
void inc_timerY()
{
Serial.println (startY);
Serial.println(millis());
if (startY<millis()) {
z++;
startY = millis() + 500;
hourY = z / 3600;
minuteY = (z - hourY * 3600) / 60;
secondY = (z - minuteY * 60 - hourY * 3600);
//time_controlY();
}
}
rizorpolder,ну и чем можно вам помочь. То что вы заехали не туда это ясно и вам. Но с моего взгляда вы поехали изначально не той дорогой. С мой точки зрения надо начинать составлять два типа класса - класс кнопка и класс секундомер. А потом все скомпоновать правильно. Бета тестировка и все.
Ды класс для кнопки создан, там подтянут через библиотеку. Код работает, все считает правильно,но есть одно НО - при нажатии на кнопку 3 - строка 59 все хорошо. При нажатии кнопки 2 - все работает, НО на кнопку 3 уже не перейти и так далее. Но если изменить клик кнопки с true-true на true-false, то кнопки работают, а таймер становится своего рода "кликером" ( 1 нажатие = +1 к переменной). Вот и вопрос - почему в первом варианте получается своеобразный "приоритет" программ. Или я загоняю программу в цикл, который не прерывается(строка 57)?
Так криво спроектирован таймер. Но вы проектировали таймер, так что все вопросы к пректировщику. У меня тоже программы не сразу запускаются. Даже как правило , запускаюся не с первого раза. Но ковыряться в чужом коде, если он написан не мной тяжко. А если я и начинаю, то код переписывается целиком или частями. А это значит, что тогда вы перестанете понимать переписаный код.
Вот пусть у вас есть класс Cl_timer, и Timer1,Timer2,Timer3 представители этого класса. Понятно что есть метод start(); - обнуляет таймер и начинает заново считать,метод stop()-отстанавливает счет , метод continue()- продолжает счет после стоп. ну и show() - показывает, что там натикало. Вот что бы считал один таймер надо Timer1.start() или(Timer1.continue()) ну а остальные Timer2.stop(),Timer3.stop()
Винни, напиши статейку по классам для чайников. У меня тоже не лезет в мозг сама концепция, хотя видно что это круто удобно, но в инете нет внятных статей на русском, а твоих тезисов не хватает для понимания сути.
Винни, напиши статейку по классам для чайников. У меня тоже не лезет в мозг сама концепция, хотя видно что это круто удобно, но в инете нет внятных статей на русском, а твоих тезисов не хватает для понимания сути.
Так я порывался написать, но первое каждый раз узнавал немного нового и приходится пересматривать. второе - я же не классы использую, а классы с конструктором, setup() и loop() методами , третье есть же концепция многопоточной системы. Так там идет разделение потоков на низком уровне . Но это жрет много памяти. А вот разделение на потоки на высоком уровне оказалось проще. Четвертое - сам подход к проектированию программы. Ведь на самом деле я подход к проектированию не менял . Менялись инструменты. Вот эти тезисы вроде явно понятны для меня, но почему-то туги для остальных. Ведь я же напрямую выкладываю исходники. И все равно не понятно.
Помогите пожалуйста. Нужно ,чтобы при нажатии 5 кнопок, загорелся один диод. Скетч загружается, но как надо не работает. Сильно не ругайте. Неделю назад взял ардуино в руки.
Но похоже голову забыли там,где взяли ардуину. То что код вставили неправильно. Новички на это забивают. Вот код.
digitalRead (buttonEpin);
замечательно. Состояние вы прочитали, но вот куда его поместить забыли. Или вы ходите в магазин, расплачиваетесь на кассе. И там на кассе оставляете товар. Нафиг руки надрывать.
if (2,3,4,5,6 == HIGH)
И вот вы пришли домой и сели смотреть футбол. Вам захотелось попить купленое пиво. Ну да пиво осталось на кассе. Так поэтому вы наслождаетесь "виртуальным пивом", которое лежит на кассе в кучке из 2, 3,4,5 и 6 товара.
ПС: Извините, за язвительнось, но новички попадаются такие "новички", что иначе им ум не возможно добавить. Видно школа не дорабатывает.
Нет времени изучать язык "Си" , а нужно уже вчера. Сейчас строю 3 квеста. Есть предложение: Вы пишете скетчи под конкретные задачи (их будет много), я перевожу вам деньги на карту. С железом я разберусь сам.
Нет времени изучать язык "Си" , а нужно уже вчера. Сейчас строю 3 квеста. Есть предложение: Вы пишете скетчи под конкретные задачи (их будет много), я перевожу вам деньги на карту. С железом я разберусь сам.
Уважаемый qwone.Подскажите,как изменить скетч,чтоб на вход подавать +5в,а не 0.Нужно чтоб вход управлялся +12в через делитель.R1=10kom на землю,R2=24kom.Спасибо.
прошу сильно не пинать, понимаю, что вопрос ламерский)))
Есть двойной переключатель (каким нормальный люди свет включают). Хочу привязать его к ардуино. Схема в аттаче.
S1, S2 - кнопки с фиксацией, резисторы по науке, подтяжка на землю.
Получаю следующую картину. Пока S1 разомкнут, переключаю S2 - все замечательно. Но стоит замкнуть S1 и переключать S2, отрабатывает как бог пошлет. Соответственно наоборот тоже самое, пока S2 разомкнут можно щелкать S1, все работает, стоит S2 замкнуть и абзац.
Что подскажете? Может использовать подтяжку к питанию? Видел схему с резистивным делителем напряжения, конечно вариант, но хотелось бы понять, почему такой вариант не работает.
Знаю я все про дребезг, сам писал в эту же тему про него. И в первом коде есть защита от него. В коде с прерываниями я отключаю прерывание, обрабатываю нажатие и включаю прерывание обратно. Дребезга никакого нет. Тут проблема именно в том, что кнопок ДВЕ!!! Пока она одна все работает, как только замыкаю вторую начинается хаос
Убрать из loop обработку кнопок, убрать задержку 100мс на обработку дребезга. Проект высоконагруженный, в лупе крутится очень много всего, в частности обмен данными, любые задержки сказываются лагами. Хочется оптимизации))) Не круто тратить ресурсы на то, что не нажимается))) Причем с сенсорной кнопкой и звонковой кнопкой все отрабатывает. И даже в единичным переключателем все замечательно. Проблемы начинаются, когда их именно ДВА
Заметил закономерность, если одна кнопка замкнута, то при замыкании второй отрабатывается код обработчика первой кнопки, и наоборот. Такое впечатление, что прерывание отрабатывает, только не на той кнопке которую нажимают, а на той, которая уже замкнута
Убрать из loop обработку кнопок, убрать задержку 100мс на обработку дребезга. Проект высоконагруженный, в лупе крутится очень много всего, в частности обмен данными, любые задержки сказываются лагами.
что это за обработчик дребезга у тебя, который лагает прогрограмму на 100мс?
такого в принципе быть не должно.
gonzales пишет:
Не круто тратить ресурсы на то, что не нажимается)))
круто-некруто - при нажатии кнопки твои драгоценные ресурсы потратятся и ты так или иначе вылетишь в аварийную ситуацию.
если считаешь, что опрос кнопки тебе грозит катастрофой, то так и случится.
*не знаю - опрос матрицы из 100 кнопок занимает 3750 микросекунд - 37,5 микросекунд на одну кнопку. это много? #479
Прошу помощи, собираю планшет в машину для управления с руля использую ардуино микро тут возникла идея прикрутить к ней ещё и энкодер не могу понять как соеденить два скетча ! И как правильно их подключить вместе к ардуино, я в этом деле ночёвок и много го не понимаю, буду благодарен за помощь!
что это за обработчик дребезга у тебя, который лагает прогрограмму на 100мс?
такого в принципе быть не должно.
Код выше. Возможно можно сократить время до какого-то разумного значения.
Клапауций 112 пишет:
не знаю - опрос матрицы из 100 кнопок занимает 3750 микросекунд - 37,5 микросекунд на одну кнопку. это много?
спасибо, библиотеку посмотрю!
Проблема осложняется тем, что я изначально не знаю, на каких пинах кнопка, для этого каждый раз пробегаю все доступные пины, проверяю, что там кнопка и только после этого считываю ее состояние. Сам понимаешь, это все время.
Код выше. Возможно можно сократить время до какого-то разумного значения.
ну, и в каком месте твоего кода у тебя должно лагать?
gonzales пишет:
Сам понимаешь, это все время.
думаю, ты ты сам не до конца понимаешь, как это у тебя работает - время удержания кнопки во время её нажатия по любому будет больше времени опроса всех кнопок.
думаю, ты ты сам не до конца понимаешь, как это у тебя работает - время удержания кнопки во время её нажатия по любому будет больше времени опроса всех кнопок.
я пытаюсь оптимизировать все настолько, насколько возможно. Раз прерывания не используются в системе, почему бы их не задействовать. И не нужно ничего опрашивать. В системе не только кнопки, еще различные датчики, которые тоже надо опрашивать, плюс обработка входящих команд и посылка ответов, все вместе немного подлагивает)))
Но я так понимаю, именно двойной выключатель не прикрутить таким образом, придется еще что-то придумывать.
ЗЫ. За библу еще раз спасибо, попробую ее прикрутить
Здравствуйте делаю планшет в машину! Остановился на подключении кнопок на руле точнее я подключил ардуйно про микро и кнопки но сейчас решил добавить энкодер и теперь не знаю как объединить два сетча помогите пожалуйста , сам не осилю! По отдельности все работает! Заранее спасибо
это для энкодера
#define BTN_pin 8 // pin 8 кнопка энкодера SW
const int pin_A = 10; // pin 10 нога энкодера CLK
const int pin_B = 9; // pin 9 нога энкодера DT
unsigned char encoder_A; //переменная
unsigned char encoder_B; //переменная
unsigned char encoder_A_prev=0; //переменная
uint32_t vibor = 0; //Здесь будем хранть время
int perek = 0; //переменная переключатель
void setup() {
digitalWrite(BTN_pin, 1); //подтяжка кнопки энкодера
pinMode(pin_A, INPUT); //пины энкодера объявляем входами
pinMode(pin_B, INPUT); //пины энкодера объявляем входами
Keyboard.begin(); //подключим как клава
}
void loop()
{
{ encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); // считываем состояние выхода B энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B)
{
Remote.increase(); //отправляем команду громкость выше
Remote.clear(); //очищаем команду
}
else {
Remote.decrease(); //отправляем команду громкость ниже
Remote.clear(); //очищаем команду
}
}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла
}
if(digitalRead(BTN_pin)==LOW) //Если кнопка нажата то делаем то что ниже.
{
Keyboard.press(KEY_LEFT_ALT); //нажмем кнопку ALT
Keyboard.press(KEY_TAB); //нажмем кнопку TAB
Keyboard.release(KEY_TAB); //отпустим кнопку TAB
delay(150); //ждем 150мс чтоб не скакало по окошкам
vibor = millis(); //запускаем отсчет времени
perek=1; //переменной переключателя присваиваем 1
}
if((vibor && millis()-vibor > 1000) && perek==1) //если прошло больше 1 секунды и перемменая переключателя = 1
{
Keyboard.releaseAll(); //отпускаем все кнопки
perek = 0; //переменной переключателя присваиваем 0 чтоб сюда больше не заходил
}
}
для кнопок на руль
int rknop; // это переменная которая хранит значения наших кнопок.
void setup()
{
Serial.begin(9600); //это скорость соединения с компьютером (для сериал монитора в нашем случае)
pinMode(rknop,INPUT);
}
void loop()
{
rknop=analogRead(A0); //Считываем значения на порту A0 и записываем значения в переменную rknop
Serial.println(rknop); //Отправляем данные переменной rknop на компьютер
delay(200); //небольшая задержка в пол секунды, её можно удалить но значения в сериал мониторе будет меняться очень быстро
///////////////////////////////////////////
if(rknop < 969 && rknop > 966) //здесь мы делаем условие. Т.е если у наз значение переменной rknop больше 900 и меньше 960 то делаем какоето действие которая ниже. На сколько мы помним при нажатии кнопки S1 у нас значения были ~930 так вот мы могли написать просто if(rknop == 930) что означает если rknop равно 930 то делем дейсвие которое ниже, но наши значения немного игрют поэтому мы задаем никий промежуток от 900 до 960
{
Remote.next(); //отправляем команду следующая песня
delay(200); //делаем небольшую задержу чтоб устройство успело отправить необходимые команды на планшет или компьютер и не засыпать его командами
Remote.clear();//очищаем команду
}
////////////////////////////////////////////
if(rknop < 994 && rknop > 992)
{
Remote.previous(); //предыдущая песня
delay(200);
Remote.clear();
}
////////////////////////////////////////////
if(rknop < 927 && rknop > 925)
{
Remote.play_pause(); //плей и паузу
delay(200);
Remote.clear();
}
////////////////////////////////////////////
if(rknop < 1009 && rknop > 1007)
{
Remote.increase(); //громкость прибавить
delay(000);
Remote.clear();
}
////////////////////////////////////////////
if(rknop < 1019 && rknop > 1015)
{
Remote.decrease(); //громкость убавить
delay(000);
Remote.clear();
}
Добрый час. Прошу помощи пожалуйста не могу разобраться уже которую неделю. Проблема заключается в следующим. Купили DUE для АВР написали код на ручной запуск и автоматический, на ручном все работает. На автоматическом все коту под хвост. Дело в том что АВР в автономном режиме должна понимать что если света нет, то запустить генератор и работать до тех пор пока не включат свет на линии. Как только свет подают, то ардуина должна понять что свет дали и заглушить генератор. Все хорошо до того момента как свет появляется, ардуина не читает с пина что свет дали (( лине выключает генератор еще есть такая проблема что после включения генератора ардуино думает что это дали свет с главной линии и останавливает генератор, но эту проблему вроде решил. Ниже скину весь код в самом конце кода последняя проверка if (digitalRead(btn)==ON && one==0){ вот там вся проблема ардуино не понимает что свет включился на главном вводе (( хотя когда его отключаешь программа запуска генератора выполняется(( есть еще такой большой вариант то что это все DUE гонит она китайская((. Был бы благодарен если бы подсказали что может быть не так. есть еще несколько вариантов кода но суть не меняется((
Спасибо.
#define ON 0 // константа 0
#define OFF 1 // константа 1 (в данной строке 1 преоброзовывается в 0, тем самым значения OFF на самой Ардуино становится низким)
int one = 1;
bool button_state = false; // переменная для хранения состояния кнопки
int flag = 0; // значение для переменной 0
int btn = 43;
void setup() {
Serial.begin(115200);
Serial.println("Welcome");
// подтягивающий резистор на PIN'ы для реле
digitalWrite(46, OFF); // Реле Свечи накала
digitalWrite(45, OFF); // Реле АСС
digitalWrite(44, OFF); // Реле Стартер
//------------------------------------------//
digitalWrite(43, OFF); // Реле Основной ввод (статус)
digitalWrite(42, OFF); // Реле Питание от генератора(статус)
digitalWrite(41, OFF); // Реле Подогрев
//-----------------------------------------//
digitalWrite(40, OFF); // Реле РЕЗЕРВ
// digitalWrite(36, OFF); // Лед запуска генератора
digitalWrite(37, OFF); // Реле РЕЗЕРВ
digitalWrite(38, OFF); // Реле РЕЗЕРВ
digitalWrite(39, OFF); // Реле РЕЗЕРВ
// подтягивающий резистор на PIN'ы для LED
digitalWrite(53, ON); // Синий LED Выполнение
digitalWrite(52, ON); // Большой Синий LED Статус Автомтический режим АВР
digitalWrite(51, ON); // Белый LED Статус Ручной режим АВР
// Реле
pinMode(46, OUTPUT); // Реле Свечи накала
pinMode(45, OUTPUT); // Реле АСС
pinMode(44, OUTPUT); // Реле Стартер
pinMode(36, INPUT_PULLUP); // Лед запуска генератора
pinMode(37, OUTPUT); // реле катушек ГЕНЕРАТОРА
pinMode(38, OUTPUT); // реле катушек ОСНОВНОГО ВООДА
pinMode(btn, INPUT); // Реле Основной ввод СТАТУС
pinMode(42, OUTPUT); // Реле Питание от генератора СТАТУС
pinMode(41, OUTPUT); // Реле Подогрев
// Кнопки ВЛК/ВЫКЛ
pinMode(50, INPUT_PULLUP); // Кнопка Запуска генератора
pinMode(49, INPUT_PULLUP); // Кнопка Глушение генератора
pinMode(48, INPUT_PULLUP); // Кнопка Ручной режим АВР
pinMode(47, INPUT_PULLUP); // Кнопка Автоматический режим АВР
// Светодиоды LED Статусы
pinMode(53, OUTPUT); // Синий LED Выполнение
pinMode(52, OUTPUT); // Большой Синий LED Статус Автомтический режим АВР
pinMode(51, OUTPUT); // Белый LED Статус Ручной режим АВР
}
void loop() {
// Кнопка Ручной режим АВР то делай ...
if (digitalRead(48) == LOW){
digitalWrite(51, LOW);/*отключаем белый диод*/
digitalWrite(52, HIGH); /*включаем синий диод*/
// Запуск генератора с кнопки Старт
if (digitalRead(50) == LOW && !button_state){
button_state = true;
Serial.println("[-Mode manual start-]");
digitalWrite(53, OFF); // Вкл Синий LED
delay(2000); // ждем 1 секунд
Serial.println(" -Start Svechi nakala");
digitalWrite(46, ON); // зажигаем свечи накала
delay(15000); // ждем 15 секунд
Serial.println(" —---->power generator ON");
digitalWrite(37, ON); // Отключаем ввод генератора
delay(100);
digitalWrite(38, ON); // Отключаем основной ввод
delay(2000);
Serial.println(" -Stop Svechi nakala");
digitalWrite(46, OFF); // отключаем свечи накала
delay(1000); // ждем 1 секунд
Serial.println(" -Start ACC");
digitalWrite(45, ON); // включаем АСС
delay(1500); // ждем 1 секунд
Serial.println(" -Start Starter");
digitalWrite(44, ON); // Включаем стартер
delay(1500); // ждем 1.5 секунды
Serial.println(" -Stop Starter");
digitalWrite(44, OFF); // Отключаем стартер
delay(120000);
Serial.println(" —---->power generator OFF");
digitalWrite(37, OFF); // Включаем ввод генератора
delay(100);
digitalWrite(38, OFF); // Отключаем основной ввод
delay(1000);
Serial.println(" -Stop BLUE Led");
digitalWrite(53, ON); // отключаем светодиод синий
delay(2000); // ждем 2 секунд
Serial.println("[-Mode manual on-]");
}
else {
// Статус кнопки FALSE
button_state = false;
}
// Глушение генератора с кнопки
if (digitalRead(49) == LOW && !button_state) {
button_state = true;
digitalWrite(53, OFF); // Включаем светодиод синий
delay(1000);
digitalWrite(37, ON); // Отключаем ввод генератора
delay(100);
digitalWrite(38, ON); // Отключаем основной ввод
delay(1000);
Serial.println("[-StopACC-]");
digitalWrite(45, OFF); // Отключаем АСС
delay(10000);
digitalWrite(37, OFF); //Включаем ввод генератора
delay(100);
digitalWrite(38, OFF); //Включаем основной ввод
delay(1000);
Serial.println(" -Stop BLUE Led");
digitalWrite(53, ON); // отключаем светодиод синий
}
}
// Если кнопка на автоматическом режиме то делай ...
if (digitalRead(47) == LOW){
digitalWrite(52, LOW);/*отключаем синий диод*/
digitalWrite(51, HIGH); /*включаем белый диод*/
//*******LOGI*********//
//Serial.println(digitalRead(36));
delay(1000);
// Проверить есть ли свет ??
if (digitalRead(btn)==OFF && one==1){
Serial.println("[-Mode automatic start-]");
digitalWrite(53, OFF); // Вкл Синий LED
delay(2000); // ждем 1 секунд
Serial.println(" -Start Svechi nakala");
digitalWrite(46, ON); // зажигаем свечи накала
delay(15000); // ждем 15 секунд
Serial.println(" —---->power generator ON");
digitalWrite(37, ON); // Отключаем ввод генератора
delay(100);
digitalWrite(38, ON); // Отключаем основной ввод
delay(2000);
Serial.println(" -Stop Svechi nakala");
digitalWrite(46, OFF); // отключаем свечи накала
delay(1000); // ждем 1 секунд
Serial.println(" -Start ACC");
digitalWrite(45, ON); // включаем АСС
delay(1500); // ждем 1 секунд
Serial.println(" -Start Starter");
digitalWrite(44, ON); // Включаем стартер
delay(1500); // ждем 1.5 секунды
Serial.println(" -Stop Starter");
digitalWrite(44, OFF); // Отключаем стартер
delay(120000);
Serial.println(" —---->power generator OFF");
digitalWrite(37, OFF); // Включаем ввод генератора
delay(100);
digitalWrite(38, OFF); // Отключаем основной ввод
delay(1000);
Serial.println(" -Stop BLUE Led");
digitalWrite(53, ON); // отключаем светодиод синий
delay(9000); // ждем 2 секунд
one=0;
// Света нету , есть свет от генератора
}
if (digitalRead(btn)==ON && one==0){
digitalWrite(53, OFF); // Включаем светодиод синий
delay(1000);
digitalWrite(37, ON); // Отключаем ввод генератора
delay(100);
digitalWrite(38, ON); // Отключаем основной ввод
delay(1000);
Serial.println("[-Stop ACC-]");
digitalWrite(45, OFF); // Отключаем АСС
delay(10000);
digitalWrite(37, OFF); //Включаем ввод генератора
delay(100);
digitalWrite(38, OFF); //Включаем основной ввод
delay(1000);
Serial.println(" -Stop BLUE Led");
digitalWrite(53, ON); // отключаем светодиод синий
one=1;
}
}
}
если использовать вместо delay то может пройдет7 просто уже как не пробовал6 самое что интересно что когда свет отключаеться ардуино понимает что пин 43 упал и надо завести енератор а когда свет дали 99 она не понимает хотя простой if =((
Уважаемый qvone.Руки дошли до проверки таймера,оказалось ,что он не в том режиме работает.Нужно чтоб при появлении +5в на входе реле вкл "навсегда",а при исчезновении +5 в на входе -начинался отсчет(задержка отключения по управляющему входу)
Уважаемый qvone.Руки дошли до проверки таймера,оказалось ,что он не в том режиме работает.Нужно чтоб при появлении +5в на входе реле вкл "навсегда",а при исчезновении +5 в на входе -начинался отсчет(задержка отключения по управляющему входу)
А просто обменять местами обработчики нажатия и отжатия??
если использовать вместо delay то может пройдет7 просто уже как не пробовал6 самое что интересно что когда свет отключаеться ардуино понимает что пин 43 упал и надо завести енератор а когда свет дали 99 она не понимает хотя простой if =((
У вас завести генератор идет целая временная процедура, а не просто вкл реле. Отключить генератор тоже идет процедура. А что делать если свет пропал и снова появился а генератор еще не заведен. Или обратно свет включили на несколько минут а генератору что делать?
При нажатии и удерживании кнопки более 2 секунд начинал работать генератор с частотой в 25 мс и отключалать при нажатии этой кнопки, а при нажатии второй кнопки и ее удерживании более 2 сек включалась защелка на другом выходе, но отключалась при кратковременном нажатии этой кнопки.
Спасибо всем. я просто чет истерю иногда))) все заработало, пояснения вроде все поправил)))
пульт буду припиливать уже не сегодня, но там все просто, уже баловался с ним
время реакции пока поставил 500мс, дальше видно будет в процессе использования
еще раз всем спасибо.
в конце скрин монитора порта
Доброго дня. Я только начал изучать программирование на Arduino, и столкнулся с такой проблемой - вопросом. Суть программы - 3 "секундомера", которые начинают свой отсчет по нажатию соответсвующей кнопки. Пока активен один - другие на паузе. Как это возможно реализовать, так как в моем коде появляется своеобразный "приоритет", тот секундомер который "выше" не дает переключаться на другие? Плата Mega 2560
Сразу говорю - это кусок кода всей программы. В программе есть кнопка переключения между программами при соблюдении условия. (OK.flagPress)
З.З.Ы. так же присутствует кнопка для вывода всех показаний сразу ( как результат).
Заранее благодарю, прошу сразу не бросаться в меня :)
rizorpolder,ну и чем можно вам помочь. То что вы заехали не туда это ясно и вам. Но с моего взгляда вы поехали изначально не той дорогой. С мой точки зрения надо начинать составлять два типа класса - класс кнопка и класс секундомер. А потом все скомпоновать правильно. Бета тестировка и все.
Ды класс для кнопки создан, там подтянут через библиотеку. Код работает, все считает правильно,но есть одно НО - при нажатии на кнопку 3 - строка 59 все хорошо. При нажатии кнопки 2 - все работает, НО на кнопку 3 уже не перейти и так далее. Но если изменить клик кнопки с true-true на true-false, то кнопки работают, а таймер становится своего рода "кликером" ( 1 нажатие = +1 к переменной). Вот и вопрос - почему в первом варианте получается своеобразный "приоритет" программ. Или я загоняю программу в цикл, который не прерывается(строка 57)?
Так криво спроектирован таймер. Но вы проектировали таймер, так что все вопросы к пректировщику. У меня тоже программы не сразу запускаются. Даже как правило , запускаюся не с первого раза. Но ковыряться в чужом коде, если он написан не мной тяжко. А если я и начинаю, то код переписывается целиком или частями. А это значит, что тогда вы перестанете понимать переписаный код.
Понял. Спасибо. Будем копать в разных направлениях)
Вот пусть у вас есть класс Cl_timer, и Timer1,Timer2,Timer3 представители этого класса. Понятно что есть метод start(); - обнуляет таймер и начинает заново считать,метод stop()-отстанавливает счет , метод continue()- продолжает счет после стоп. ну и show() - показывает, что там натикало. Вот что бы считал один таймер надо Timer1.start() или(Timer1.continue()) ну а остальные Timer2.stop(),Timer3.stop()
Винни, напиши статейку по классам для чайников. У меня тоже не лезет в мозг сама концепция, хотя видно что это круто удобно, но в инете нет внятных статей на русском, а твоих тезисов не хватает для понимания сути.
Так я порывался написать, но первое каждый раз узнавал немного нового и приходится пересматривать. второе - я же не классы использую, а классы с конструктором, setup() и loop() методами , третье есть же концепция многопоточной системы. Так там идет разделение потоков на низком уровне . Но это жрет много памяти. А вот разделение на потоки на высоком уровне оказалось проще. Четвертое - сам подход к проектированию программы. Ведь на самом деле я подход к проектированию не менял . Менялись инструменты. Вот эти тезисы вроде явно понятны для меня, но почему-то туги для остальных. Ведь я же напрямую выкладываю исходники. И все равно не понятно.
Помогите пожалуйста. Нужно ,чтобы при нажатии 5 кнопок, загорелся один диод. Скетч загружается, но как надо не работает. Сильно не ругайте. Неделю назад взял ардуино в руки.
int Led = 11 ;
замечательно. Состояние вы прочитали, но вот куда его поместить забыли. Или вы ходите в магазин, расплачиваетесь на кассе. И там на кассе оставляете товар. Нафиг руки надрывать.
И вот вы пришли домой и сели смотреть футбол. Вам захотелось попить купленое пиво. Ну да пиво осталось на кассе. Так поэтому вы наслождаетесь "виртуальным пивом", которое лежит на кассе в кучке из 2, 3,4,5 и 6 товара.
ПС: Извините, за язвительнось, но новички попадаются такие "новички", что иначе им ум не возможно добавить. Видно школа не дорабатывает.
Ничего я толком,так и не понял.
что то типа того?:
if (buttonApin ==HIGH && buttonBpin == HIGH.....)
digitalWrite (Led, HIGH);
ПС: Выкиньте Ардуину. Это не ваше занятие.
Спасибо большое. Работает.
ПС: ну тоже не сразу начали писать мега скетчи:)
Нет времени изучать язык "Си" , а нужно уже вчера. Сейчас строю 3 квеста. Есть предложение: Вы пишете скетчи под конкретные задачи (их будет много), я перевожу вам деньги на карту. С железом я разберусь сам.
ПС: ну тоже не сразу начали писать мега скетчи:)
Это не "мега скетчи", это основы программирования. Базовые кирпичики.
Нет времени изучать язык "Си" , а нужно уже вчера. Сейчас строю 3 квеста. Есть предложение: Вы пишете скетчи под конкретные задачи (их будет много), я перевожу вам деньги на карту. С железом я разберусь сам.
Для этого есть специальный раздел - Ищу исполнителя.
ок, спасибо
Уважаемый qwone.Подскажите,как изменить скетч,чтоб на вход подавать +5в,а не 0.Нужно чтоб вход управлялся +12в через делитель.R1=10kom на землю,R2=24kom.Спасибо.
GKV
Скорее всего будет так
Огромное Спасибо,пойду паять резисторы.
Вот если у вас там нет механических кнопок с дребезгом.
Кнопок нету.Есть сигналы в виде +12в от других контроллеров.Спасибо!
прошу сильно не пинать, понимаю, что вопрос ламерский)))
Есть двойной переключатель (каким нормальный люди свет включают). Хочу привязать его к ардуино. Схема в аттаче.
S1, S2 - кнопки с фиксацией, резисторы по науке, подтяжка на землю.
Получаю следующую картину. Пока S1 разомкнут, переключаю S2 - все замечательно. Но стоит замкнуть S1 и переключать S2, отрабатывает как бог пошлет. Соответственно наоборот тоже самое, пока S2 разомкнут можно щелкать S1, все работает, стоит S2 замкнуть и абзац.
Что подскажете? Может использовать подтяжку к питанию? Видел схему с резистивным делителем напряжения, конечно вариант, но хотелось бы понять, почему такой вариант не работает.
Заранее всем спасибо за ответы!
прошу сильно не пинать, понимаю, что вопрос ламерский)))
ну, и где всё, кроме электрической схемы подключения кнопки?
- код?
- длина и тип кабеля?
Вводные немного изменились))))
При стандатном методе обработки кнопок все работает. Вот код.
Но я переделал скеч на работу по прерываниям, и получаю вот такую неприятность.
Вот код работы по прерыванию
длина кабеля 10см. Тип - телефонный четырехжильный
Соответственно это код для одной кнопки. Для другой код такой же.
Соответственно это код для одной кнопки. Для другой код такой же.
У механических кнопок есть такое явление как дребезг, а вы их на прерывание.
Знаю я все про дребезг, сам писал в эту же тему про него. И в первом коде есть защита от него. В коде с прерываниями я отключаю прерывание, обрабатываю нажатие и включаю прерывание обратно. Дребезга никакого нет. Тут проблема именно в том, что кнопок ДВЕ!!! Пока она одна все работает, как только замыкаю вторую начинается хаос
Но я переделал скеч на работу по прерываниям, и получаю вот такую неприятность.
ок. а, какую цель ты преследуешь применяя прерывания для кнопки, которую нажимаешь рукой?
*я мог бы понять, если бы это был датчик затворного механизма авиационной пушки...
Убрать из loop обработку кнопок, убрать задержку 100мс на обработку дребезга. Проект высоконагруженный, в лупе крутится очень много всего, в частности обмен данными, любые задержки сказываются лагами. Хочется оптимизации))) Не круто тратить ресурсы на то, что не нажимается))) Причем с сенсорной кнопкой и звонковой кнопкой все отрабатывает. И даже в единичным переключателем все замечательно. Проблемы начинаются, когда их именно ДВА
Заметил закономерность, если одна кнопка замкнута, то при замыкании второй отрабатывается код обработчика первой кнопки, и наоборот. Такое впечатление, что прерывание отрабатывает, только не на той кнопке которую нажимают, а на той, которая уже замкнута
Убрать из loop обработку кнопок, убрать задержку 100мс на обработку дребезга. Проект высоконагруженный, в лупе крутится очень много всего, в частности обмен данными, любые задержки сказываются лагами.
что это за обработчик дребезга у тебя, который лагает прогрограмму на 100мс?
такого в принципе быть не должно.
Не круто тратить ресурсы на то, что не нажимается)))
круто-некруто - при нажатии кнопки твои драгоценные ресурсы потратятся и ты так или иначе вылетишь в аварийную ситуацию.
если считаешь, что опрос кнопки тебе грозит катастрофой, то так и случится.
*не знаю - опрос матрицы из 100 кнопок занимает 3750 микросекунд - 37,5 микросекунд на одну кнопку. это много? #479
Прошу помощи, собираю планшет в машину для управления с руля использую ардуино микро тут возникла идея прикрутить к ней ещё и энкодер не могу понять как соеденить два скетча ! И как правильно их подключить вместе к ардуино, я в этом деле ночёвок и много го не понимаю, буду благодарен за помощь!
что это за обработчик дребезга у тебя, который лагает прогрограмму на 100мс?
такого в принципе быть не должно.
Код выше. Возможно можно сократить время до какого-то разумного значения.
не знаю - опрос матрицы из 100 кнопок занимает 3750 микросекунд - 37,5 микросекунд на одну кнопку. это много?
спасибо, библиотеку посмотрю!
Проблема осложняется тем, что я изначально не знаю, на каких пинах кнопка, для этого каждый раз пробегаю все доступные пины, проверяю, что там кнопка и только после этого считываю ее состояние. Сам понимаешь, это все время.
Код выше. Возможно можно сократить время до какого-то разумного значения.
ну, и в каком месте твоего кода у тебя должно лагать?
Сам понимаешь, это все время.
думаю, ты ты сам не до конца понимаешь, как это у тебя работает - время удержания кнопки во время её нажатия по любому будет больше времени опроса всех кнопок.
думаю, ты ты сам не до конца понимаешь, как это у тебя работает - время удержания кнопки во время её нажатия по любому будет больше времени опроса всех кнопок.
я пытаюсь оптимизировать все настолько, насколько возможно. Раз прерывания не используются в системе, почему бы их не задействовать. И не нужно ничего опрашивать. В системе не только кнопки, еще различные датчики, которые тоже надо опрашивать, плюс обработка входящих команд и посылка ответов, все вместе немного подлагивает)))
Но я так понимаю, именно двойной выключатель не прикрутить таким образом, придется еще что-то придумывать.
ЗЫ. За библу еще раз спасибо, попробую ее прикрутить
И не нужно ничего опрашивать.
ты точно уверен, что у тебя в этом случае будет работать фильтр дребезга и прочие программные плюшки?
Здравствуйте делаю планшет в машину! Остановился на подключении кнопок на руле точнее я подключил ардуйно про микро и кнопки но сейчас решил добавить энкодер и теперь не знаю как объединить два сетча помогите пожалуйста , сам не осилю! По отдельности все работает! Заранее спасибо
это для энкодера
для кнопок на руль
Добрый час. Прошу помощи пожалуйста не могу разобраться уже которую неделю. Проблема заключается в следующим. Купили DUE для АВР написали код на ручной запуск и автоматический, на ручном все работает. На автоматическом все коту под хвост. Дело в том что АВР в автономном режиме должна понимать что если света нет, то запустить генератор и работать до тех пор пока не включат свет на линии. Как только свет подают, то ардуина должна понять что свет дали и заглушить генератор. Все хорошо до того момента как свет появляется, ардуина не читает с пина что свет дали (( лине выключает генератор еще есть такая проблема что после включения генератора ардуино думает что это дали свет с главной линии и останавливает генератор, но эту проблему вроде решил. Ниже скину весь код в самом конце кода последняя проверка if (digitalRead(btn)==ON && one==0){ вот там вся проблема ардуино не понимает что свет включился на главном вводе (( хотя когда его отключаешь программа запуска генератора выполняется(( есть еще такой большой вариант то что это все DUE гонит она китайская((. Был бы благодарен если бы подсказали что может быть не так. есть еще несколько вариантов кода но суть не меняется((
Спасибо.
Главная проблема это delay(). Но millis() требует немного другого подхода. И этот подход Си++.
если использовать вместо delay то может пройдет7 просто уже как не пробовал6 самое что интересно что когда свет отключаеться ардуино понимает что пин 43 упал и надо завести енератор а когда свет дали 99 она не понимает хотя простой if =((
Уважаемый qvone.Руки дошли до проверки таймера,оказалось ,что он не в том режиме работает.Нужно чтоб при появлении +5в на входе реле вкл "навсегда",а при исчезновении +5 в на входе -начинался отсчет(задержка отключения по управляющему входу)
Подскажите пожалуйста как переделать скетч,сам не сделаю.Спасибо.
Уважаемый qvone.Руки дошли до проверки таймера,оказалось ,что он не в том режиме работает.Нужно чтоб при появлении +5в на входе реле вкл "навсегда",а при исчезновении +5 в на входе -начинался отсчет(задержка отключения по управляющему входу)
А просто обменять местами обработчики нажатия и отжатия??
если использовать вместо delay то может пройдет7 просто уже как не пробовал6 самое что интересно что когда свет отключаеться ардуино понимает что пин 43 упал и надо завести енератор а когда свет дали 99 она не понимает хотя простой if =((
У вас завести генератор идет целая временная процедура, а не просто вкл реле. Отключить генератор тоже идет процедура. А что делать если свет пропал и снова появился а генератор еще не заведен. Или обратно свет включили на несколько минут а генератору что делать?
Не получается,все равно при наличии +5в выход отключается через промежуток времени
Не получается,все равно при наличии +5в выход отключается через промежуток времени
Завтра подумаю.
Спасибо
Всем привет. Подскажите как реализовать:
При нажатии и удерживании кнопки более 2 секунд начинал работать генератор с частотой в 25 мс и отключалать при нажатии этой кнопки, а при нажатии второй кнопки и ее удерживании более 2 сек включалась защелка на другом выходе, но отключалась при кратковременном нажатии этой кнопки.
Реально голову себе сломал.