Pomogite pojaluysta, s kodom dlya Arduino binary alarm clock
- Войдите на сайт для отправки комментариев
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(); }
http://translit.net/