Добрыи день, пытаюсь написать код на кнопку деиствие от которои начиналось бы через некоторое время (длительно нажатие) Вот кусочек кода... Не пому что не правильно записал... Не работает... Код (C++): else { if(digitalRead(knopka2)==LOW) // нажали кнопочку #2 { val++; // прибавляем к переменной 1 при каждой смене цикла. delay(200); //небольшая защита от "дребезга" контактов кнопки if(val>=5) { Serial.print("KNOPKA2"); Serial.print(val); } else { val=0; // обнулили переменную } } else { val=0; // обнулили переменную } }
попробуйте сами выполнить этот код вместо компьютера.. 1. Нажали кнопку. 2. Увеличили val на единичку, теперь val =1 3 задержка 200 4. Если val > 5 ... но у нас val =1. значит идем в ветку else - "обнуляем переменную" И так бесконечно.
с логикой-то как? Код (C++): if(val>=5) { Serial.print("KNOPKA2"); Serial.print(val); } else { val=0; // обнулили переменную перефразирую твой код: если val меньше 5, то val = 0. Берешь лист бумаги и рисуешь алгоритм работы программы. Пока не будешь визуально видеть свою программу, так и будешь делать такие вот логические ошибки. Хотя, с точки зрения МК, здесь ошибки никакой нет.
Вот верно? Код (C++): else { if(digitalRead(knopka2)==LOW) // нажали кнопочку #2 { val++; // прибавляем к переменной 1 при каждой смене цикла. delay(200); //небольшая защита от "дребезга" контактов кнопки if(val>=5) { Serial.print("KNOPKA2"); Serial.print(val); val=0; // обнулили переменную } else { //тогда ни чего не делаем } } else { val=0; // обнулили переменную если val не набрал "5" } }
Синтаксически вроде верно. Алгоритмически будет так - каждые 200 мс МК будет наглухо висеть, каждую секунду будет заходить в подпрограмму обработки нажатия кнопки.
Да Вы не слушайте parovoZZ-а ему так, поболтать. Не, не туда посмотрел, Поболтать он любит, но здесь я не туда посмотрел .
висеть, а значит -время задержки будет реализованно. Вроде так и хочу... А еще хочу реализовать, сколько раз (какои по счету раз) было достигнуто кол-во "5", т.е. сколько раз цикл достиг "5", после включения ардуины...И тогда уже в порт отправлять не только "KNOPKA2", а плюс значение кол-ва"длительных нажатии". Это мне надо еще како-то общи цикл делать? и Туда весь блок нажатия на вторую кнопку сувать?
скачай библиотеку OneButton. посмотри что там написано и как организована обработка нажатий. и можешь смело заново велосипед изобретать.
Хочу так - не правильно? Код (C++): else { if(digitalRead(knopka2)==LOW) // нажали кнопочку #2 { val++; // прибавляем к переменной 1 при каждой смене цикла. delay(200); //небольшая защита от "дребезга" контактов кнопки if(val>=5) { Serial.print("KNOPKA2"); Serial.print(val); val=0; // обнулили переменную } else { //тогда ни чего не делаем } } else { val=0; // обнулили переменную если val не набрал "5" } }
так нормально, только задержка 200 против дребезга - это очень много, я бы сделал 10-20-мс И еще - первый else, где "ничего не делаем" - можно убрать
Я наверное пропустил главное - это вставить паузу в конце цикла, а то смысл теряется,иначе цикл 5 раз сделает мгновенно, я правильно мыслю? Как раз таки в "первом else поставить delay(250)...
А я бы не стал. Хотя бы из-за читабельности кода. Мне по скобкам лень бегать, но второй елсе запросто у ТС может примкнуть к первому иф.
Вот код моего компаса блютуз, нажатие второи кнопки пока не настроил.. Код (C++): #include <SoftwareWire.h> #define addr 0x0D //I2C Address for The HMC5883 SoftwareWire myWire1(4, 5); //4 sda and 5 scl SoftwareWire myWire2(6, 7); //6 sda and 7 scl const int knopka1=8; // кнопка №1 const int knopka2=9; // кнопка №2 int val=0; unsigned long L=250; int xx1; int yy1; int zz1; int xx2; int yy2; int zz2; static int mx1; static int my1; static int mz1; static int mx2; static int my2; static int mz2; void setup() { pinMode(knopka1, INPUT_PULLUP); pinMode(knopka2, INPUT_PULLUP); Serial.begin(9600); myWire1.begin(); myWire2.begin(); myWire1.beginTransmission(addr); //start talking myWire1.write(0x0B); // Tell the HMC5883 to Continuously Measure myWire1.write(0x01); // Set the Register myWire1.endTransmission(); myWire1.beginTransmission(addr); //start talking myWire1.write(0x09); // Tell the HMC5883 to Continuously Measure myWire1.write(0x1D); // Set the Register myWire1.endTransmission(); myWire2.beginTransmission(addr); //start talking myWire2.write(0x0B); // Tell the HMC5883 to Continuously Measure myWire2.write(0x01); // Set the Register myWire2.endTransmission(); myWire2.beginTransmission(addr); //start talking myWire2.write(0x09); // Tell the HMC5883 to Continuously Measure myWire2.write(0x1D); // Set the Register myWire2.endTransmission(); } void loop() { if(digitalRead(knopka1)==LOW) //проверка включена ли кнопка №1 { //Начало первого блока кода для чтения 1 датчика int x1, y1, z1; //triple axis data //Tell the HMC what regist to begin writing data into myWire1.beginTransmission(addr); myWire1.write((uint8_t)0x00); //start with register 3. myWire1.endTransmission(); //Read the data.. 2 bytes for each axis.. 6 total bytes myWire1.requestFrom(addr, 6); if (6 <= myWire1.available()) { x1 = myWire1.read(); //MSB x x1 |= myWire1.read() << 8; //LSB x z1 = myWire1.read(); //MSB z z1 |= myWire1.read() << 8; //LSB z y1 = myWire1.read(); //MSB y y1 |= myWire1.read() << 8; //LSB y } xx1=(mx1-x1)/L; mx1=x1; yy1=(my1-y1)/L; my1=y1; zz1=(mz1-z1)/L; mz1=z1; //Начало второго блока кода для чтения 2 датчика int x2, y2, z2; //triple axis data //Tell the HMC what regist to begin writing data into myWire2.beginTransmission(addr); myWire2.write((uint8_t)0x00); //start with register 3. myWire2.endTransmission(); //Read the data.. 2 bytes for each axis.. 6 total bytes myWire2.requestFrom(addr, 6); if (6 <= myWire2.available()) { x2 = myWire2.read(); //MSB x x2 |= myWire2.read() << 8; //LSB x z2 = myWire2.read(); //MSB z z2 |= myWire2.read() << 8; //LSB z y2 = myWire2.read(); //MSB y y2 |= myWire2.read() << 8; //LSB y } xx2=(mx2-x2)/L; mx2=x2; yy2=(my2-y2)/L; my2=y2; zz2=(mz2-z2)/L; mz2=z2; // Печать в порт Serial.print("E"); Serial.print(x1); Serial.print(","); Serial.print(y1); Serial.print(","); Serial.print(z1); Serial.print(","); Serial.print(xx1); Serial.print(","); Serial.print(yy1); Serial.print(","); Serial.print(zz1); //Serial.print(","); //Serial.print(x2); //Serial.print(","); //Serial.print(y2); //Serial.print(","); //Serial.print(z2); //Serial.print(","); //Serial.print(xx2); //Serial.print(","); //Serial.print(yy2); //Serial.print(","); //Serial.print(zz2); Serial.print("\n"); delay(L); } else { if(digitalRead(knopka2)==LOW) // нажали кнопочку #2 { val++; // прибавляем к переменной 1 при каждой смене цикла. delay(200); //небольшая защита от "дребезга" контактов кнопки if(val>=5) { Serial.print("REPER"); //Serial.print(val); val=0; // обнулили переменную delay(1000);//пауза } else { // ничего не делаем... } } else { val=0; // обнулили переменную } } }