Помогите с кодом что то запутался.

Тема в разделе "Arduino & Shields", создана пользователем Knyaz243, 28 янв 2022.

  1. Рокки1945

    Рокки1945 Гуру

    Да можно протеусом - необходимо будет выбрать ту мегу которая на ардуине - настроить фьюзы и подсунуть хекс а лучше elf - чтобы переменные, их состояние отслеживать можно было.
     
  2. Knyaz243

    Knyaz243 Нуб

    Добрый день проверил, все работает! Свечение пропало! Супер. Да протеусом пробовал предыдущий код заливать что не пошло! Может этот пойдет?
     
  3. SergeiL

    SergeiL Оракул Модератор

    Ну и отлично!
    В том коде, что я выкладывал и время должно тикать корректно. Проверили?
     
  4. Knyaz243

    Knyaz243 Нуб

    Да проверил, корректно. Только кнопка старт стоп не работает! Ну думаю разберусь, большое спасибо!
     
  5. SergeiL

    SergeiL Оракул Модератор

    А что значит не работает, как она должна работать?
    Я так понял она только запускает и все. Сбросить на установленное время можно только "ресет".
    Разве нет?
     
  6. Knyaz243

    Knyaz243 Нуб

    Ну да она работает на старт, хотелось чтобы она останавливала время по необходимости.
     
  7. SergeiL

    SergeiL Оракул Модератор

    Так у вас время останавливалось только кнопкой "РЕСЕТ".
    Только она опрашивалась в цикле for, в котором время уменьшалось ;):
    Код (C++):
    bool Countdown(int n, int del) // возврат времени к установленному ранее значению кнопка " Reset"
    {
      for (int q=n; q>0; q--)
      {
        PrintNumber(q,del);
        if (digitalRead(button2)==LOW)
        {
          return false;
        }
      }
      PrintNumber(0,0);

      return true;
    }
     
    Если останавливать время по кнопке СТАРТ, то несколько меняется алгоритм и для кнопки РЕСЕТ.

    Пробуйте:
    Код (C++):
    int digit_pin[] = {9, 8, 7};    // PWM Display digit pins from left to right

    #define dataPin  10             // пин подключен к входу 74HC595 DS
    #define latchPin 11             // пин подключен к входу 74HC595 ST_CP
    #define clockPin 12             // пин подключен к входу 74HC595 SH_CP

    const uint8_t digitFonts[11] = {B00000001, B01001111, B00010010, B00000110, B01001100, B00100100, B00100000, B00001111, B00000000, B00000100, B01111111};

    #define DIGIT_ON    HIGH
    #define DIGIT_OFF   LOW

    const uint8_t button1 = 18;  // кнопка старт
    const uint8_t button2 = 19;  // кнопка воврата времени к установленному
    const uint8_t button3 = 16;  // кнопка - уменьшение таймера
    const uint8_t button4 = 17;  // кнопка + увеличение таймера

    #define STATE_STOP    0
    #define STATE_START   1

    uint8_t countdown_state = STATE_STOP;

    int countdown_value = 420;
    int countdown_time = countdown_value;

    uint8_t disp_buff[3]      = {digitFonts[0], digitFonts[0], digitFonts[0]};

    void setup()
    {
      for (int i = 0; i < 3; i++) {
        digitalWrite(digit_pin[i], DIGIT_OFF);
        pinMode(digit_pin[i], OUTPUT);
      }
      pinMode(button1, INPUT_PULLUP);
      pinMode(button2, INPUT_PULLUP);
      pinMode(button3, INPUT_PULLUP);
      pinMode(button4, INPUT_PULLUP);
      digitalWrite(latchPin, LOW );    // ставим HIGH на "защёлку", чтобы регистр не принимал сигнал
      pinMode(latchPin, OUTPUT);
      digitalWrite(latchPin, HIGH);
      pinMode(clockPin, OUTPUT);
      digitalWrite(latchPin, HIGH);
      pinMode(dataPin, OUTPUT);
    }

    void Time_End(void)    // вызывается при 000,0
    {
      ;   // !!!!!!!!! BooM !!!!!!!!!!!!!
    }

    void Time_Check(uint32_t cur_millis)
    {
      static uint32_t old_millis = 0;
      static uint8_t  old_state = STATE_STOP;
      static int      old_time = 0;

      uint8_t t_min;
      uint8_t t_sec_10;
      uint8_t t_sec_01;

      if ( (countdown_state == STATE_START) && ( old_state != countdown_state || cur_millis - old_millis >= 1000) ) // 1 sec
      {
        old_millis = cur_millis;
        old_state = STATE_START;

        if ( countdown_time)
          countdown_time--;
        else
        {
          countdown_state = STATE_STOP;
          Time_End();
          return;
        }
      }

      if (countdown_state == STATE_STOP)
        old_state = STATE_STOP;

      if (old_time != countdown_time)
      {
        old_time = countdown_time;
        t_min     = (uint8_t) (countdown_time / 60);
        t_sec_10  = (uint8_t) ((countdown_time % 60) / 10);
        t_sec_01  = (uint8_t) ((countdown_time % 60) % 10);

        if ( t_min != 0)
          disp_buff[2] = digitFonts[t_min];
        else
          disp_buff[2] = digitFonts[10];

        disp_buff[1] = digitFonts[t_sec_10];
        disp_buff[0] = digitFonts[t_sec_01];
      }
    }

    void Dysplay_Refresh(uint32_t cur_millis)
    {
      static uint32_t   old_millis = 0;
      static uint8_t    prev_pos = 2;
      static uint8_t    pos = 0;

      if ( cur_millis - old_millis >= 7 )  // обновляем разряд раз в 7мс ( 7*3=21мс )
      {
        old_millis = cur_millis;

        digitalWrite(digit_pin[prev_pos], DIGIT_OFF);

        digitalWrite(latchPin, LOW);  // цифра ноль
        shiftOut(dataPin, clockPin, LSBFIRST, disp_buff[pos]);
        digitalWrite(latchPin, HIGH);

        digitalWrite(digit_pin[pos], DIGIT_ON);

        prev_pos = pos;
        if (pos == 2)
          pos = 0;
        else
          pos++;
      }
    }

    void Key_Check(uint32_t cur_millis)
    {
      static uint32_t old_millis = 0;
      static uint8_t  old_bt_start = HIGH;
      static uint8_t  old_bt_rest = HIGH;
      static uint8_t  pressed3 = 0, pressed4 = 0;

      if ( cur_millis - old_millis >= 50 )  //  заходим сюда каждые 50ms
      {
        old_millis = cur_millis;

        if ( digitalRead(button1) == LOW )                               // кнопка start нажата
        {
          if ( countdown_state == STATE_STOP && old_bt_start == HIGH)    // кнопка start нажата, счет стоит
          {
            countdown_state = STATE_START;
          }
          else if ( countdown_state == STATE_START && old_bt_start == HIGH) // кнопка start нажата, счет идет
          {
            countdown_state = STATE_STOP;
          }
          old_bt_start = LOW;
        }
        else    // кнопка start отпущена
        {
          old_bt_start = HIGH;
        }

        if ( digitalRead(button2) == LOW ) // кнопка reset нажата
        {
          if ( old_bt_rest == HIGH)
          {
            countdown_state = STATE_STOP;
            countdown_time = countdown_value;
          }
          old_bt_rest = LOW;
        }
        else      // кнопка reset отпущена
        {
          old_bt_rest = HIGH;
        }

        if (countdown_state == STATE_STOP && digitalRead(button3) == LOW) // кнопка "-"
        {
          if (pressed3 == 0 || pressed3 >= 10) // скорость уменьшения тайменра
          {
            if (countdown_time > 0)
            {
              countdown_time--;
              countdown_value = countdown_time;
            }
          }
          if (pressed3 <= 10)  // если не дошли до 10+
            pressed3++;
        }
        else  // отпустили  кнопку "-"
        {
          pressed3 = 0;
        }

        if (countdown_state == STATE_STOP && digitalRead(button4) == LOW) // кнопка "+"
        {
          if (pressed4 == 0 || pressed4 >= 10)  //скорость увеличения таймера
          {
            if (countdown_time < 599)
            {
              countdown_time++;
              countdown_value = countdown_time;
            }
          }
          if (pressed4 <= 10)  // если не дошли до 10+
            pressed4++;
        }
        else    // отпустили  кнопку "+"
        {
          pressed4 = 0;
        }
      }
    }

    void loop()
    {
      uint32_t cur_millis = millis();

      Time_Check(cur_millis);
      Dysplay_Refresh(cur_millis);
      Key_Check(cur_millis);
    }
     
  8. Knyaz243

    Knyaz243 Нуб

    Все отлично. Как я вам благодарен!!!Спасибо огромное!!!
     
  9. Knyaz243

    Knyaz243 Нуб

    Такой еще вопрос где можно про структуры и функции почитать? Что бы разобраться более подробно.
     
  10. SergeiL

    SergeiL Оракул Модератор

    Да пожалуйста! ;)
    Не лезьте вы пока в структуры, это уж потом, если пойдет.
    Разберитесь пока с простыми переменными, передачей их в функции, и возвращением значений из функций.
    А почитать, если по языку Си, то можно Керниган и Ритчи .
    Я по моему по ней разбирался с Си.
     
    Knyaz243 нравится это.