• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Pomoc w dopisaniu sterowania przyciskami ustawienia godzin minut i sekund w zegarze
#3
(05-08-2022, 16:25)kaczakat napisał(a): Zacznij od zastąpienia delay millis, nie musisz sprawdzać czasu z zegara co 1s, można z niego wziąć przerwanie zewnętrzne, albo mierzyć czas millis, synchronizować czas co np. 1h, chyba, że sam zegar to wszystko co ma robić ten układ.
Tu masz przykład jak przy pomocy klawiatury analogowej ustawić godzinę, w kilka sekund ustawiasz dowolną z dokładnością minuty (zmienna 24x60 1440), zegar w układzie 24h.
Podobnie można zrobić ustawienie daty, zmienna na 40 lat zmieści się w int16.
Kod:
#include <AnalogKeypad.h>

// the following table is for this Banggood Analog Keypad
// https://www.banggood.com/AD-Analog-Keyboard-Module-Electronic-Building-Blocks-5-Keys-For-Arduino-DIY-p-1374279.html
// see the AnalogKeypad_CreateConfig.ino sketch example on how to create this table by Makuna
const int KeypadMap[] = {0, 50, 100, 200, 400};

const uint16_t KeypadHoldTimeMs = 1000;
const uint8_t KeypadAnalogPin = A0;

int16_t czasDobowy, czasWduszenia; //int by dalo sie krecic licznikiem przez 0
uint8_t lastbutton;
bool wduszony,update1;
//dla funkcji czas()

uint32_t czasTeraz,czasPoprzedni,tik=10; //tik musi byc mniejszy niz 1000 i dzilic 1000ms na rowne czesci
uint8_t nTik,sekundy,minuty,godziny,dni; //liczniki tikow, sekund, itd.
bool fnTik,fsekundy,fminuty,fgodziny,fdni; //flagi zdarzen nowy tik, nowa sekunda,minuta, godzina, dzien

char napis16[17];

AnalogKeypad keypad(KeypadAnalogPin, KeypadMap, countof(KeypadMap), KeypadHoldTimeMs);

// the button event callback
// this will be called when buttons are pressed and released
void ButtonHandler(const ButtonParam& param)
{

//  Serial.print(param.button);
//  Serial.print(" ");
// 
lastbutton=param.button+1;
  switch (param.state)
  {
    case ButtonState_Up:
//    Serial.print("Up");
wduszony=0;
    break;
   
    case ButtonState_Down:
//    Serial.print("Down");
    break;
   
    case ButtonState_Click:
//    Serial.print("Click");
if(lastbutton==2) czasDobowy++;
else if (lastbutton==3) czasDobowy--;
update1=1;

    break;
   
    case ButtonState_DoubleClick:
//    Serial.print("Double Click");
    break;
   
    case ButtonState_Hold:
//    Serial.print("Hold");
wduszony=1;
    break;
  }
 
//  Serial.println();
}

void setup() {
 
    Serial.begin(115200);
//    while (!Serial); // wait for serial attach

//    Serial.println();
    Serial.println("Initialized");
}

void loop() {
  czas();
if(fnTik) //zamiast dely 10 to mozna sprawdzac stan przyciskow co 10ms
{
  keypad.loop(ButtonHandler); //
  keypadAction();
}

  if(fsekundy or update1)
  {
   update1=0;
//tylko minuty  
   sprintf(napis16,"%02d:%02d",czasDobowy/60,czasDobowy%60); // jak zaminiec liczbe 0-1440 na godziny i minuty
   Serial.println(napis16);
//sekundy w 10
//   sprintf(napis16,"%02d:%02d:%02d",czasDobowy/(60*6),(czasDobowy%(60*6))/6,10*(czasDobowy%(6)) ); // jak zaminiec liczbe   na godziny  minuty sekundy w piatkach
//   Serial.println(napis16);
  }
  // simulate other work happening
  // it also should avoid long delays so loop above can be called
  // at least every 10-20ms
//  delay(10);
}


//wersja dla minut
void keypadAction()
{
//funkcja jest wywolywana co 10ms, ale chcę coś zrobic  co 100ms
if(nTik%10==0) {
if (wduszony)
{     update1=1;
      czasWduszenia++;
 

       switch (lastbutton)
        {
        case 2:
          if(czasWduszenia<30)czasDobowy++;
          else if (czasWduszenia<120)czasDobowy+=10;
          else  czasDobowy+=60;
        break;

        case 3:
          if(czasWduszenia<50)czasDobowy--;
          else if (czasWduszenia<130)czasDobowy-=10;
          else  czasDobowy-=60;
        break;
        }
} else czasWduszenia=0;    
              }


if (czasDobowy>1440-1) czasDobowy=0;
if (czasDobowy<0) czasDobowy=1440-1; 

//if (czasDobowy>(1440*6)-1) czasDobowy=0;
//if (czasDobowy<0) czasDobowy=((1440*6)-1); 
}



void czas()
{
  czasTeraz=millis();
fnTik=fsekundy=fminuty=fgodziny=fdni=0;
if((uint32_t)(czasTeraz-czasPoprzedni)>=tik) //tan napisany warunek jest odporny na "klątwe 50 dni millis()"
{
  czasPoprzedni=czasTeraz;
  fnTik=1;
  nTik++;
  if(nTik>=(1000/tik))
  {
    nTik=0;
    sekundy++;
    fsekundy=1;
     if (sekundy>=60)
    {
      sekundy=0;
      minuty++;
      fminuty=1;
      if (minuty>=60)
      {
        minuty=0;
        godziny++;
        fgodziny=1;
        if (godziny>=24)
        {
          godziny=0;
          fdni=1;
          dni++;
   
        }
      }
    }
  }
}
}
 
Odpowiedź
  


Wiadomości w tym wątku
RE: Pomoc w dopisaniu sterowania przyciskami ustawienia godzin minut i sekund w zegarze - przez ALIBABA-125 - 08-08-2022, 16:17

Skocz do:


Przeglądający: 1 gości