Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Подключаем библиотеки
- #include <stdio.h>
- #include <DS1302.h>
- #include "TM1637.h"
- //объявляем массив с 4-мя ячейками, каждая ячейка - это 1 символ на дисплее
- int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};
- //объявляем переменные, в которые будем писать текущщее время
- int minute = 4;
- int hour = 15;
- //логическая переменная, если "true" то будем рисовать двоеточие на дисплее.
- boolean ifPoint;
- //объявляем переменные с номерами пинов, к которым подключен дисплей и создаем новый объект класса TM1637;
- #define CLK 9
- #define DIO 8
- TM1637 tm1637(CLK,DIO);
- //тоже самое, только для модуля часов
- const int kCePin = 5; // Chip Enable
- const int kIoPin = 6; // Input/Output
- const int kSclkPin = 7; // Serial Clock
- DS1302 rtc(kCePin, kIoPin, kSclkPin);
- //функция setup выполняется один раз при запуске ардуино
- void setup()
- {
- rtc.halt(false); //Запускаем часы на случай если они стояли. Чтобы остановить, можно вызвать halt(true);
- Serial.begin(9600); //соединяемся с компьютером по USB
- Serial.println("ready"); //Выводим слово "Ready" в монитор порта (если он у вас открыт)
- tm1637.set(); //инициализируем
- tm1637.init(); //дисплей
- }
- // после выполнения функции setup, Функция loop выполняется циклически
- void loop()
- {
- Time t = rtc.time(); //создаем экземпляр класса Time и пишем в него данные из модуля часов.
- //Дальше идет условие, и если функция Serial.available() вернет значение больше нуля, значит с монитора порта были посланы цифры для установки времени (надеюсь ничего лишнего вы туда слать не будете)
- //вобщем это условие выполняется, только если вы (или комп по своему желанию) что-то послали через монитор порта в ардуино, иначе весь код до конца условия просто пропускается
- if (Serial.available() > 0) {
- int num =Serial.parseInt(); //читаем число из буфера в переменную num
- // Serial.println(num);
- rtc.writeProtect(false);
- t.hr=num/100; //hr это стандартная переменная класса Time. Пишем в нее часы например вы ввели 1732 тогда 1732/100 будет 17(остаток сам отбрасывается),
- //вот и пишем 17 в переменную hr (hr от hour - час)
- t.min=num%100; //тоже самое делаем с минутами, оператор % делит значение переменной num на 100 но возвращает остаток
- // 1732/100 будет 17.32, то есть 32 остаток, как раз он и запишется в переменную min
- t.sec=0; //секунды просто сбросим в 0.
- rtc.writeProtect(false); //снимаем защиту от записи данных (нового времени, например) на модуле часов
- num =Serial.parseInt(); //монитор порта, помимо введенного нами числа 1732, шлет символ перевода строки, тут мы его считываем, чтобы опустошить буфер, костыль, но работает
- // Time t2(2013, 9, 22, 1, 38, 50, Time::kSunday);
- rtc.time(t); // пишем в модуль часов все значения экземпляра класса Time (часы, секунды, минуты)
- rtc.writeProtect(true); //возвращаем защиту от записи, возможно это делать не обязательно.
- } //тут конец условия!!!!!!!
- minute=t.min; //в переменные minute и hour считываем сначения минут и часов для последующего пользования
- hour=t.hr;
- if(ifPoint)tm1637.point(POINT_ON); //если двоеточие было выключено, включаем
- else tm1637.point(POINT_OFF); //иначе выключаем
- ifPoint=!ifPoint; //меняем логическую переменную, определяющую то, горело ли двоеточие, на противоположное значение.
- TimeDisp[0] = hour / 10;
- //TimeDisp[0] должен содержать значение первой цифры на дисплее из 4-х. У нас 17 часов, надо записать число "1".
- Time t2(2013, 9, 22, 1, 38, 50, Time::kSunday); //для этого 17 делим на 10, получаем 1, а остаток не учитывается.
- TimeDisp[1] = hour % 10; //В TimeDisp[1] надо записать вторую цифру, то есть 7. 17%10 дает 7. оператор % возвращает остаток от деления.
- TimeDisp[2] = minute / 10; //Тут, надеюсь, уже логически понятно, пишем минуты в 3ю и 4ю ячейку дисплея.
- TimeDisp[3] = minute % 10; //
- tm1637.display(TimeDisp); //отправляем на дисплей массив TimeDisp, в который мы записали все 4 цифры.
- delay(500); // ждем пол секунды (500 миллисекунд), чтобы двоеточие на дисплее мигало с частотой в 1 сек., заодно и ардуина отдохнет))
- //теперь будет возврат в начало функции loop и так постоянно, пока не отключите питание от ардуины.
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement