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

    Изучив комментарии к статье сразу взялся за работу. Появилась цель:

    В итоге: был доработан интерфейс, отладочная информация убрана со стартового экрана; доработан модуль 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. Ионистор включенный в цепь питая обеспечивает работу часов даже при отключенном напряжении питания.

    Исходники проекта.
    Поделиться публикацией
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 14
      +4
      Я бы не смог сделать такой проект — было бы жалко портить хороший омметр.
      0
      А для чего вы используете отдельную микросхему RTC? Согласно www.st.com/internet/mcu/product/248820.jsp у STM32L152RBT6 есть внутренние RTC с отдельным питанием. К тому же они low power.
        0
        Для опытов, ну и если честно, не разобрался как сделать отдельное питание внутреннему RTC. Сейчас реализовано так что при старте считывается время и дата из внешнего и записывается во внутренний, дальше считываю из внутреннего.
        0
        Летчик.JPG
        Не ясно, какой LCD использовали, где конечная фотка? На фото только стрелка с цветной шкалой, как я понимаю, стрелка на фоне экрана должна быть еще, или как это все релизовано?
          0
          Использовалася древняя графическая ЖК матрица Hitachi HLM9301 (80х60мм), в конце статьи фото. Подробнее можно глянуть здесь
          0
          Господа, когда пишем под STM32, не возникают чувства дискомфорта от стандартных библиотек? Уж слишком кутеляпо они написаны.
          Предлагаю совместно сделать человеческую библиотеку.
            0
            Некий дискомфорт есть, но нет мыслей как от него избавится.
            0
            Вот теперь на экране действительно читаемые данные, а то раньше при взгляде на экран непонятно было, где же искать температуру.
              0
              Таки серводвигатель дал бы более красивый результат.

              Вопрос по текущей реализации: не было желания сделать нелинейную шкалу?
                0
                Проблем в реализации не линейной шкалы я не вижу, но необходимо придумать смысл шкалы, на что установить акцент?
                  0
                  смысл — дать больше градаций в интересующем диапазоне, меньше в граничных.
                  Если для помещения термометр, то видимо нулевые значение совсем не интересны, меньше 10-15 градусов, тоже не будет опускаться. С максимальными аналогично поступить.

                  Можно с другой стороны зайти — наиболее комфортную температуру (скажем, 23 градуса) «поставить» на вертикальное положение стрелки, тогда будет более наглядно, тепло или прохладно. Слева оставить пятую часть шкалы под «холодно», справа — под «жарко», а середину равномерно поделить.

                  Сложно сказать насколько вся эта возня оправдана с практической точки зрения, но я бы пробовал что-то такое.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое