Pomogite pojaluysta, s kodom dlya Arduino binary alarm clock

arduinoware
Offline
Зарегистрирован: 31.12.2017

Izvinyayusm russkix shriftov net na kompe. Ya poprobovala iskat pomos na angliyskoy versii foruma, no sudya po vsemu tam vse mordy.

moj muz sdelal mne Arduino binary Clock s budilnikom. no programirovat ne umeyem. v internete nashla vot etot kod, po adresu:  https://github.com/proshik/binary_clock/blob/master/binary_clock/binary_clock.ino

A vot library, kotoroy ya vospolzovalas: http://www.rinkydinkelectronics.com/library.php?id=73

no delo v tom sto, tot originalniy kod (kotoriy ya ukazala vise) po vsey vidimosti shitaet vremya po millis. a u menya ustanovleno DS3231 real time clock. vot ya i pitayus po menyat etot kod stoby on smog vzyat vremya ot ds3231.

Delo v tom sto, amerikozy uvideli moj kod na forume, vse jaluyutsya. odni govoryat sto, kod ne pravilniy, drugie govoryat sto mojno bilo by delat po proshe. sovsem zaputalas.

v originalnoy versii koda, avtor sdelal tak shtoby pishalka gudkala kodga chasy peremeshayutsya v rejim budilnika, no my xotim shtoby pishalka gudkala i kogda vklyuchaetsya i sam budilnik. pitalis dobavit eto v kod. vot tolko eto i ds3231.

u nas na dannom etape, 2 problemy s kodom. vo pervix, esli sistema naxoditsya v rejime Alarm Mode, to odnovremennoe najatie na knopki hour i minute vklyuchaet ili otklyuchaet budilnik. no kogda budilnik vklyuchaetsya v perviz raz, on srazu idet na 01:01. my dumayem sto eto svyazano s odnovremennim najatiem hour/min. neznaem kak vklyuchit budilnik shtoby v perviy raz on jdal na 00h:00m a ne 01:01. takaya malenkaya problema.

a drugaya problema zaklyuchaetsya v tom sto, knopki hour i minute. esli ix najat i derjat, to knopka hour menjajaet vremya znachitelno bistrey chem knopka minute. v originalnoy versii koda, s funktsiey "millis" etovo ne bilo.

vot poslednyaya versiya koda, kotoruyu nam udalos napisat.

pomogite pojaluysta.

#include <DS3231.h>

// Initiate the DS3231 using the hardware interface
DS3231  rtc(SDA, SCL);

// Initiate a time-data structure
Time  t;

//определим выводы светодиодов подключаемых к arduino
int leds[4][4] = {
  { -1, 11, -1,  3},
  { -1, 10,  6,  2},
  {13,  8,  5,  1},
  {12,  7,  4,  0}
};

//выводы кнопок
int buttonHour = 0;
int buttonMinute = 1;
int buttonAlarm = 2;
int buttonOnOff = 3;
//вывод динамика
int speakerPin = 9;

//считанные с аналоговых разьемов значения
int hourValue, minuteValue, alarmValue, ledsOnOffValue;

//сохраняем время
int secondClock = 0, minuteClock = 0, hourClock = 0;
//сохраняем время будильника
int secondAlarm = 0, minuteAlarm = 0, hourAlarm = 0;

//Для вывода младшего рязряда минут и часов
int minuteUnitClock, hourUnitClock, minuteTensClock, hourTensClock;
//тоже самое, только для будильника
int minuteUnitAlarm, hourUnitAlarm, minuteTensAlarm, hourTensAlarm;
//режим часов или будильника
boolean modeClock = true, modeAlarm = false;
//активирован ли будильник
boolean alarmOnOff = false;

//для динамика
int length = 28;
int tempo = 300;
char notes[] = "caagafcccaahgCCddhhagffaagaf ";
int beats[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 };


void setup()
{
  //set outputs
  for (int k = 0; k <= 13; k++) {
    pinMode(k, OUTPUT);
    digitalWrite(k, LOW);
  }
  rtc.begin();
}


void timing()
{
  t = rtc.getTime();
  secondClock = t.sec;
  minuteClock = t.min;
  hourClock = t.hour;

  //надо посчитать остаток от деления на 10
  //для получения младшых разрядов чисел минут и часов

  minuteUnitAlarm = minuteAlarm % 10;
  hourUnitAlarm = hourAlarm % 10;
  minuteTensAlarm = (int)(minuteAlarm / 10);
  hourTensAlarm = (int)(hourAlarm / 10);

  minuteUnitClock = minuteClock % 10;
  hourUnitClock = hourClock % 10;
  minuteTensClock = (int)(minuteClock / 10);
  hourTensClock = (int)(hourClock / 10);
}

void lightOnLed(boolean modeClock)
{
  //Переменные для хранения значений секунд, минут и часов для непосредственно вывода
  int second = 0, minute = 0, hour = 0;
  int hourUnit, minuteUnit, hourTens, minuteTens;
  if (modeClock == false)
  {
    hour = hourAlarm;
    minute = minuteAlarm;
    hourUnit = hourUnitAlarm;
    minuteUnit = minuteUnitAlarm;
    hourTens = hourTensAlarm;
    minuteTens = minuteTensAlarm;
  } else
  {
    hour = hourClock;
    minute = minuteClock;
    hourUnit = hourUnitClock;
    minuteUnit = minuteUnitClock;
    hourTens = hourTensClock;
    minuteTens = minuteTensClock;
  }
  ledsOnOffValue = analogRead(buttonOnOff);
  // зажигаем светодиодики, если нажата кнопка, иначе гасим их
  if ((ledsOnOffValue < 1000 && modeAlarm == true && alarmOnOff == true) || (ledsOnOffValue < 1000 && modeClock == true))
  {
    //отображение часов
    //minutes units
    if (minuteUnit & 1) {
      digitalWrite(leds[3][3], HIGH);
    } else {
      digitalWrite(leds[3][3], LOW);
    }
    if (minuteUnit & 2) {
      digitalWrite(leds[2][3], HIGH);
    } else {
      digitalWrite(leds[2][3], LOW);
    }
    if (minuteUnit & 4) {
      digitalWrite(leds[1][3], HIGH);
    } else {
      digitalWrite(leds[1][3], LOW);
    }
    if (minuteUnit & 8) {
      digitalWrite(leds[0][3], HIGH);
    } else {
      digitalWrite(leds[0][3], LOW);
    }

    //minutes
    if (minuteTens & 1) {
      digitalWrite(leds[3][2], HIGH);
    } else {
      digitalWrite(leds[3][2], LOW);
    }
    if (minuteTens & 2) {
      digitalWrite(leds[2][2], HIGH);
    } else {
      digitalWrite(leds[2][2], LOW);
    }
    if (minuteTens & 4) {
      digitalWrite(leds[1][2], HIGH);
    } else {
      digitalWrite(leds[1][2], LOW);
    }

    //hour units
    if (hourUnit & 1) {
      digitalWrite(leds[3][1], HIGH);
    } else {
      digitalWrite(leds[3][1], LOW);
    }
    if (hourUnit & 2) {
      digitalWrite(leds[2][1], HIGH);
    } else {
      digitalWrite(leds[2][1], LOW);
    }
    if (hourUnit & 4) {
      digitalWrite(leds[1][1], HIGH);
    } else {
      digitalWrite(leds[1][1], LOW);
    }
    if (hourUnit & 8) {
      digitalWrite(leds[0][1], HIGH);
    } else {
      digitalWrite(leds[0][1], LOW);
    }

    //hour
    if (hourTens & 1) {
      digitalWrite(leds[3][0], HIGH);
    } else {
      digitalWrite(leds[3][0], LOW);
    }
    if (hourTens & 2) {
      digitalWrite(leds[2][0], HIGH);
    } else {
      digitalWrite(leds[2][0], LOW);
    }

  } else
  {
    for (int i = 0; i <= 13; i++) {
      digitalWrite(i, LOW);
    }
  }
}

void readButtons()
{
  alarmValue = analogRead(buttonAlarm);
  //обрабатываем нажатие на кнопку переключения режимов
  if (alarmValue < 1000)
  {
    if (modeClock == true)
    {
      modeClock = false;
      modeAlarm = true;
      tone(speakerPin, 1900);
      delay(200);
      noTone(speakerPin);

      //после переключения режимов, обнуляем все сигналы на цифровых выходах
      for (int i = 0; i <= 13; i++)  {
        digitalWrite(i, LOW);
      }
      delay(200);
    } else
    {
      modeClock = true;
      modeAlarm = false;
      //после переключения режимов, обнуляем все сигналы на цифровых выходах
      for (int i = 0; i <= 13; i++) {
        digitalWrite(i, LOW);
      }
      delay(200);
    }

  }
  //считывание нажатий на кнопки изменения часов и минут
  hourValue = analogRead(buttonHour);
  minuteValue = analogRead(buttonMinute);
  //в режиме будильника при нажатии на кнопки увеличения минут и часов включают или выключают будильник()
  if (hourValue < 1000 && minuteValue < 1000)
  {
    if (modeAlarm == true)
    {
      if (alarmOnOff == false) {
        alarmOnOff = true;
        tone(speakerPin, 1900);
        delay(200);
        noTone(speakerPin);
        hourAlarm = 0;
        minuteAlarm = 0;
        secondAlarm = 0;
        delay(200);
      } else {
        alarmOnOff = false;
        delay(200);
      }
    }
  }
  //обработка нажатия на кнопку прибавления часов
  if (modeClock == true)
  {
    if (hourValue < 1000)
    {
      hourClock++;
      if (hourClock >= 24) {
        hourClock = 0;
        minuteClock = 0;
      }
      secondClock = 0;
      rtc.setTime(hourClock, minuteClock, secondClock);
      delay(200);
    }
    //нажатие на кнопку прибавления минут

    if (minuteValue < 1000)
    {
      minuteClock++;
      if (minuteClock >= 60) {
        hourClock++;
        if (hourClock >= 24) hourClock = 0;
        minuteClock = 0;
      }
      secondClock = 0;
      rtc.setTime(hourClock, minuteClock, secondClock);
      delay(200);
    }
  } else
    //увеличиваем значение минут и часов будильника
  {
    if (hourValue < 1000)
    {
      hourAlarm++;
      if (hourAlarm >= 24) {
        hourAlarm = 0;
        minuteAlarm = 0;
        secondAlarm = 0;
      }
      delay(200);
    }
    //нажатие на кнопку прибавления минут

    if (minuteValue < 1000)
    {
      minuteAlarm++;
      if (minuteAlarm >= 60) {
        hourAlarm++;
        if (hourAlarm >= 24) hourAlarm = 0;
        minuteAlarm = 0;
        secondAlarm = 0;
      }
      delay(200);
    }
  }
}

void playTone(int tone, int duration)
{
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(speakerPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(speakerPin, LOW);
    delayMicroseconds(tone);
  }
}

void playNote(char note, int duration)
{
  char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
  int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };

  // проиграть тон, соответствующий ноте
  for (int i = 0; i < 8; i++) {
    if (names[i] == note) {
      playTone(tones[i], duration);

    }
  }
}

void playAlarm()
{
  if ((secondClock == secondAlarm && minuteClock == minuteAlarm && hourClock == hourAlarm && alarmOnOff == true))
  {
    for (int i = 0; i < length; i++)
    {
      playNote(notes[i], beats[i] * tempo);
      delay(tempo / 4);
      //считаываем значение с кнопки переключения режимов, (при проигрывании мелодии она будет выключать будильник)
      alarmValue = analogRead(buttonAlarm);
      if (alarmValue < 1000)
      {
        alarmOnOff = false;
        goto exit;
      }
    }
    //прибавляем длительность мелодии к времени, чтобы не сбить его
    secondClock = secondClock + 10;
    //если пользователь не выключил будильник сам, тогда мелодия повторится на следующей минуте
    minuteAlarm++;
  }
exit: return;
}

//главный цикл, вызов всех процедур
void loop()
{
  timing();
  lightOnLed(modeClock);
  readButtons();
  playAlarm();
}

 

zalias7
Offline
Зарегистрирован: 18.03.2015