Все, что вам нужно сделать, так это сконфигурировать RTC-чип в соответствии с текущей датой и временем … и сегодняшний проект поможет вам это сделать!
Проект
RTCSetup состоит из двух элементов:
- графический интерфейс пользователя (GUI), написанный на языке C# и запущенный на ПК
- скетч, запущенный на Arduino, к которому подключен модуль RTC
Графический интерфейс пользователя и скетч соединены по последовательному интерфейсу с помощью несложного протокола. Исходный код для них доступен в моем хранилище данных Github.
Arduino и часы реального времени
Для связи с чипом DS1307 я выбрал библиотеку RTClib хранилища Adafruit. Данный чип наиболее часто используется в модулях RTC энтузиастами со всего мира. Соединение между ИС и Arduino устанавливается с помощью шины I2C:
На рисунке показано соединение, организованное с помощью “новых” выводов I2C платы Arduino Uno; естественно вы можете использовать выводы A4 и A5.
Скетч Arduino получает команды от ПК, выполняет их и посылает назад ответный сигнал.
Протокол
Как я указал ранее, для связи между графическим интерфейсом пользователя и Arduino используется несложный протокол, созданный с помощью только 4-х команд:
Команда: ##
Первая команда, отправленная после установления соединения, используется ПК для подтверждения “совместимости” модуля, подключенного к последовательному порту. Arduino должен ответить командой "!!"
Команда: ?V
Данная команда используется для получения версии скетча. Arduino отвечает строковым параметром, определенным как константа в начале скетча:
#define VERSION "1.0"
Команда: ?T
Данная команда, используемая для получения фактической даты и времени, считывается из модуля RTC. Плата Arduino отвечает строковым параметром в формате: dd/MM/yyyy hh:mm:ss.
Команда: !TddMMyyyyhhmmss
Данная команда используется для установки времени RTC. Arduino отвечает командой "OK".
Графический интерфейс пользователя (GUI)
Графический интерфейс пользователя, разработанный на C#, общается с Arduino по вышеуказанному протоколу и выполняет три функции:
- устанавливает текущую дату и время
- устанавливает требуемую дату и время, которые определяет пользователь
- получает и отображает фактическую дату и время модуля RTC.
Сначала вам необходимо выбрать последовательный порт Arduino для установки соединения и нажать кнопку CONNECT. Если соединение установлено (команды ## и ?V), тогда в строке состояния будет отображаться версия скетча.
В первом окне будет показано фактическое время ПК. После нажатия правой кнопки мыши (на красной стрелке) вы сможете сконфигурировать модуль RTC с данным временем :
С помощью кнопки с зеленой стрелкой вы сможете получить фактическое время, хранимое в модуле RTC:
И, наконец, с помощью выпадающего списка даты в центре, вы сможете выбрать требуемое значение даты и времени, и затем отправить эти значения в модуль RTC:
Технические данные
Я использовал метод, описанный в данном учебном руководстве, для внедрения пользовательского шрифта в приложение.
Я измерил время (около 150 мс), которое необходимо скетчу для установки времени, после того как команда отправлена графическим интерфейсом пользователя: это причина почему в коде, который вы видите, команда !T отправляется, когда действительное число миллисекунд составляет 850 и пройденное время – это фактическое время + 1 секунда.
while (DateTime.Now.Millisecond != 850) Thread.Sleep(1); string command = "!T" + time.AddSeconds(1).ToString("ddMMyyyyHHmmss"); serialPort.WriteLine(command);
Прикрепленные файлы:
- RTCSetup-master.zip (164 Кб)
Комментарии (11) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
Надо лишь указать свой чип в строке RTC_DS3231 RTC; (за место DS1307)
Спасибо!
Автору огромный респект, очень нужный софт.
"No data from serial port: Время ожидание операции истекло"
В коде Сообщение подправил
MessageBox.Show("No data from serial port:" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
В VisualStudio:
Вызвано исключение: "System.TimeoutException" в System.dll
response = serialPort.ReadLine(); не проходит
В ARDUINO IDE если в Мониторе порта ввожу ##, то получаю !!
Т.е. СКЕТЧ работает.
Прочитать с порта не получается. Где копать - не пойму.
Посдкажите пожалуйста.
Ардуинка работает, в порт !! посылает. Проверял.
Програмулинка не может считать с порта.
Для инфы: Arduino Micro + RTC_PCF8563
serialPort.ReadTimeout = 10000;
serialPort = new SerialPort(serialPortName, 57600);
serialPort.NewLine = "\r\n";
serialPort.ReadTimeout = 500;
serialPort.BaudRate = 9600;
serialPort.Parity = Parity.None;
serialPort.StopBits = StopBits.One;
serialPort.DataBits = 8;
serialPort.Handshake = Handshake.None;
serialPort.RtsEnable = true;
Все заработало !!