STM32 метеостанция, аналоговая индикация

в 18:56, , рубрики: diy или сделай сам

Изучив комментарии к статье сразу взялся за работу. Появилась цель:
STM32 метеостанция, аналоговая индикация
В итоге: был доработан интерфейс, отладочная информация убрана со стартового экрана; доработан модуль LCD(ЖКИ) дисплея — появились графики давления и влажности; добавлен внешний RTC(ЧРВ) с ионистором. Ну и самое главное добавлен стрелочный индикатор.

Стрелочная индикация и ЦАП

Самый простой способ получить стрелочную индикацию это подать напряжение на головку измерительного прибора. Нужное напряжение сформирует цифро-аналоговый преобразователь микроконтроллера. STM32L имеет двухканальный многофункциональный ЦАП. На барахолке был приобретен первый попавшийся прибор в неплохом состоянии:
STM32 метеостанция, аналоговая индикация
Первым делом из прибора выброшена плата с детальками.
STM32 метеостанция, аналоговая индикация
Рисуем шкалу:
STM32 метеостанция, аналоговая индикация
Инициализация ЦАП и портов:

  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:
STM32 метеостанция, аналоговая индикация

Графики и ЖКИ

Графический режим дался не просто, не хотелось отдавать память микроконтроллера на хранение выведенной информации, а для этого необходимо было реализовать чтение из ЖКИ. Сконфигурировать порт на вход и выход одновременно не удалось, так что приходится перед каждой записью или чтением указывать ему чтение или запись.
Конфигурации порта: на вывод —

  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 (вспомнил детство).
STM32 метеостанция, аналоговая индикация

ЧРВ

Микросхема ЧРВ была выбрана DS2417 с one-wire интерфейсом, она лихо ужились на одной шине с DS18B20.
STM32 метеостанция, аналоговая индикация
Выбор устройства происходит одинаковыми командами 55h+id а вот чтение с DS2417 66h а с DS18B20 BEh. Ионистор включенный в цепь питая обеспечивает работу часов даже при отключенном напряжении питания.

Исходники проекта.

Автор: tarasii

Поделиться

* - обязательные к заполнению поля