Advertisement
Guest User

Untitled

a guest
Apr 8th, 2021
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.48 KB | None | 0 0
  1. //Подключаем библиотеки
  2. #include <stdio.h>
  3. #include <DS1302.h>
  4. #include "TM1637.h"
  5.  
  6. //объявляем массив с 4-мя ячейками, каждая ячейка - это 1 символ на дисплее
  7. int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};
  8.  
  9. //объявляем переменные, в которые будем писать текущщее время
  10. int minute = 4;
  11. int hour = 15;
  12.  
  13. //логическая переменная, если "true" то будем рисовать двоеточие на дисплее.
  14. boolean ifPoint;
  15.  
  16. //объявляем переменные с номерами пинов, к которым подключен дисплей и создаем новый объект класса TM1637;
  17. #define CLK 9
  18. #define DIO 8
  19. TM1637 tm1637(CLK,DIO);
  20.  
  21. //тоже самое, только для модуля часов
  22. const int kCePin = 5; // Chip Enable
  23. const int kIoPin = 6; // Input/Output
  24. const int kSclkPin = 7; // Serial Clock
  25. DS1302 rtc(kCePin, kIoPin, kSclkPin);
  26.  
  27. //функция setup выполняется один раз при запуске ардуино
  28. void setup()
  29. {
  30.  
  31. rtc.halt(false); //Запускаем часы на случай если они стояли. Чтобы остановить, можно вызвать halt(true);
  32.  
  33. Serial.begin(9600); //соединяемся с компьютером по USB
  34. Serial.println("ready"); //Выводим слово "Ready" в монитор порта (если он у вас открыт)
  35. tm1637.set(); //инициализируем
  36. tm1637.init(); //дисплей
  37. }
  38.  
  39. // после выполнения функции setup, Функция loop выполняется циклически
  40. void loop()
  41. {
  42.  
  43. Time t = rtc.time(); //создаем экземпляр класса Time и пишем в него данные из модуля часов.
  44.  
  45. //Дальше идет условие, и если функция Serial.available() вернет значение больше нуля, значит с монитора порта были посланы цифры для установки времени (надеюсь ничего лишнего вы туда слать не будете)
  46. //вобщем это условие выполняется, только если вы (или комп по своему желанию) что-то послали через монитор порта в ардуино, иначе весь код до конца условия просто пропускается
  47. if (Serial.available() > 0) {
  48. int num =Serial.parseInt(); //читаем число из буфера в переменную num
  49. // Serial.println(num);
  50. rtc.writeProtect(false);
  51. t.hr=num/100; //hr это стандартная переменная класса Time. Пишем в нее часы например вы ввели 1732 тогда 1732/100 будет 17(остаток сам отбрасывается),
  52. //вот и пишем 17 в переменную hr (hr от hour - час)
  53. t.min=num%100; //тоже самое делаем с минутами, оператор % делит значение переменной num на 100 но возвращает остаток
  54. // 1732/100 будет 17.32, то есть 32 остаток, как раз он и запишется в переменную min
  55. t.sec=0; //секунды просто сбросим в 0.
  56. rtc.writeProtect(false); //снимаем защиту от записи данных (нового времени, например) на модуле часов
  57. num =Serial.parseInt(); //монитор порта, помимо введенного нами числа 1732, шлет символ перевода строки, тут мы его считываем, чтобы опустошить буфер, костыль, но работает
  58. // Time t2(2013, 9, 22, 1, 38, 50, Time::kSunday);
  59. rtc.time(t); // пишем в модуль часов все значения экземпляра класса Time (часы, секунды, минуты)
  60. rtc.writeProtect(true); //возвращаем защиту от записи, возможно это делать не обязательно.
  61. } //тут конец условия!!!!!!!
  62.  
  63. minute=t.min; //в переменные minute и hour считываем сначения минут и часов для последующего пользования
  64. hour=t.hr;
  65. if(ifPoint)tm1637.point(POINT_ON); //если двоеточие было выключено, включаем
  66. else tm1637.point(POINT_OFF); //иначе выключаем
  67. ifPoint=!ifPoint; //меняем логическую переменную, определяющую то, горело ли двоеточие, на противоположное значение.
  68. TimeDisp[0] = hour / 10;
  69. //TimeDisp[0] должен содержать значение первой цифры на дисплее из 4-х. У нас 17 часов, надо записать число "1".
  70. Time t2(2013, 9, 22, 1, 38, 50, Time::kSunday); //для этого 17 делим на 10, получаем 1, а остаток не учитывается.
  71. TimeDisp[1] = hour % 10; //В TimeDisp[1] надо записать вторую цифру, то есть 7. 17%10 дает 7. оператор % возвращает остаток от деления.
  72. TimeDisp[2] = minute / 10; //Тут, надеюсь, уже логически понятно, пишем минуты в 3ю и 4ю ячейку дисплея.
  73. TimeDisp[3] = minute % 10; //
  74. tm1637.display(TimeDisp); //отправляем на дисплей массив TimeDisp, в который мы записали все 4 цифры.
  75. delay(500); // ждем пол секунды (500 миллисекунд), чтобы двоеточие на дисплее мигало с частотой в 1 сек., заодно и ардуина отдохнет))
  76. //теперь будет возврат в начало функции loop и так постоянно, пока не отключите питание от ардуины.
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement