Помощь с простым кодом
- Войдите на сайт для отправки комментариев
Пнд, 03/02/2020 - 23:11
Помогите пожалуйста решить такую задачку. Хочу сделать так, что бы при нажатии и отпускании кнопки, мигал свтодиод, а при следующем нажатии и отпускании, переставал мигать.
boolean but_flag = 0;
boolean butt = 0;
void setup() {
pinMode (3,INPUT_PULLUP);
pinMode (13,OUTPUT);
}
void loop() {
butt = !digitalRead(3);
if (butt == 1 && but_flag == 0) {
but_flag = 1;
migalka();
}
if (butt == 0 && but_flag == 1) {
but_flag = 0;
}
}
void migalka(){
if (round(millis()/1000)%2==0)
digitalWrite(13, HIGH);
else
digitalWrite(13, LOW);
}
Добавьте ещё один if с but_flag и вызывайте мигалку из под него, а не как сейчас.
#6
Помогите пожалуйста решить такую задачку. Хочу сделать так, что бы при нажатии и отпускании кнопки, мигал свтодиод, а при следующем нажатии и отпускании, переставал мигать.
а чтобы корректно работало нужно не забыть разобраться с дребезгом контактов кнопки.
Купите мигающий светодиод и задача сразу упростится до простого включения и выключения.
Добрый день! помогите пожалуйста отладить скетч.
Я взял уже готовый и добавил в него пару строк (вот этих)
if (digitalRead(butt_back_pin) == 1) { DIST = DIST + w_length; //прибавляем длину колеса к дистанции flag = 1; //вывести на дисплей } else { DIST = DIST - w_length; //вычитаем длину колеса от дистанции flag = 1; //вывести на дисплей//-----------дисплей----------- #include <TimerOne.h> #include <TM74HC595Display.h> byte SCLK = 7; byte RCLK = 6; byte DIO = 5; TM74HC595Display disp(SCLK, RCLK, DIO); unsigned char LED_0F[29]; //--------дисплей------- byte disp_gnd = 4; //земля дисплея byte disp_vcc = 8; //питание дисплея byte butt_gnd = 9; //земля кнопки byte butt_pin = 10; //состояние кнопки byte sens_vcc = 2; //питание датчика byte sens_pin = 3; //выход датчика (принимает значение от 1 до 0) unsigned long lastturn; //переменные хранения времени float DIST = 0.0; //переменная хранения расстояния в виде десятичной дроби float w_length = 0.45; //длина окружности колеса в метрах byte n = 8; //число отверстий / магнитов volatile boolean flag; //флаг вывода на дисплей void setup() { attachInterrupt(1, gap, RISING); //подключить прерывание на 3 пин при повышении сигнала pinMode(disp_vcc, OUTPUT); //пин как выход pinMode(disp_gnd, OUTPUT); //пин как выход pinMode(butt_gnd, OUTPUT); //пин как выход pinMode(sens_vcc, OUTPUT); //пин как выход pinMode(butt_pin, INPUT_PULLUP); //пин кнопки подтягиваем //подаём напряжение на пины digitalWrite(disp_vcc, 1); digitalWrite(disp_gnd, 0); digitalWrite(butt_gnd, 0); digitalWrite(sens_vcc, 1); //для дисплея цифры---------- LED_0F[0] = 0xC0; //0 LED_0F[1] = 0xF9; //1 LED_0F[2] = 0xA4; //2 LED_0F[3] = 0xB0; //3 LED_0F[4] = 0x99; //4 LED_0F[5] = 0x92; //5 LED_0F[6] = 0x82; //6 LED_0F[7] = 0xF8; //7 LED_0F[8] = 0x80; //8 LED_0F[9] = 0x90; //9 LED_0F[10] = 0b01000000; //.0 LED_0F[11] = 0b01111001; //.1 LED_0F[12] = 0b00100100; //.2 LED_0F[13] = 0b00110000; //.3 LED_0F[14] = 0b00011001; //.4 LED_0F[15] = 0b00010010; //.5 LED_0F[16] = 0b00000010; //.6 LED_0F[17] = 0b01111000; //.7 LED_0F[18] = 0b00000000; //.8 LED_0F[19] = 0b00010000; //.9 Timer1.initialize(1500); // set a timer of length 1500 Timer1.attachInterrupt(timerIsr); // attach the service routine here disp.digit4(0); //-------------- w_length = (float)w_length / n; //длина дуги колеса с учетом числа отверстий } void gap() { if (millis() - lastturn > 80) { //защита от случайных измерений lastturn = millis(); //запомнить время последнего оборота DIST = DIST + w_length; //прибавляем длину колеса к дистанции при каждом обороте оного DIST = DIST - w_length; //вычитаем длину колеса от дистанции flag = 1; //вывести на дисплей } } void loop() { if (flag == 1) { disp.clear(); //очистить дисплей int cel_di = floor(DIST); //целые int sot_di = (((float)cel_di / 1000) - floor((float)cel_di / 1000)) * 10; //сотни int des_di = (((float)cel_di / 100) - floor((float)cel_di / 100)) * 10; //десятки int ed_di = round(((float)((float)cel_di / 10) - floor((float)cel_di / 10)) * 10); //единицы (с точкой) int dr_di = (float)(DIST - floor(DIST)) * 10; //десятые части if (sot_di != 0) { disp.set(LED_0F[sot_di], 3); //вывод сотен расстояния } if (des_di != 0 || sot_di != 0) { disp.set(LED_0F[des_di], 2); //вывод десятков расстояния } disp.set(LED_0F[ed_di + 10], 1); //вывод единиц расстояния, с точкой disp.set(LED_0F[dr_di], 0); //вывод после точки flag = 0; //опустить флаг } if (digitalRead(butt_pin) == 1) { //если кнопка нажата DIST = 0; //обнулить расстояние flag = 1; //вывести на дисплей } if (digitalRead(butt_back_pin) == 1) { DIST = DIST + w_length; //прибавляем длину колеса к дистанции flag = 1; //вывести на дисплей } else { DIST = DIST - w_length; //вычитаем длину колеса от дистанции flag = 1; //вывести на дисплей } delay(5); } void timerIsr() //нужно для дисплея { disp.timerIsr(); }Пожалуйста помогите разобраться.
Ваня, когда приходите в новое место, обычно принято узнавать, каковы здесь правила. Прочитайте два первых поста (можно начало) в приколоченной теме и исправьтесь.
Re:
5. Здесь помогают тем, кто пытается что-то сделать сам, имеет самописный скетч и задает вопросы по нему. Самописный скетч от скопипащенного отличается тем, что вы можете объяснить, что и где в нем происходит.
Я могу попытаться.
Re:
5. Здесь помогают тем, кто пытается что-то сделать сам, имеет самописный скетч и задает вопросы по нему. Самописный скетч от скопипащенного отличается тем, что вы можете объяснить, что и где в нем происходит.
Я могу попытаться.
попытайтесь для начала ВНИМАТЕЛЬНО прочмтать правмла, в чкстности - как надо вставлять код в собщение
как надо вставлять код в собщение
Я вот тоже это имел ввиду, видать не дочитал, это уже третий абзац.((((
Развёл кофейную гущу, но она какая-то мутная, так и не понял, что за ошибка появилась. Может скопипастите сообщение обо ошибке? Или ну её нафиг?
Вот так ругается
Переменная с имененем butt_back_pin нигде не объявлена в скетче. Компилятор не знает, что это такое и поэтому ругается.
Хорошо, вы подтвердили мои догадки. Где ее нужно объявить (прописать) в данном скетче, подсказать не можете?
Перед функцией void setup(), там, где уже объявлены другие переменные с номерами пинов.
Спасибо большое! Открыли мне глаза.
//-----------дисплей----------- #include <TimerOne.h> #include <TM74HC595Display.h> byte SCLK = 7; byte RCLK = 6; byte DIO = 5; TM74HC595Display disp(SCLK, RCLK, DIO); unsigned char LED_0F[29]; //--------дисплей------- byte disp_gnd = 4; //земля дисплея byte disp_vcc = 8; //питание дисплея byte butt_gnd = 9; //земля кнопки byte butt_pin = 10; //состояние кнопки byte butt_back_gnd = 11; //земля кнопки для отмотки значений назад byte butt_back_pin = 12; //состояние кнопки для отмотки значений назад byte sens_vcc = 2; //питание датчика byte sens_pin = 3; //выход датчика (принимает значение от 1 до 0) unsigned long lastturn; //переменные хранения времени float DIST = 0.0; //переменная хранения расстояния в виде десятичной дроби float w_length = 0.45; //длина окружности колеса в метрах byte n = 8; //число отверстий / магнитов volatile boolean flag; //флаг вывода на дисплей void setup() { attachInterrupt(1, gap, RISING); //подключить прерывание на 3 пин при повышении сигнала pinMode(disp_vcc, OUTPUT); //пин как выход pinMode(disp_gnd, OUTPUT); //пин как выход pinMode(butt_gnd, OUTPUT); //пин как выход pinMode(sens_vcc, OUTPUT); //пин как выход pinMode(butt_pin, INPUT_PULLUP); //пин кнопки подтягиваем //подаём напряжение на пины digitalWrite(disp_vcc, 1); digitalWrite(disp_gnd, 0); digitalWrite(butt_gnd, 0); digitalWrite(sens_vcc, 1); //для дисплея цифры---------- LED_0F[0] = 0xC0; //0 LED_0F[1] = 0xF9; //1 LED_0F[2] = 0xA4; //2 LED_0F[3] = 0xB0; //3 LED_0F[4] = 0x99; //4 LED_0F[5] = 0x92; //5 LED_0F[6] = 0x82; //6 LED_0F[7] = 0xF8; //7 LED_0F[8] = 0x80; //8 LED_0F[9] = 0x90; //9 LED_0F[10] = 0b01000000; //.0 LED_0F[11] = 0b01111001; //.1 LED_0F[12] = 0b00100100; //.2 LED_0F[13] = 0b00110000; //.3 LED_0F[14] = 0b00011001; //.4 LED_0F[15] = 0b00010010; //.5 LED_0F[16] = 0b00000010; //.6 LED_0F[17] = 0b01111000; //.7 LED_0F[18] = 0b00000000; //.8 LED_0F[19] = 0b00010000; //.9 Timer1.initialize(1500); // set a timer of length 1500 Timer1.attachInterrupt(timerIsr); // attach the service routine here disp.digit4(0); //-------------- w_length = (float)w_length / n; //длина дуги колеса с учетом числа отверстий } void gap() { if (millis() - lastturn > 80) { //защита от случайных измерений lastturn = millis(); //запомнить время последнего оборота DIST = DIST + w_length; //прибавляем длину колеса к дистанции при каждом обороте оного DIST = DIST - w_length; //вычитаем длину колеса от дистанции flag = 1; //вывести на дисплей } } void loop() { if (flag == 1) { disp.clear(); //очистить дисплей int cel_di = floor(DIST); //целые int sot_di = (((float)cel_di / 1000) - floor((float)cel_di / 1000)) * 10; //сотни int des_di = (((float)cel_di / 100) - floor((float)cel_di / 100)) * 10; //десятки int ed_di = round(((float)((float)cel_di / 10) - floor((float)cel_di / 10)) * 10); //единицы (с точкой) int dr_di = (float)(DIST - floor(DIST)) * 10; //десятые части if (sot_di != 0) { disp.set(LED_0F[sot_di], 3); //вывод сотен расстояния } if (des_di != 0 || sot_di != 0) { disp.set(LED_0F[des_di], 2); //вывод десятков расстояния } disp.set(LED_0F[ed_di + 10], 1); //вывод единиц расстояния, с точкой disp.set(LED_0F[dr_di], 0); //вывод после точки flag = 0; //опустить флаг } if (digitalRead(butt_pin) == 1) { //если кнопка нажата DIST = 0; //обнулить расстояние flag = 1; //вывести на дисплей } if (digitalRead(butt_back_pin) == 1) { DIST = DIST + w_length; //прибавляем длину колеса к дистанции flag = 1; //вывести на дисплей } else { DIST = DIST - w_length; //вычитаем длину колеса от дистанции flag = 1; //вывести на дисплей } delay(5); } void timerIsr() //нужно для дисплея { disp.timerIsr(); }При компиляции данного скетча проимходит обратный отсчет как у таймера бомбы, хотелось бы другого результата чтобы отсчет был по показаниям с датчика холла
Ну значит нужно это дописать.
Но с учётом фразы: "где объявить переменную ?"
Придется это сделать за вас.
А это делают в разделе "Ищу исполнителя"
это потому, что вы так функцию подсчёта импульсов написали, считать можно по разному, к примеру задействовав прерывание
Можете объяснить вот это ?
035pinMode(butt_gnd, OUTPUT);//пин как выход037pinMode(butt_pin, INPUT_PULLUP);//пин кнопки подтягиваемНу типо кнопка нажата, и колесо должно отматывать назад показания
конкретно вот это
Не знаю как объяснить но к этому пину подключена "нормально разомкнутая кнопка"!
Кнопка цепляется на 9 и 10. Сам часто так делаю - просто удобно.
Ну так подсчет в прерывании делать по условию нажатой кнопки, только то всего
Нормально разомкнутая на что? На +5В или на массу? Если на массу, то подтянута ли к +5В? Там Вам не тут! Схему давайте!
помочь одолеть?
помочь одолеть?
Воо...от, девушка, если Вы обнажите 1/3, то Вам нарисуют 2/3 программы. Вот такая вот гендерная несправедливость.
Мало того - сам готов....
Ну если не сложно. Буду признателен
Ваня, а твои сиськи какого размера? И почему?
помочь одолеть?
Воо...от, девушка, если Вы обнажите 1/3, то Вам нарисуют 2/3 программы. Вот такая вот гендерная несправедливость.
Мало того - сам готов....
надо помочь земеле с Кавминвод )))
PS какая такая гендерная несправедливость
надо помочь земеле с Кавминвод )))
Ну типо кнопка нажата, и колесо должно отматывать назад показания:
Поможем:
if(knopka)koleso--;
И вот пока вы свои алгоритмы будете вот так формулировать, вы будете получать такие ответы. И срать на скопирастенные программы.
надо помочь земеле с Кавминвод )))
Ну типо кнопка нажата, и колесо должно отматывать назад показания:
Поможем:
if(knopka)koleso--;
она даже в сетапе не заинициализирована,