Пользователь
0,0
рейтинг
3 октября 2012 в 21:25

Комнатная метеостанция на STM32L-DISCOVERY из песочницы

С детства мечтал о комнатном термометре, гигрометре и барометре (не прошли даром уроки природоведения и биологии). Даже был куплен настенный вариант со стрелочными приборами советского образца типа такого:

Но по ошибке был повешен на створку двери и через некоторое время прийдя в негодность, от постоянных сотрясений, начал показывать одно и тоже значение. Психрометр пугал своим видом. Да и записывать каждый день показания — глупая затея. Механические системы были похоронены на совсем с приходом контроллеров.

Долго присматривал различные отладочные платы. По совету знакомого купил я отладочную плату STM32L-Discovery от фирмы ST, подробное описание здесь. Заманчиво звучало то, что это ARM на ядре Cortex-M3. Сердцем платы является STM32L152RBT6. Также на плате есть on-board программатор и отладчик ST-Link и шести сегментный LCD дисплей.


Посты Метеостанция своими руками, Термометр на SHT21 и наличие STM32L-Discovery вдохновили на реализацию проекта.

Немного освоившись в Keil загрузил вместо идущего на борту примера, другой пример Temperature project — и вуаля термометр уже готов. Микроконтроллер может измерять Vref. У него также есть свой собственный датчик температуры чипа.

Все бы хорошо но этот датчик показывает температуру кристалла, решил добавить датчик температуры DS18B20, да и one-wire интерфейс хорошо бы освоить. Оказалась чтобы что либо добавить необходимо первым делом избавится от штатного LCD экрана, он со своими 6 символами занимает практически все свободные порты процессора.

В закромах родины завалялся старенький LCD экран собранный на контроллерах Hitachi (8 строк по 25 символов)

В выше указанной статье упоминался цифровой датчик влажности воздуха HIH3610, но был приобретен емкостной датчик влажности HCH1000 и барометрический датчик HSF1000.

Итак организовались задачи по подключению оборудования:
1. Подключение и программирование LCD экрана;
2. Подключение и получение данных от RTL;
2. Подключение цифрового датчика температуры DS18B20 и чтение из него данных по шине one-wire;
3. Подключение емкостного датчика HCH1000 и получение данных;
4. Подключение пьезоэлектрического датчика HSF1000 и получение данных;

Вот такое устройство вышло:



Подключение и программирование LCD экрана


Экземпляр попавший мне в руки оказался настолько старым что документации от него не нашлось. На нем были 4 чипа HD44102CH и 2 HD44102, и 4 дискретных микросхемы описание которых я не нашел.
Reference manual на HD44102 был найден, и было 8 ножек 4 микросхем соединенных между собой и выведенных на разъем — так нашлись D0-D7, питание было найдено по дискретным микросхемам. Оставались сигналы RW,E,CS,R/S, В youtub был найден LCD модуль HLM9301 с виду очень похожий на мой LCD, итальянец на форуме www.lcdstudio.com дал распиновку которая совпадала с собранным мною априором:
1 GND; 2 VCC;
3 contraste ( generalmente terminal medio de potenciometro de 10k colocado entre vcc y gnd) 4 NC (no conectado);
5 NC; 6 CS1;
7 CS2; 8 CS3;
9 NC; 10 E;
11 R/W 12 R/S (DATA/INSTRUCTION)
13 D0; 14 D1;
15 D2; 16 D3
17 D4; 18 D5;
19 D6; 20 D7.
Но при подаче команд матрица не проявляла признаков жизни.
После долгого, не меньшего от предыдущего, поиска по интернетам выяснилось что старым графическим экранам необходимо было отрицательное напряжение для яркости. Был включен преобразователь DC-DC P6AU0505 и между выводом яркости и -5 установлен прецизионный переменный резистор 200кОм.
Команды от HD44102 подошли. Была написана библиотека работы с HLM9301. На форумах ребята утверждали что с Arduino все работало сразу со стандартной библиотекой GLCD.

Видео демонстрирует прочитанные данные из внутренних RTC и термометра.

Подключение и получение данных от RTL


Инициализация RTC происходит так:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_SYSCFG, ENABLE);
PWR_RTCAccessCmd(ENABLE);
RCC_LSEConfig(RCC_LSE_ON); //do not touch LSE to prevent RTC calendar reset
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {}
RCC_RTCCLKCmd(ENABLE);

Проблема: при сбросе сбрасывался и RTC. Фрагмент кода взятый из демонстрационного примера что-то делал с LSE — этим и сбрасывался RTC.
Чтение данных:
RTC_DateTypeDef RTCDateStr;
RTC_TimeTypeDef RTCTimeStr;
RTC_GetTime(RTC_Format_BIN, &RTCTimeStr);
RTC_GetDate(RTC_Format_BIN, &RTCDateStr);
sprintf(strDisp, "%02d/%02d/%02d %02d:%02d:%02d", RTCDateStr.RTC_Year, RTCDateStr.RTC_Month, RTCDateStr.RTC_Date, RTCTimeStr.RTC_Hours, RTCTimeStr.RTC_Minutes, RTCTimeStr.RTC_Seconds);

Тут то получились две новые задачи «или»: в цепь питания микросхемы включить ионистор и при падении напряжения питания переходить в «спящий режим», или прицепить внешний RTC. Думаю попробовать оба метода…

Подключение цифрового датчика температуры DS18B20


Благодаря статьям Stm32 + 1-wire + DMA (продолжение) и Stm32 + 1-wire + DMA добавлена библиотека onewire.c но для процессора STM32L152 инициализация портов выглядит немного по-другому:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);          
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOA, &GPIO_InitStructure);          
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);

Схема подключения взята из datasheet:

При помощи статьи «Поиск устройств» была добавлена возможность подключения нескольких устройств на шину one-wire. Разрешение у DS18B20 при считывании всех 12 бит 0,0625 градуса по Цельсию.

Подключение емкостного датчика HCH1000


Измерять емкость можно по-разному, самый простой метод зарядить и следить за падением напряжения, посчитав время вычислить емкость, либо по сопротивлению переменному току оценивать емкость. Honeywell любезно предоставило datasheet в котором датчик был задающей величиной в генераторе на 555. К последнему методу я и прибег собрав простой генератор:

Вычислить частоту оказалось не трудно STM32L152 имеет несколько таймеров которые могут работать в режиме захвата параметров PWM сигнала. Подробо здесь.
Отличием оказалось, как и в случае с one-wire конфигурация портов:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                               
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_TIM2);

В остальном все по тексту в прерывании вычитываем значения счетчиков, получили длину периода, умножили на коэффициент есть емкость, от емкости согласно графиков датчика перешли к влажности.

Подключение пьезоэлектрического датчика HSF1000


Подключил датчик на Vref, GND и ко входу АЦП. Опыт показал, что точности 12 разрядного АЦП оказалось мало чтоб оценить полезный сигнал. Подключение инструментального усилителя AD8555 по стандартной схеме к датчику дало свои плоды. Усиления в 10 раз вполне хватило чтоб поднять уровень сигнала до 0,7В.


Вот главный экран устройства

значения по строкам:
1. дата время из внутреннего RTL;
2. скважность и период сигнала с генератора, также количество найденных устройств one-wire;
3. емкость датчика влажности и влажность;
4. идентификатор one-wire;
5. значение температуры;
6. значение напряжения;
7. значение температуры кристала;
8. значение давления.

Исходники проекта здесь
@tarasii
карма
23,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

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

Комментарии (36)

  • +6
    первая мысль при взгляде на заглавие и картинку: «о, неужели стрелками механических индикаторов рулят?»

    но так тоже нормально :)
    • +1
      Между прочим, по поводу управления механическим индикатором при помощи контроллера — была мысль, что такое устройство было бы полезно для уличного применения. Стрелочный индикатор с приводом от шагового двигателя можно сделать большого размера, и такой индикатор очень хорошо видно днем, в отличие от светодиодных индикаторов. ЖКИ индикаторы большого размера достать непросто, и они боятся высоких и низких температур. Кроме того, такой механический индикатор потребляет энергию только во время изменения показаний, так что при редком обновлении показаний устройство будет довольно экономичным.
      Пример устройства, в котором такой индикатор оказался бы хорош — термометр для воды на пляже.

      По статье — не пробовали сделать отображение значений крупными цифрами, сделать построение графиков? Индикатор-то графический.

      • 0
        Раскрыть бы тему стрелочных индикаторов для МК…
        • 0
          Можно ведь просто использовать серво-привод :)
          • 0
            На каждую серво — это и дорого и шумно. Было бы здорово если кто-нибудь описал более оптимальные пути
            • 0
              Шумновато это да, но дорого ли — ои стоят по 3-4 бакса.
        • 0
          (Милли)амперметр со самодельной шкалой рулит.
          • 0
            А там при помощи ШИМ рулить?
            • 0
              Должны быть тысячи способов получить заданный ток/напряжение в цепи :)
              • 0
                Просто если ШИМ, то ничего дополнительного для МК не надо. Вопрос: подходит ли для этой цели ШИМ…
                • +1
                  Проинтегрируйте ШИМ RC цепочкой и получите произвольное (почти) значение напряжения на выходе схемы. А еще можно 8-и битный ЦАП сделать.
                  • 0
                    Я могу попробовать сделать термометр со стрелочным индикатором на основе шагового двигателя и написать об этом статью. Но вот нужно ли это делать?
                • 0
                  ну можно и набортным ЦАПом обойтись в крайнем случае)
        • +1
          • 0
            Спасибо большое!
  • 0
    Признаюсь, идея со стрелочной индикацией (как на главной) — привлекла.
  • +4
    Люди — удивительные создания. Были мехнические устройства измерения, неудобные и с кучей недостатков. Пришёл час и появилась цифровая обработка, цифровые датчики и т.п. И вдруг! люди начали делать цифровые стрелки через шаговые движки и прочие выдумки, эмулировать всё те же механические стрелки. Удивляюсь и восхищаюсь!
    • 0
      Вы объединили средства отображения информация и средства измерения в одно, но если разбить это по частям то получится:
      Были механические устройства неудобные с кучей недостатков, но с удобным в некоторых случаях средствах отображения.

      В автомобилях по вашему до сих пор аналоговые стрелки сейчас?
      • +1
        Стрелки — это изначально аналоговый способ отображения. Да это наглядно, но это не точно. Автомобильная промышленность — для меня загадка. У меня в голове много вопросов по ним, на которые есть очевидные ответы, но производители автомобилей продолжают «тупить». Например почему, только в машинах от 20к $ появляются варианты с цифровым спидометром (семисегментные цифры вместо стрелок). Бортовой компьютер — это же копейки, а ставят только в машины от 12к $. Про двигатели я не могу сдержаться. Почему последовательные гибриды в 3! раза дороже обычных сложных ДВС?

        Вот так и со многими устройствами. Используем не по назначению.
        • +1
          Стрелка удобна тем, что мельком глянул и что-то ясно, она отвечает на вопросы типа: «обороты большие или низкие», «бак полон или пуст», как с механическими часами. Но когда необходимо ответить на вопрос «насколько бак пуст», «когда будет превышение допустимого лимита» — тут поможет только цифра. Еще стрелки очень по стимпанковски, такой себе винтаж.

          USB-интерфейс — до лучших времен — стрелки рулят.
          • +1
            Кроме того некоторые величины достаточно быстро изменяются. Например, обороты двигателя: нажали педаль — стрелка резко дернулась, отпустили, достаточно быстро сползла обратно. А теперь представьте как бы это выглядело на семисегментнике: либо быстро изменяющиеся цифры, которые нельзя разобрать, либо медленное обновление, не отображающее состояние двигателя в данный момент.
            • 0
              Абсолютно согласен. Стрелка очень наглядно отображает скорость изменения какого бы то ни было значения. В случае с цифровым индикатором — пришлось бы делать еще один для отображения скорости изменения значения.
        • +1
          Людям редко нужна цифровая точность в реальном времени. Если нужны точные цифры, как правило они анализируются сильно позже, чем непосредственный момент измерения. Если же нужно быстро оценить величину, стрелка куда удобнее, т.к. можно даже не вчитываться, на какое именно число она указывает, а сделать примерную оценку просто по ее положению.
          • 0
            Полностью согласен. Но, лично я, быстрее анализирую двухзначное число. Мой первый комментарий был просто по поводу восхищения путей человека вокруг одних и тех же проблем.
        • 0
          Это для тех, кто знает реальную цену вещей загадки, а для всех остальных бортовой компьютер и т.п. — это понты. Автозапчасти — это вообще сплошной развод: одна и та же деталька на авторынке может стоять в разы дороже такой же в магазине радиодеталей.
        • 0
          Вы сидели за рулем автомобиля с цифровыми приборами?

          Оценивая стоимость автомобиля, вы не учитываете затрат на разработку гибридной технологии в целом и конкретной модели в частности, на которую уходят не малые деньги, в отличии от разработки новой модели с ДВС. Не учитываете, то что нет массовости производства гибридов, что так же увеличивает цену. Не учитываете стоимость производства новых компонентов, рабочий цикл производства которых не настолько оптимизирован, как производство одних и тех же деталей(ну, с небольшими изменениями) в течении последних лет 20.
          • –1
            Именно за рулём — нет, но был рядом. Это была Mazda 6. И приборы там были наиудобнейшие.

            Насчёт ваших аргументов по цене — это было правдой как раз 20 лет назад. Сейчас это не проблемы, т.к. уже серийно выпускаются много автомобилей от разных производителей. Знаете в чём проблема — они просто хотят сделать на этом много денег. Вы скажите это Sony, что они не учитывали труд разработки PlayStation 3 продавая её по себестоимости деталей. Просто одни хотят денег много, другие мало. В автомобилестроении все ужасно много хотят денег.
            • 0
              Вы почему-то умолчали о том, что игра на пс3 стоят 10 процентов от стоимость приставки, это сильно далеко за рамками себестоимости BD.
              • 0
                Обновил информацию — 25 проц от стоимости приставки.
  • 0
    Не так давно купил гигрометр, в котором влажность рассчитывается из таблицы, относительно температур 2-х термометров — сухого и влажного. Старенький такой, еще советский… Но через неделю надоело каждый раз 10 секунд стоять перед таблицей с осмыслением уровня влажности. Ну и также воду заливать в колбу каждых 2 дня. Теперь хочу электронный :).
    • 0
      Такой прибор называется психрометр.
      • 0
        Кстати, видел электронный датчик работающий по тому же принципу на основе двух датчиков типа DS1820 или чего-то подобного.
  • 0
    На полках супермаркетов оказалось достаточное количество устройств измеряющих температуру и влажность — цена до 50$, давление и статистика за сутки до 100$, если есть желание сделать самому — могу посоветовать дешевые но удобоваримые цифровые датчики.
    • 0
      Не спрашивайте, сразу советуйте. Желательно указать тип интерфейса и примерную цену.
      • 0
        DHT11, DHT22 — температура/влажность, DS18B20 — температура — цифровые датчики шина one-wire;
        HIH3610 — гигрометр, LM35 — термометр, — хорошие и подороже, на выходе напряжение.
        • 0
          К этому еще можно добавить BMP085 — датчик давления и температуры.

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