Помогите с таймером люди добрые

Тема в разделе "Флудилка", создана пользователем Skvidward, 21 дек 2015.

  1. Skvidward

    Skvidward Нуб

    Доброго дня суток , у меня есть переборщик цифр на восьмисегментном индикаторе и пищалка на определенной цифре .Не получается сделать так что- бы перебор цифр останавливался при нажатии кнопки и запускался с той цифры на которой был остановлен .
    Код (C++):
    //указываем переменные
    const int FIRST_SEGMENT_PIN =  2;
    const int SEGMENT_COUNT =   7;
    const int BUZZER = 13;
    const int inPin = 10;
    //const int bt = 0;
    //const int val = 0;
    //volatile int x = 0;


    byte numberSegments[10] = {
      0b00111111, 0b00001010, 0b01011101, 0b01011110, 0b01101010,
      0b01110110, 0b01110111, 0b00011010, 0b01111111, 0b01111110,
    };
     
    void setup(){
      for (int i = 0; i < SEGMENT_COUNT; ++i){
           pinMode(i + FIRST_SEGMENT_PIN, OUTPUT);
           }
    pinMode(BUZZER, OUTPUT);
    pinMode(inPin, INPUT);
    //attachInterrupt(bt, lol, RISING);
    }  
    //void lol(){
    //x = millis()/1000+10;
    //}
    void loop()
    {
    byte number = (millis() / 1000) % 10;
    static byte old_number;
    if (number != old_number) {
         old_number = number;  byte mask = numberSegments[number];
         for (byte i = 0; i < SEGMENT_COUNT; ++i) {
             boolean enableSegment = bitRead(mask, i);
             digitalWrite((byte)i + FIRST_SEGMENT_PIN, enableSegment);
             }
            /*{
             val = digitalRead(inPin);
            digitalWrite(BUZZER, val);
            }*/

             if (number==5) {tone(9,400,100) ; }  
              if (number==9) {{
    tone(9,1218,150);
    delay(150);
    tone(9,1218,300);
    delay(300);
    tone(9,1218,150);
    delay(300);
    tone(9,1046,150);
    delay(150);
    tone(9,1318,300);
    delay(300);
    tone(9,1568,600);
    delay(600);
    tone(9,784,600);
    delay(600); }}}}
     
  2. DrProg

    DrProg Вечный нерд

    Что конкретно за восьмисегментный индикатор? Я так понимаю, с собственным драйвером? Покажите его.

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

    Общая идея такая:
    Код (C++):
    unsigned long timCount;
    unsigned long timset;

    void setup() {
    timset = millis()+100;
    }

    void loop() {
      if (!digitalRead(inPin) and (millis() + 100) >= timset) { // это вместо: byte number =(millis()/1000)%10;
        timset = millis + 100;
        timCount++;
      }
      number = timCount / 10 % 10;
    }
    Не совсем понятно зачем старый номер сверяется с новым, чтобы не обновлять цифры в случае если они не изменились?
     
    Последнее редактирование: 22 дек 2015
    ИгорьК нравится это.
  3. Skvidward

    Skvidward Нуб

    http://amperka.ru/product/7-segment-led .Вот индикатор ,проблема в том что он без драйвера . Будет ли индикатор без драйвера корректно работать без этой строки
    Код (C++):
    byte numberSegments[10] = {
      0b00111111, 0b00001010, 0b01011101, 0b01011110, 0b01101010,
      0b01110110, 0b01110111, 0b00011010, 0b01111111, 0b01111110,
    };
    ? За подсказку большое спасибо ,буду отталкиваться от этого.
     
  4. Skvidward

    Skvidward Нуб

    Да, все верно , цифры сверяются чтобы не обновлять .