Изучив комментарии к статье сразу взялся за работу. Появилась цель:
В итоге: был доработан интерфейс, отладочная информация убрана со стартового экрана; доработан модуль LCD(ЖКИ) дисплея — появились графики давления и влажности; добавлен внешний RTC(ЧРВ) с ионистором. Ну и самое главное добавлен стрелочный индикатор.
Стрелочная индикация и ЦАП
Самый простой способ получить стрелочную индикацию это подать напряжение на головку измерительного прибора. Нужное напряжение сформирует цифро-аналоговый преобразователь микроконтроллера. STM32L имеет двухканальный многофункциональный ЦАП. На барахолке был приобретен первый попавшийся прибор в неплохом состоянии:
Первым делом из прибора выброшена плата с детальками.
Рисуем шкалу:
Инициализация ЦАП и портов:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//Тактирование DAC:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
//Инициализация DAC:
DAC_InitTypeDef DAC_InitStructure;
/* DAC channel1 Configuration */
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
/* DAC Channel1 Init */
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
/* Enable DAC Channel1 */
DAC_Cmd(DAC_Channel_1, ENABLE);
запись значения:
DAC_SetChannel1Data(DAC_Align_12b_R, 160 + temperature * 3);
Выходного сигнала вполне хватает для того чтоб управлять стрелкой, напряжение не проседает, микроконтроллер не греется. Значение 160 выводит стрелку на середину шкалы. В результате имеем такую картину при +25:
Графики и ЖКИ
Графический режим дался не просто, не хотелось отдавать память микроконтроллера на хранение выведенной информации, а для этого необходимо было реализовать чтение из ЖКИ. Сконфигурировать порт на вход и выход одновременно не удалось, так что приходится перед каждой записью или чтением указывать ему чтение или запись.
Конфигурации порта: на вывод —
GPIO_InitStructure.GPIO_Pin = DATA_PIN0 | DATA_PIN1 | DATA_PIN2 | DATA_PIN3 | DATA_PIN4 | DATA_PIN5 | DATA_PIN6 | DATA_PIN7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init( DATA_PORT, &GPIO_InitStructure);
на получение данных —
GPIO_InitStructure.GPIO_Pin = DATA_PIN0 | DATA_PIN1 | DATA_PIN2 | DATA_PIN3 | DATA_PIN4 | DATA_PIN5 | DATA_PIN6 | DATA_PIN7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init( DATA_PORT, &GPIO_InitStructure);
Еще был подводный камень «dumy read» — после установки адреса первое чтение дает мусор, второе данные.
После этого функция PutPixel, DrawLine, Rectangle (вспомнил детство).
ЧРВ
Микросхема ЧРВ была выбрана DS2417 с one-wire интерфейсом, она лихо ужились на одной шине с DS18B20.
Выбор устройства происходит одинаковыми командами 55h+id а вот чтение с DS2417 66h а с DS18B20 BEh. Ионистор включенный в цепь питая обеспечивает работу часов даже при отключенном напряжении питания.
Автор: tarasii