Помогите со скетчем плиз

Ampel
Offline
Зарегистрирован: 21.02.2021

Прошу вашей помощи помогите исправить скетч так чтобы после ввода времени таймер повторялся бесконечно с выполнением функций. И перезагрузки Ардуино с ново можно было вводить время. Очень прошу. Ардуино нано Дисплей TM1637

#include "TM1637.h" //используется для включчения сторонних библиотек в ваш скетч
#include <EEPROM.h> //Энергозависима внутренняя память Аруино
#include <TM1637.h> //используется для включчения сторонних библиотек в ваш скетч
#define CLK 2 //Присваевает пин
#define DIO 3 //Присваевает пин
#define Buz A1 //Присваевает пин
#define Butt 6 //Присваевает пин
#define addr_min 0 //Присваевает значение 
#define addr_sec 1 //Присваевает значение
#define Out A2  //Присваевает пин

TM1637 disp(CLK, DIO); // активмрует выходы дисплея

int8_t TimeDisp[] = {0x00,0x00,0x00,0x00}; //1 байт -128… 127 Целочисленный тип
byte minute = 0; //uint8_t  1 байт  0… 255  Целочисленный тип
byte second = 0; //uint8_t  1 байт  0… 255  Целочисленный тип
byte S_minute = 0; // minutes  
byte S_second = 0; // sec.
byte Step = 0;
byte start = false;
byte bl = false;
const int pin_A = 4;
const int pin_B = 5;    
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
unsigned char encoder_B_prev=0;

ISR (TIMER1_COMPA_vect) // эта функция вызывается прерыванием по таймеру и используется для учета времени для подсчета емкости 
{
    start = true;        // и разрешаем измерение силы тока (емкости) 1 раз в секунду
}

void setup() {
  // put your setup code here, to run once:
    minute = EEPROM.read(addr_min);
    second = EEPROM.read(addr_sec);
    if (minute > 99){
        minute = 0;
        EEPROM.write(addr_min, minute);
        
    }
    if (second > 59){
        second = 0;
        EEPROM.write(addr_sec, second);
    }
    byte S_minute = minute; // minutes
    byte S_second = second; // sec.
  
    pinMode(pin_A, INPUT_PULLUP);
    pinMode(pin_B, INPUT_PULLUP);
    pinMode(Buz, OUTPUT);
    digitalWrite(Buz, LOW);
    pinMode(Butt, INPUT_PULLUP);
    digitalWrite(Butt, HIGH);

    pinMode(Out, OUTPUT);
    digitalWrite(Out, LOW);
    
    disp.set(7);  // яркость, 0 - 7 (минимум - максимум)
    disp.init();  // инициализация
    disp.point(POINT_ON);
    
    cli(); // запрещаем перывания
    TCCR1A = 0;                       // устанавливаем настройки таймеря для учета времени
    TCCR1B = (1<<WGM12) | (1<<CS12);  // mode 4 и делитель 256
    TIMSK1 |=(1<<OCIE1A);             // прерывание по совпадению
    TCNT1 = 0;                        //
    OCR1A = 62499U;                   // 
    sei(); // разрешаем прерывания
}

void loop() {
    button();
    
    switch (Step) {
        case 1 ... 2:
            encoder();
            break;

        case 4:
            if (start)
            {
                start = false;
                if (second > 0) second--;
                else{
                    if( minute > 0){
                        minute--;
                        second = 59;
                    }
                    else{
                        Step++;
                        digitalWrite(Out, LOW);
                    }
                }
            }
            break;
            
        case 5:
            disp.point(POINT_OFF);
             for (int i=0; i<3; i++){
                digitalWrite(Buz, HIGH); 
                delay(600);
                digitalWrite(Buz, LOW);
                delay(400);
            }
            disp.point(POINT_ON);
            Step=0;
            minute = S_minute;
            second = S_second;
            break;
    }
    
    draw();
}

void button(){
    if (!digitalRead(Butt)){
        delay(300);
        Step++;
        if(Step > 4) Step = 0;
        if(Step < 3){
            disp.clearDisplay();
        }
        digitalWrite(Out, LOW);
        if(Step == 4){
            EEPROM.write(addr_min, S_minute);
            EEPROM.write(addr_sec, S_second);
            digitalWrite(Out, HIGH);
            delay(1000);
        }
    }
}

void draw(){
    TimeDisp[0] = minute / 10;
    TimeDisp[1] = minute % 10;
    TimeDisp[2] = second / 10;
    TimeDisp[3] = second % 10;
    switch (Step) {
        case 0:
            disp.display(TimeDisp);
            break;

        case 1:
            disp.display(2, TimeDisp[2]);
            disp.display(3, TimeDisp[3]);
            break;

        case 2:
            disp.display(0, TimeDisp[0]);
            disp.display(1, TimeDisp[1]);
            break;

        case 3 ... 4:
            disp.display(TimeDisp);
            break;
    }
}

void encoder(){
    encoder_A = digitalRead(pin_A);     // считываем состояние выхода А энкодера 
    encoder_B = digitalRead(pin_B);     // считываем состояние выхода B энкодера    
    if((!encoder_A) && (encoder_A_prev)){    // если состояние изменилось с положительного к нулю
        if(encoder_B) {
            if (Step == 1){
                if(second < 59) second++;               
                else second=0;
            }
            else if (Step == 2){
                if(minute < 99) minute++;               
                else minute=0;
            }
        }   
        else {
            if (Step == 1){
                if(second > 0) second--;               
                else second=59;
            }
            else if (Step == 2){
                if(minute > 0) minute--;               
                else minute=99;
            }
        }  
        S_minute = minute;
        S_second = second;
    } 
    encoder_A_prev = encoder_A;     // сохраняем значение А для следующего цикла
}

 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019
Ampel
Offline
Зарегистрирован: 21.02.2021

Спасибо разобрался извините за беспокойство

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Ampel пишет:

Спасибо разобрался извините за беспокойство

С первой ссылкой не до конца разобрался.