Доброго времени суток, решил перейти с arduino на stm32, и первое за что взялся сделать банальные часы.
Включил тактирование RTC, поставил вашу библиотеку segment_lcd. и пытаюсь вывести цифры часов:
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
char str[DIGITS_NUM];
snprintf(str, DIGITS_NUM, "%d%d", sTime.Minutes, sTime.Seconds );
SEG_LCD_WriteString(str);
Проблема в том что sTime.Seconds имеет вид 1 2 3 4 (вместо 01 02 03 04) из за чего становился проблематично выводить их на прямую.
К тому же я не совсем понимаю как работает SEG_LCD_WriteString. Посоветуйте пожалуйста как привести строку к нужному виду, спасибо.
@nozyl доброго! Вот набросал, дисплея нет под рукой проверить, но думаю, все нормально будет:
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN); char str[DIGITS_NUM + 2]; snprintf(str, DIGITS_NUM + 2, "%02d.%02d", sTime.Minutes, sTime.Seconds);
@aveal Большое спасибо, работает.%02d
означает "форматировать целое число с двумя цифрами, оставляя его заполнением нулями"
я этого не знал, теперь осталась прикрепить кнопку для настройки часов. Опять же воспользуюсь вашей библиотекой button.
@nozyl button уже не моя, с сообщества ) Но там все четко, должно работать. Если что пиши, разберемся с проблемами 👍
Прикрепил кнопку вот таким образом, думаю что так не делать правильно, но она работает 😀. Не могу разобраться как в библиотеке segment_lcd заставить точку мигать.
if (BUTTON_GetAction(BUTTON_SETTINGS) == BUTTON_SHORT_PRESS) { sTime.Seconds++; if(sTime.Seconds >=60) { sTime.Minutes ++; sTime.Seconds = 0; } HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN); }
Вопрос с точкой решил... но максимально глупо =)
if(sTime.Seconds % 2 == 0) { snprintf(str, DIGITS_NUM +2, "%02d%02d", sTime.Minutes, sTime.Seconds ); } else { snprintf(str, DIGITS_NUM +2, "%02d.%02d", sTime.Minutes, sTime.Seconds ); }
@nozyl Можно независимо от формирования строки принудительно гасить сегмент точки, когда она не нужна.
Здравствуйте !
Ни как не могу разобраться. Хочу организовать структуру для хранения данных (с датчика).
В main.c написал :
struct // создаём ярлык
{
uint16_t angle_z, height_901;
} struct_wt_901;
В main.c могу и записать в неё и прочитать.
struct_wt_901.angle_z = angle; // структура
angle= struct_wt_901.angle_z ;
Вопрос:
Не могу сделать видимой эту структуру во всей программе.
Определение extern не помогает ...
Может надо структуру по другому организовывать ? Или определение в заголовочном файле (*.h) писать.
Как только не пробовал делать не выходит .
По моему так:
struct wt_901 { uint16_t angle_z, height_901; } ; struct wt_901 struct_wt_901;
В другом файле
extern struct wt_901 struct_wt_901;
Прошу прощения за мою безграмотность, а что бы прочитать или записать в эту структуру в другом файле как надо написать?
В другом файле:
extern struct wt_901 struct_wt_901;
а дальше, что бы прочитать:
uint16_t temp = struct_wt_901.angle_z; - так ошибку пишет
@aleksej-6 Вот эта строка где написана?
struct wt_901 struct_wt_901;
Она не видидит это определение. Значит оно находится где то не там.
Да, похоже на то ..
В main.c :
/* USER CODE BEGIN PV */
extern struct wt_901 struct_wt_901;
Пробовал и в не только в этом месте..
Чего то у меня не то в моей программе, наверное.
(пол второго ночи, завтра дальше надо будет думать, Спасибо! )