Помощь с простым кодом

Karpen
Offline
Зарегистрирован: 02.02.2020

Помогите пожалуйста решить такую задачку. Хочу сделать так, что бы при нажатии и отпускании кнопки, мигал свтодиод, а при следующем нажатии и отпускании, переставал мигать.

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);
}

 

nik182
Offline
Зарегистрирован: 04.05.2015

Добавьте ещё один if с but_flag и вызывайте мигалку из под него, а не как сейчас. 

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

#6

vvadim
Offline
Зарегистрирован: 23.05.2012

Karpen пишет:

Помогите пожалуйста решить такую задачку. Хочу сделать так, что бы при нажатии и отпускании кнопки, мигал свтодиод, а при следующем нажатии и отпускании, переставал мигать.

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Купите мигающий светодиод и задача сразу упростится до простого включения и выключения.

VanyaKMV
Offline
Зарегистрирован: 06.02.2020

Добрый день! помогите пожалуйста отладить скетч.

Я взял уже готовый и добавил в него пару строк (вот этих)

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();
}

 

Пожалуйста помогите разобраться. 

bwn
Offline
Зарегистрирован: 25.08.2014

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

VanyaKMV
Offline
Зарегистрирован: 06.02.2020

Re:

5. Здесь помогают тем, кто пытается что-то сделать сам, имеет самописный скетч и задает вопросы по нему. Самописный скетч от скопипащенного отличается тем, что вы можете объяснить, что и где в нем происходит.

Я могу попытаться.

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

VanyaKMV пишет:

Re:

5. Здесь помогают тем, кто пытается что-то сделать сам, имеет самописный скетч и задает вопросы по нему. Самописный скетч от скопипащенного отличается тем, что вы можете объяснить, что и где в нем происходит.

Я могу попытаться.

попытайтесь для начала ВНИМАТЕЛЬНО прочмтать правмла, в чкстности - как надо вставлять код в собщение

bwn
Offline
Зарегистрирован: 25.08.2014

b707 пишет:

 как надо вставлять код в собщение

Я вот тоже это имел ввиду, видать не дочитал, это уже третий абзац.((((

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

VanyaKMV пишет:

В итоге в скетче появилась ошибка.

Развёл кофейную гущу, но она какая-то мутная, так и не понял, что за ошибка появилась. Может скопипастите сообщение обо ошибке? Или ну её нафиг?

VanyaKMV
Offline
Зарегистрирован: 06.02.2020
exit status 1
'butt_back_pin' was not declared in this scope

Вот так ругается

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Переменная с имененем butt_back_pin нигде не объявлена в скетче. Компилятор не знает, что это такое и поэтому ругается.

VanyaKMV
Offline
Зарегистрирован: 06.02.2020

Хорошо, вы подтвердили мои догадки. Где ее нужно объявить (прописать) в данном скетче, подсказать не можете?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Перед функцией void setup(), там, где уже объявлены другие переменные с номерами пинов.

VanyaKMV
Offline
Зарегистрирован: 06.02.2020

Спасибо большое! Открыли мне глаза.

//-----------дисплей-----------
#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();
}

 

VanyaKMV
Offline
Зарегистрирован: 06.02.2020

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

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

Ну значит нужно это дописать.
Но с учётом фразы: "где объявить переменную ?"
Придется это сделать за вас.
А это делают в разделе "Ищу исполнителя"

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

VanyaKMV пишет:
При компиляции данного скетча проимходит обратный отсчет как у таймера бомбы, хотелось бы другого результата чтобы отсчет был по показаниям с датчика холла

это потому, что вы так функцию подсчёта импульсов написали, считать можно по разному, к примеру задействовав прерывание

renoshnik
Offline
Зарегистрирован: 11.04.2013

VanyaKMV пишет:
При компиляции данного скетча проимходит обратный отсчет как у таймера бомбы, хотелось бы другого результата чтобы отсчет был по показаниям с датчика холла

Можете объяснить вот это ?

byte butt_gnd = 9; //земля кнопки
byte butt_pin = 10; //состояние кнопки
035   pinMode(butt_gnd, OUTPUT); //пин как выход
 
037   pinMode(butt_pin, INPUT_PULLUP); //пин кнопки подтягиваем

 

VanyaKMV
Offline
Зарегистрирован: 06.02.2020

Ну типо кнопка нажата, и колесо должно отматывать назад показания

renoshnik
Offline
Зарегистрирован: 11.04.2013

VanyaKMV пишет:
Ну типо кнопка нажата, и колесо должно отматывать назад показания

конкретно вот это 

byte butt_gnd = 9; //земля кнопки
VanyaKMV
Offline
Зарегистрирован: 06.02.2020

Не знаю как объяснить но к этому пину подключена "нормально разомкнутая кнопка"!

Green
Offline
Зарегистрирован: 01.10.2015

Кнопка цепляется на 9 и 10. Сам часто так делаю - просто удобно.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ну так подсчет в прерывании делать по условию нажатой кнопки, только то всего

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

VanyaKMV пишет:
Не знаю как объяснить но к этому пину подключена "нормально разомкнутая кнопка"!

Нормально разомкнутая на что? На +5В или на массу? Если на массу, то подтянута ли к +5В? Там Вам не тут! Схему давайте!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

VanyaKMV пишет:
Ну типо кнопка нажата, и колесо должно отматывать назад показания

помочь одолеть?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ua6em пишет:

VanyaKMV пишет:
Ну типо кнопка нажата, и колесо должно отматывать назад показания

помочь одолеть?

Воо...от, девушка, если Вы обнажите 1/3, то Вам нарисуют 2/3 программы. Вот такая вот гендерная несправедливость.

Мало того - сам готов....

VanyaKMV
Offline
Зарегистрирован: 06.02.2020

Ну если не сложно. Буду признателен

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

VanyaKMV пишет:
Ну если не сложно. Буду признателен

Ваня, а твои сиськи какого размера? И почему?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

mykaida пишет:

ua6em пишет:

VanyaKMV пишет:
Ну типо кнопка нажата, и колесо должно отматывать назад показания

помочь одолеть?

Воо...от, девушка, если Вы обнажите 1/3, то Вам нарисуют 2/3 программы. Вот такая вот гендерная несправедливость.

Мало того - сам готов....

надо помочь земеле с Кавминвод )))
PS какая такая гендерная несправедливость

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ua6em пишет:

надо помочь земеле с Кавминвод )))

Ну типо кнопка нажата, и колесо должно отматывать назад показания:

Поможем:

if(knopka)koleso--;

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

И вот пока вы свои алгоритмы будете вот так формулировать, вы будете получать такие ответы. И срать на скопирастенные программы.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

mykaida пишет:

ua6em пишет:

надо помочь земеле с Кавминвод )))

Ну типо кнопка нажата, и колесо должно отматывать назад показания:

Поможем:

if(knopka)koleso--;

она даже в сетапе не заинициализирована,