Ребята, помогите пожалуйста новичку. Слепил скетч, не могу на LSD 1602 вывести дни недели. Один раз слуыайно получилось, потом исчезло... Я в этом чайник, если где неправильно, поправте пожалуйста. Код (C++): #include "Wire.h" #include "DS1307new.h" #include "LiquidCrystal.h" // библиотека экрана LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup(){ Serial.begin(9600); if(RTC.isPresent()){ // обнаружен ли модуль? Serial.println("RTC Ready"); // все хорошо } else { Serial.println("Error!!!! RTC Module not found"); // сообщаем о проблеме while(1); // и останавливаем скетч } lcd.begin(16, 2); // запускаем библиотеку экрана } void loop(){ RTC.getTime();// получить время от модуля printTimeToSerial(); // выводим полученное время в лог printTimeToLCD();; // выводи время на экран doSerialCommands(); // слушаем и выполняем команды из Serial } // Выводит текущие время в Serial void printTimeToSerial(){ byte static prevSecond=0; // тут будем хранить, сколько секунд было при прошлом отчете if(RTC.second!=prevSecond){ // что-то делаем только если секунды поменялись Serial.print(RTC.hour); // часы Serial.print(":"); // разделитель Serial.print(RTC.minute); Serial.print(":"); Serial.println(RTC.second); prevSecond=RTC.second; // запомнили когда мы "отчитались" } } // Выводит текущие время на LCD void printTimeToLCD(){ byte static prevSecond=0; // тут будем хранить, сколько секунд было при выводе if(RTC.second!=prevSecond){ // что-то делаем только если секунды поменялись lcd.setCursor(4,1); // устанавливаем позицию курсора if(RTC.hour<10)lcd.print(" "); lcd.print(RTC.hour); // часы lcd.print(":"); // разделитель if(RTC.minute<10)lcd.print(0); // лидирующий ноль, если нужен lcd.print(RTC.minute); lcd.print(":"); if (RTC.second < 10) // correct second if necessary lcd.print("0"); lcd.print(RTC.second); lcd.setCursor(5,0); // устанавливаем позицию курсора lcd.print(" "); if (RTC.day < 10) // correct date if necessary { lcd.print(""); lcd.print(RTC.day); } else { lcd.print(RTC.day); } lcd.print("."); if (RTC.month < 10) // correct month if necessary { lcd.print("0"); lcd.print(RTC.month); } else { lcd.print(RTC.month); } lcd.print("."); lcd.print(RTC.year); // Year need not to be changed lcd.print(" "); lcd.setCursor(1,0); // устанавливаем позицию курсора switch (RTC.dow) // вывести день недели { case 1: lcd.print("MON"); break; case 2: lcd.print("TUE"); break; case 3: lcd.print("WED"); break; case 4: lcd.print("THU"); break; case 5: lcd.print("FRI"); break; case 6: lcd.print("SAT"); break; case 7: lcd.print("SUN"); break; } prevSecond=RTC.second; // запомнили когда мы "отчитались" } } // устанавливает часы модуля на какое-то заранее определенное время void setSomeTime(){ RTC.stopClock();// останавливаем часы RTC.fillByHMS(14,29,0); // подкручиваем стрелки на 14:29:00 RTC.fillByYMD(2017,2,3); // установить дату 2017,2,3 RTC.setTime();// отправляем "подкрученное время" самому модулю RTC.startClock(); // и опять запускаем часы } // слушает из Serial команды и выполняет их. Каждая команда - один символ. // доступны команды: // s - установить время указанное в функции setSomeTime() void doSerialCommands(){ if(Serial.available()){ // что-нибудь пришло? char ch=Serial.read(); // читаем что пришло switch(ch){ case 's': // команда установки времени setSomeTime(); // устанавливаем break; // тут, в будущем, мы можем добавлять дополнительные команды default:; // на неизвестную команду - ничего не делаем }; } [LIST=1] [*]} [/LIST]
Я бы не объявлял переменную в начале функции вывода времени на экран с одновременным обнулением - тогда нет смысла запоминать ее в конце этой функции. Перенесите лучше в глобальные переменные. И проверьте в какую позицию вы пытаетесь вывести день недели.
Спасибо, Но я конкретный чайник в этом вопросе, занимаюсь самоучением всего около двух недель, да и то если есть время. Мне нужно тыкнуть пальцем, а я начну разбираться. Хотел показать экран с пустым местом, где должны находиться дни недели, а там всё в порядке. Попробовал загрузить скетч отсюда, всё работает. Не знаю в чём была причина. Пожалуйста, укажите какую переменную и куда можно перенести, а я буду изучать.
Это переменная (prevSecond) с модификатором static. Фактически она обнуляется во время запуска программы. Далее она хранит присвоенное значение как любая глобальная переменная. Тут не нужно ничего менять. Код (C++): void printTimeToSerial(){ byte static prevSecond=0; // тут будем хранить, сколько секунд было при прошлом отчете День недели выводится в позицию 1,0. Читайте комментарии в коде. Они на русском. Код (C++): lcd.setCursor(1,0); // устанавливаем позицию курсора switch (RTC.dow) // вывести день недели