Метеостанция на stm32

Метеостанция на STM32

В данной статье пойдет речь, об одной из разновидностей метеостанций, построенной на основе платы miniSTM32, с добавкой внешней периферии: датчики температуры, влажности, давления. В основу работы метеостанции положена работа с ОС реального времени типа FreeRTOS.

Идея собрать данную метеостанцию тревожила меня давно, покупка красивых и навороченных уже готовых метеоприборов меня как-то не утешала. Да и какой радиолюбитель не хочет построить что-то свое, открыть для себя новые горизонты, познать новую страничку в электроники, итак, начнем.

Основные функции:

  • Возможность отображения текущего времени (крупный шрифт);
  • Возможность отображения текущей даты и дня недели (маленький шрифт);
  • Установка времени, календаря;
  • Привязка календаря к Григорианской дате и Юлианскому дню, учет этих значений для автоматической коррекции крайних дней в месяце;
  • Работа с Touchscreen, входящий в состав платы LCD дисплея;
  • Минимальный набор кнопок для настройки календаря, использующих Touchscreen;
  • Подпитка регистров RTC для продолжения хода часов при кратковременном отключении питания прибора;
  • Измерение и отображение температуры в помещении (только положительная до +45 град) и на улице (от -40 до +40 град);
  • Вывод температуры на улице и в помещении в два разных графических окна;
  • Просчеты максимальной, минимальной и текущей температуры за последние двое суток;
  • Измерение влажности в помещении(20-100%), вывод в отдельное графическое окно с подсчетом минимальной и максимальной за последние двое суток;
  • Измерение атмосферного давления и его вывод в отдельное графическое окно(710-790 мм.рт.ст.). Просчеты минимального, максимального и текущего за последние двое суток;
  • Возможность автоматического изменения яркости дисплея при изменении окружающей яркости (режим день-ночь);
  • Возможность автоматического перехода между графическими окнами, при приближении к прибору человека (датчик инфракрасного излучения, пироэлектрический датчик);
  • Питание прибора от внешнего нестабилизированного источника, напряжением +5 вольт;

И как всегда, после определения основных функций встает задача реализации. Но так как с платой вроде бы все определено, это готовая плата miniSTM32 с установленным на ней контроллером STM32F103RBT6 и внешней минимально необходимой обвязкой, то вот с датчиками засада. Но не стоит впадать в отчаяние раньше времени, смотрим, что у нас валяется без дела и что нужно будет купить. Итак, для замера температуры будем использовать цифровые датчики, подключенные по шине 1-Wire, типа DS18B20. Датчик давления тоже давно валяется без дела, а тут для него и работка нашлась, датчик будет использоваться аналоговый, типа MPX4115AP. Датчик пироэлектрический остался от каких-то развлечений, можно его использовать, датчик типа IRA-E710ST1, но его необходимо оснастить собирающей линзой Френеля, ее прикупим, называется она PPGI0601. Фотодатчик, можно взять в принципе любой, хоть даже отщипнуть голову старому доброму транзистору МП42Б и использовать его переход эмиттер-коллектор, но мы пойдем более гуманным способом и голову откусывать никому не станем, возьмем то, что ждет своего «звездного часа» — это датчик BPW20RF . Ну и наконец, остался у нас датчик влажности. Раньше как-то сталкиваться с ними не приходилось, по столу не валяются, в закромах не прячутся, будем покупать. Не дешевое это занятие скажу я вам. Так как по предварительной прикидке все цифровые порты микроконтроллера заняты, остается по меньшей мере пара GPIO, придется смотреть в сторону аналогового датчика влажности. Итак по цене и доставаемости был взят вот этот: HIH-4000-004.

Ну что же датчики, контроллер, экран, появилась определенность. Приступим к минимальным доработкам существующей печатной платы miniSTM32. По мере разработки основной схемы, появились дополнительные мини схемки с операционными усилителями, для съема показаний с некоторых аналоговых датчиков, Рисунок 1.


Рисунок. 1 — Эскиз принципиальной схемы устройства

  • Доработка основной схемы платы miniSTM32 сводится к тому, чтобы отпаять резисторы: R1, R2, R7, R19, согласно схемы MINI-STM32-V3 (см вложения к статье).
  • Также в плате дисплея необходимо разорвать цепь резистора R2 и R3, а левый по схеме конец резистора R3 подключить к цепи SD_CS порт PB7, обеспечив тем самым регулировку яркости(см. вложения «2.8_TFT_SCH.pdf»). В плате дисплея необходимо запаять микросхему памяти U2 — AT45DB041D-SSU для сохранения калибровочных констант Touchscreen.

На Рисунке 2 и Рисунке 3 представлено как выглядит плата основная с микроконтроллером и плата дисплея после проведения всех необходимых доработок. Далее все подключения необходимо произвести согласно эскиза схемы,Рисунок 1.


Рисунок 2. — Вид основной платы miniSTM32 после внесения доработок


Рисунок 3. — Вид платы дисплея после внесения необходимых доработок

Доработка схемы достаточна проста и не требует особенных настроек, за исключением:

  1. Порог чувствительности датчика освещенности «день-ночь» VD1, регулируется подстроечным резистором в цепи обратной связи ОУ, тем самым повышая или понижая усиление ОУ. Тем не менее, предельные пороги по чувствительности от 10-100% жестко прописаны в ПО, таким образом, подсветка экрана полностью не гаснет ночью.
  2. На ОУ DA2 собран усилитель со средней рабочей точкой, равной половине напряжения питания, а пиродатчик в свою очередь при правильном расположении умеет еще определять направление движение относительно его, но в данном ПО реализована только одна из полуосей. Если у вас возникнет необходимость использовать эту схему в других своих приборах-самоделках, можно посмотреть сигнал на резисторе R10 при движении рукой перпендикулярно чувствительной плоскости датчика влево-вправо.
  3. Вместо установленного на плате разъема под батарейку типа CR2032, я решил использовать ионистор FYD0H473ZF на 47 mF, заряжаемый от цепи 3,3V через тоограничивающий резистор, диод служит для предотвращения разрядки ионистора назад в цепь +3,3V при аварийном отключении питания.

Большинство датчиков располагаются на корпусе прибора или внутри (датчик давления), единственно удаленным датчиком является датчик температуры на улице, он размещен на конце экранированного провода длинной порядка 4-5 метров. Для соединения датчиков, находящихся на корпусе или удаленно, я использовал стерео разъемы типа JACK 3,5.

Собрав недостающие узлы к аналоговым датчикам, можно навесным монтажом или методом прорезки фольгированного стеклотекстолита канцелярским ножом, приступим к проработке программного обеспечения для нашего устройства, опираясь на функции, которые описаны в начале статьи. Для прошивки и отладки я использовал ST-Link отладчик, но если вам необходимо только прошить плату miniSTM32, то на ней уже установлен переходник USB-UART на микросхеме типа PL2302HX. Достаточно скачать утилиту Flash Loader, подключить кабель USB, и выбрав соответствующий COM-порт компьютера залить в микроконтроллер необходимое ПО.

Долго и утомительно описывать вам как работает FreeRTOS и что это такое я пожалуй не стану, есть достаточное количество уроков и статей, где об этом можно почитать у более грамотных людей в этом направлении. Скажу лишь одно, в данном приборе можно было обойтись и без нее, сделав минимальный набор функций и прерываний, сэкономив пространство в памяти, но я для себя решил, почему бы не познакомиться на этом изделии с FreeRTOS поближе, а потом уже можно придумать что-то более серьезное, на более лучшем контроллере. Возможно, кому-то пригодятся наработки и проект в целом, кто-то оценит проделанную работу по достоинству.

Как итог, немного доведя платы до ума, я убрал их в готовый корпус типа G1202В размером 111х82.5х38 мм, который вы можете увидеть на видео в конце статьи или на следующих фото:

.
Рисунок 4. — Вид основной страницы, отображение календаря


Рисунок 5. — Вид страницы отображения влажности за последние двое суток


Рисунок 6. — Вид страницы отображения давления за последние двое суток


Рисунок 7. — Вид страницы отображения температуры в доме за последние двое суток


Рисунок 8. — Вид страницы отображения температуры на улице за последние двое суток

Всем спасибо за внимание! На имеющиеся вопросы с удовольствием отвечу. Удачи в сборке …

  • Все
  • Тематические
  • Персональные

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

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

    Было несколько разработок на Atmel S51, внешнем АЦП и терморезисторе, дальше на Microchip PIC16F86, программирование этих устройств было без отладочных плат, чуда программирования было мало. Были какие-то пытки и мучения: травил платы, делал программаторы, писал в текстовом, компилировал командной строкой, прошивал 3-м средством, постоянно переставляешь микросхему с программатора в устройство. Словом Ад. Быстро надоедает, при этом на работе все в рамках одного IDE, решаешь непростые задачи, никуда не отвлекаешься.

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

    Благодаря постам (спасибо автору) и наличии STM32L-Discovery приступил к реализации.

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

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

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

    В выше указанной статье упоминался датчик влажности воздуха HIH3610, хороший цифровой датчик, но весьма не бюджетный. Был приобретен на порядок дешевле датчик влажности HCH1000 и барометрический датчик HSF1000. 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 происходит так:

    Проблема: при сбросе сбрасывался и RTC. Фрагмент кода взятый из демонстрационного примера что-то делал с LSE — этим и сбрасывался RTC.
    Чтение данных:

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

    Подключение цифрового датчика температуры DS18B20
    Благодаря статьям Stm32 + 1-wire + DMA (продолжение) и Stm32 + 1-wire + DMA добавлена библиотека onewire.c но для процессора STM32L152 инициализация портов выглядит немного по-другому:

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

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

    Вычислить частоту оказалось не трудно STM32L152 имеет несколько таймеров которые могут работать в режиме захвата параметров PWM сигнала. Подробо здесь .
    Отличием оказалось, как и в случае с one-wire конфигурация портов:

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

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

    Метеостанция на stm32

    Часы и погодная станция на STM32F103

    Автор: TripleKill
    Опубликовано 09.06.2021
    Создано при помощи КотоРед.

    Идея

    Когда-то давно я заказал на алике беспроводной термометр. Датчик размещается за окном, а блок с дисплеем устанавливается в любом удобном месте квартиры, и больше не нужно бегать к окну для того, чтобы узнать, насколько снаружи жарко или холодно. Чуть позже дома появился гигрометр. За всем этим было интересно наблюдать, но были и недостатки: ночью без света показания было невозможно прочитать и, кроме того, батарейки периодически садились. Постепенно родилась идея о некоем универсальном устройстве, которое бы показывало и температуру, и влажность, и читалось бы в темноте…

    Конструкция

    Для упрощения разводки платы было принято решение по возможности использовать готовые модули. Кроме того, там и собственные ошибки разгребать не придется. В итоге состав периферии получился такой:
    — модуль датчика температуры/влажности DHT22 на плате, с уже припаянным фильтрующим конденсатором и подтягивающим резистором;
    — датчик давления воздуха BMP180 (завалялся);
    — модуль часов на DS3231; кроме самой микросхемы там распаяны резисторы подтяжки I2C, держатель батарейки, а еще есть EEPROM;
    — копеечный модуль приемника на 433 МГц – RX470;
    — дисплейный модуль 1.8” с драйвером ILI9225B и разрешением 176х220.
    В качестве контроллера был выбран STM32F103T8U6. У него маленький QFN-корпус, который вполне паяется феном. Выводов и интерфейсов для заявленных целей тоже хватает.

    На плату с контроллером как на ардуино надевается модуль с DS3231, модуль приемника впаивается с помощью угловой «гребенки», остальные устройства могут либо также подключаться через «гребенки» с шагом 2,54 мм, либо припаиваться проводами для удобного размещения в корпусе.
    На фото ниже показана получившаяся плата.

    Это первая ее версия, поэтому есть «допайки», в файл платы они уже внесены. Как обычно, контроллер с обвязкой и SWD-интерфейсом выполнены в виде отдельной группы для возможности повторного использования. Электроника постоянно мельчает, вот и здесь в качестве фильтрующих конденсаторов по питанию МК применен типоразмер 0603, а на выводы кварца установлены конденсаторы 0402. Тонким жалом и пинцетом вполне паяются.
    Помимо внешнего 5-вольтового питания предусмотрено подключение и зарядка литиевого аккумулятора. Если вдруг в доме вырубят свет, устройство продолжит функционировать. Конкретное время зависит от емкости аккумулятора. Потребление по 3,3 В получается около 120-130 мА.

    Код и вывод на экран

    Когда речь заходит о TFT-дисплеях и выводе на них более-менее читаемой информации, целесообразно воспользоваться каким-нибудь известным шрифтом и перевести его в массив точек, который в будущем и будет отправляться контроллеру дисплея. Возможно, я плохо искал, но так и не нашел в сети программы, которая бы могла сформировать массив точек из изображения символа на экране. Либо находились программы, в которых нужно было самому рисовать по клеткам, либо такие, которые мозголомно сжимали массив, в общем, я решил набросать свою простую программу, которая бы разглядывала изображение поточечно, выдавала ширину получившегося изображения и, собственно, массив для отрисовки.

    С помощью программы было сформировано несколько массивов для разных шрифтов и размеров шрифта. Массивы содержат только необходимые для вывода символы, поэтому процедуры вывода информации для разных типов выводимой информации различаются. Время выводится крупными цифрами, а дата и все остальное – мелкими. Если вдруг кому пригодится — программа приложена к статье. Сделано в Visual Studio 2012.

    Дисплейный модуль подкинул небольшой сюрприз. На алике был указан контроллер ILI9225, а на деле в дисплее был ILI9225B, пришлось потратить определенное время, чтобы это раскопать. Работа с тем и другим схожа, но определенные отличия есть.

    Про взаимодействие с DHT22, DS3231 и BMP180 сказать нечего – примеров в сети полно. Для работы с BMP180 нашлась даже целая библиотека.

    А вот про прием данных от беспроводного датчика температуры скажу. Особо нового ничего нет – передача нулей и единиц организована с помощью разных длительностей импульсов. Температура в той модели, что есть у меня, закодирована в инверсном коде, в десятых долях градуса цельсия, со смещением в 400 единиц. Т.е. датчик измеряет температуру до -40 °С, и это будет соответствовать нулевому коду. Модуль RX470 оснащен автоматической настройкой уровня приема, поэтому если внешний передатчик молчит, модуль выдает шум. В датчике температуры это предусмотрено, поэтому посылка начинается с байта, состоящего целиком из нулей – чтобы приемник настроился. Контроллер складывает в массив только те длительности импульсов, которые соответствуют длительности нуля или единицы с определенным допуском. Если попадается импульс с длительностью, выходящей за указанные пределы, то массив начинает заполняться с начала. Пакет считается принятым, если заполненность массива достигает определенного уровня (в моем случае 5 полных байт, т.к. всего в посылке 6, а первый частично теряется при настройке приемника). Зная длительности импульсов нуля и единицы, которые использует передатчик, общую длину посылки (реверс-инжиниринг, да, залез с осциллографом в передатчик), и опорные точки в самой посылке (бит, с которого начинается значение температуры), можно адаптировать код под любой датчик температуры.

    Значения давления и влажности, из-за того, что они скачут, «заинертизированы», и вычисляются по формуле X’[i]= (X’[i-1]*(N-1)+X[i])/N, где X’- значение, выводимое на экран; N – величина, задающая усреднение. Для влажности она взята равной 5, для давления – 10.

    Все настройки сводятся к установке времени и даты. В конструкции предусмотрен 5-позиционный переключатель и одна кнопка подтверждения. Нажатием на центр переключателя вызывается режим настройки, при этом корректируемое число подкрашивается красным. Влево-вправо осуществляется перемещение между числами, вверх-вниз – изменение значения. Кнопкой подтверждения – запись измененной величины в память, при выделение сдвинется на соседнее число. При переходе кнопками влево-вправо без нажатия кнопки подтверждения внесенные изменения не будут записаны в память. Итоговые изменения отобразятся при выходе из режима редактирования (по повторному нажатию на центр 5-позиционного переключателя).

    Что в итоге оно умеет

    Итоговый перечень отображаемой информации таков:
    — время (чч:мм:сс);
    — дата (дд-мм-гг + день недели);
    — температура и влажность внутри помещения одной строкой;
    — температура, принимаемая от беспроводного датчика (справа отображается время с момента последнего обновления);
    — атмосферное давление в мм.рт.ст.;
    — график изменения давления с указанием минимума и максимума (полный график – около 30 часов, один пиксель соответствует 15 минутам по времени; первый замер в начале каждых суток обозначается небольшим красным квадратом).

    Digitrode

    цифровая электроника вычислительная техника встраиваемые системы

    • Вычислительная техника
      • Микроконтроллеры микропроцессоры
      • ПЛИС
      • Мини-ПК
    • Силовая электроника
    • Датчики
    • Интерфейсы
    • Теория
      • Программирование
      • ТАУ и ЦОС
    • Перспективные технологии
      • 3D печать
      • Робототехника
      • Искусственный интеллект
      • Криптовалюты

    Чтение RSS

    STM32F103C8 и датчик температуры и влажности DHT11: принцип работы, схема подключения, код

    DHT11 – это датчик температуры и влажности, который, как следует из названия, используется для измерения температуры и влажности воздуха в конкретной среде или в замкнутом пространстве. Датчик обычно используется для мониторинга параметров окружающей среды во многих приложениях, таких как сельское хозяйство, пищевая промышленность, больницы, автомобили, метеостанции и т. д.

    Датчик может измерять температуру от 0 °C до 50 °C с точностью до 1 °C. Он обычно используется в контролируемых средах, таких как системы вентиляции тепла, камеры температуры и т. д. для контроля температуры и принятия корректирующих мер. Диапазон измерения влажности составляет от 20% до 90% с точностью до 1%. Влажность указывает на количество водяного пара, присутствующего в воздухе. Значение влажности должно поддерживаться в контролируемом диапазоне во многих случаях, например, при производстве и хранении чайных порошков в помещении должна поддерживаться правильная влажность, иначе чай потеряет свой вкус и запах. Уровень влажности в жилых помещениях также должен поддерживаться в комфортных пределах. Идеальное значение влажности для максимального комфорта составляет от 50% до 65%. В данном примере мы узнаем, как связать популярный датчик температуры и влажности DHT11 с микроконтроллером STM32.

    Прежде чем начать процедуру сопряжения датчика с микроконтроллером, давайте немного узнаем о датчике DHT11. Как обсуждалось ранее, датчик DHT11 используется для измерения температуры и влажности. Датчик оснащен встроенным NTC-сенсором для измерения температуры. Он имеет встроенный 8-битный микроконтроллер для вывода значений температуры и влажности в виде последовательных данных по однопроводному протоколу. Это означает, что датчик имеет только один вывод данных, через который можно считывать значения температуры и влажности, тем самым сохраняя выводы со стороны микроконтроллера. Датчик также откалиброван на заводе-изготовителе и, следовательно, легко взаимодействует с другими микроконтроллерами. Его внешний вид:

    Vcc – это питание от 3,5 до 5,5 В, Data – линия вывода температуры и влажности, GND –заземление.

    Полная принципиальная схема подключения DHT11 к микроконтроллеру STM32 приведена далее.

    Как вы можете видеть, мы использовали интерфейсный модуль I2C для подключения ЖК-модуля к STM32. Это делает соединения простыми и еще больше уменьшает количество выводов, используемых на стороне контроллера. Однако, если у вас нет этого модуля, вы также можете напрямую подключить ЖК-дисплей STM32, но затратив больше выводов. Если у вас есть интерфейсный модуль, то принцип соединений между последовательным интерфейсным модулем I2C (с ЖК-дисплеем 16X2) и STM32F103C8 следующий:

    VCC 5V
    GND GND
    SDA PB7
    SCL PB6

    Аналогичным образом схема соединений между STM32F103C8 и датчиком DHT11 следующая:

    VCC 5V
    GND GND
    Data PA1

    Вся установка может питаться от USB-порта платы STM32 от ноутбука или какого-либо другого устройства. Теперь, когда наше оборудование готово, давайте перейдем к части программирования, что будем осуществлять с помощью среды Arduino IDE.

    Мы должны написать программу для считывания значения температуры и влажности с датчика DHT11 и отображения его на ЖК-модуле. Здесь ЖК-дисплей подключен через адаптер I2C, поэтому мы сначала найдем адрес I2C этого адаптера для связи с ЖК-дисплеем.

    Из принципиальной схемы видно, что выводы PBM и PB7 I2C STM32F103C8 связаны с выводами SCL и SDA модуля последовательного интерфейса I2C. Чтобы найти адрес модуля последовательного интерфейса I2C, нам нужно найти доступные адреса. Сначала проверьте, установлен ли пакет STM32 для Arduino IDE. Программа сканирования подключенного устройства I2C представлена в примерах (В Arduino IDE: Files-Examples-Wire-I2C scanner wire). Перед этим выберите плату в Tools- Board-Generic STM32F103C8 Series, как показано ниже.

    После этого загрузите код на STM32F103C8 и откройте последовательный монитор.

    Запишите адрес I2C ЖК-дисплея, в данном случае это 0x27.

    Теперь, когда мы знаем адрес I2C, нам нужно загрузить библиотеку для связи с ЖК-дисплеем через I2C. Библиотеку ЖК-дисплея I2C можно скачать по этой ссылке: https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library. После загрузки zip-файла установите библиотеку I2C LCD в Arduino IDE с помощью sketch-import library.Эту библиотеку также можно использовать с платами Arduino для связи с модулями ЖК-дисплея I2C.

    Аналогично, для считывания последовательных данных с датчика DHT11 мы будем использовать библиотеку DHT11. Загрузите библиотеку в виде файла ZIP (https://github.com/adafruit/DHT-sensor-library) и после загрузки установите библиотеку DHT в IDE Arduino с помощью sketch-import. Опять же, эта же библиотека может быть использована с платами Arduino.

    Предназначенный для связи STM32 и DHT11 код программы с комментариями следующий:

    Как только ваше оборудование и код будут готовы, просто загрузите программу для вашего оборудования, и вы должны заметить, что ваш ЖК-дисплей отображает экран приветствия, а затем значения температуры и влажности в реальном времени, как показано ниже.

    Если на вашем дисплее ничего не отображается, вы можете проверить настройку потенциометра контрастности на задней панели модуля I2C. Можно попытаться варьировать свою комнатную температуру с помощью кондиционера, и в результате можно обнаружить, что значение датчика также соответственно будет меняться. У кондиционера также есть возможность измерять комнатную температуру, и, как вы можете видеть на изображении ниже, пульт отображает температуру в помещении 27 °C, а наш датчик также отображает 27,3 °C на ЖК-дисплее.

    Подключение DHT11 и DHT22 к STM32F103C8T6

    Программная реализация опроса датчика температуры DHT11 (DHT22) с помощью микроконтроллера STM32F103.

    Описание датчиков DHT11 и DHT22.

    Датчики температуры DHT11 измеряет температуру в диапазоне от 0 до 50 °С с погрешностью ±2 градуса и влажность от 20 до 90% с точностью ±5%.

    Датчик DHT22 имеет диапазон измерения температуры от -40 до 80 °С с погрешностью 0.5 и влажности от 0 до 100% с точностью ±2% (максимум 5%).

    Оба датчика имеют одинаковую распиновку и схожий протокол передачи данных, по этому я решил их объединить в одну статью.

    Типичная схема подключения из datasheet DHT11.

    Датчики имеют 4 вывода:
    1 питание 3.3-5.5V (в DHT11 заявлено минимум 3.5V но у меня он работает от 3.3)
    2 данные
    3 не используется
    4 земля

    Процесс взаимодействия с DHT11 и DHT22

    Всего датчик передает 40 бит данных старшим битом вперед. 8 бит — целая часть влажности, 8 бит дробная часть влажности, 8 бит целая часть температуры, 8 бит дробная часть температуры и 8 бит контрольная сумма.

    Контрольная сумма это сумма всех 4 байт. Для проверки правильности переданных данных нужно сложить 4 первых байта в переменной типа uint8 и сравнить их с 5 байтом. Я написал в uint8 потому, что может получится число больше чем 1 байт, и что бы не делать лишних манипуляций и не расходовать попросту память лучше сразу использовать uint8.

    Ниже приведена диаграмма таймингов.

    Я нашел отличие лишь в стартовом сигнале. Для DHT11 минимальное время прижатия к 0 заявлено 18 мс., а для DHT22 время 1 мс. Инициализация датчика от МК исчисляется в миллисекундах, а передача сигнала присутствия и сами данные от датчика в микросекундах.

    И так, как же получить данные от датчика? Очень просто.

    На линию данных (2 пин) датчика подается питание.
    Далее, для того что бы датчик начал передавать данные, нужно прижать линию данных к земле минимум 18 мс для DHT11 и 1 мс для DHT22. После этого нужно отпустить питание и ждать, когда датчик сообщит о своем присутствии.

    Если датчик подключен и все хорошо, то через несколько мкс линия данных будет прижата к нулю на 80 мкс, потом отпущена еще на 80 мкс. После этого датчик будет передавать данные по 1 биту.

    Передача бит данных состоит из прижатия линии к земле на 50 мкс и отпускании ее либо на 26-28 мкс для 0 либо на 70 мкс для 1.

    Для того чтобы определить 0 или 1 мы получили можно засекать время прижатия линии к 0, это будет 50 мкс, а дальше, если линия отпущена на время меньше этого — значит мы получили 0, если же линия отпущена на время больше чем 50 мкс — мы получили 1.

    Пример для STM32F103C8T6 получения температуры с DHT11.

    Я подключил датчик к PB6 так как пин толерантен к 5В, а так же для демонстрации варианта получения температуры как полностью программной реализацией так и с помощью таймера и DMA (но об этом в другой статье).

    Пин 2 датчика подтянут к питанию резистором 10 кОм.

    Я создал несколько макросов для упрощения переноса на другой пин, в случае необходимости.

    Настраиваем кварц на частоту 72 МГц.

    Ногу настраиваем на выход с открытым стоком (open drain) GPIO_Mode_Out_OD. Это позволит нам прижимать ногу к земле для инициализации датчика, а когда нужно — слушать датчик.

    Думаю нет смысла комментировать каждую строку.

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

    Для удобства использования полученных 40 бит я набросал вспомогательную структуру

    Функция, опроса датчика

    Думаю я расписал достаточно подробно

    Вызывать можно как то так

    Комментарии к статье: Подключение DHT11 и DHT22 к STM32F103C8T6

    Не тратьте свое время на этот код. Лучше найдите проще и без ошибок. Плюс вы задолбаетесь его исправлять, т.к. после копирования текста он вставляется в одну строку и с постоянной припиской

    Этот код уже два года работал в инкубаторе, прекрасно работает 🙂 Вывело 48 из 56 яичек 🙂 Кому не нравиться, можете не использовать))

    По поводу копирования, убрал скрипт который убивал переносы строк. Я от чистого сердца пытался помочь людям типа меня (новичкам св мк), писал код с комментариями, а кому лень даже переносы строк расставить может не тратить время.

    Расчет времени поправил по моему кварцу, все отлично работает, спасибо.

    спасиб. люба инфа — это крут. если инфу созидал , то бытие её создал.

    PureBasic — форум

    Меню навигации

    • Сайт
    • Форум
    • Участники
    • Поиск
    • Регистрация
    • Войти

    Пользовательские ссылки

    Информация о пользователе

    Вы здесь » PureBasic — форум » Программирование микроконтроллеров » STM32 — Чтение температуры со встроенного датчика

    STM32 — Чтение температуры со встроенного датчика

    Сообщений 1 страница 2 из 2

    Поделиться114.07.2016 20:10:12

    • Автор: Пётр
    • Активный участник
    • Зарегистрирован : 14.06.2009
    • Приглашений: 0
    • Сообщений: 2585
    • Уважение: [+83/-5]
    • Позитив: [+0/-0]
    • Пол: Мужской
    • Провел на форуме:
      2 месяца 1 день
    • Последний визит:
      Вчера 12:53:19

    В STM32F103C8T6 есть встроенный датчик температуры, (по видимому состоящий из двух диодов, включенных последовательно), который подключен к одному из каналов АЦП. Что-то похожее есть в некоторых моделях МК AVR.
    Датчик не калиброванный и с одной и той же прошивкой, может показывать разную температуру в различных экземплярах МК. Поэтому для точных измерений (без калибровки) он не подходит, но как пример работы с АЦП подойдет.
    В даташите написано про датчик не очень много. Это вся информация (поместилась на половине страницы даташита).

    Для расчета температуры служит формула.

    Temperature = (V_25-V_sense)/Avg_Slope + 25

    Где V_25 и Avg_Slope это данные из даташита, а V_sense — измеренное напряжение на датчике температуры. Все напряжения должны быть в вольтах. Температура будет рассчитана в градусах по Цельсию.
    После расчета данные будут выводится с МК через USB и отобраюатся в компьютерной программе. Почему так? Мне так проще, а заодно узнаем как работать с USB.

    Создаем проекты EmBitz и STM32CubeMX как писал ранее.
    Теперь в STM32CubeMX настроим периферию МК. Нужно выбрать тактовый генератор, настроить тактиование отдельных модулей МК, а так же сконфигурировать АЦП и USB.
    На вкладке «Pinout» начнем по порядку сверху вниз конфигурировать модули. Открываем раздел ADC1 и выбираем канал датчика температуры.

    Далее в разделе RCC нужно включить внешний высокочастотный резонатор.

    Дальше в разделе USB нужно включить этот модуль.

    Теперь нужно в разделе «USB Device» выбрать тип USB устройства. Нам нужен HID.

    Скриншот всех изменений, который были сделаны.

    Теперь переходим на вкладку «Clock configuration».
    Задача проста. Настроить тактирование таким образом чтобы ядро и модули МК тактировались от внешнего резонатора. На модуль USB поступала частота 48 МГц, а так же на других модулях частота на была больше или меньше допустимой (подсвечивается красным).
    Должно получится примерно так.

    Теперь переходим на вкладку «Сonfiguration», где можно настроить выбранные модули.

    Сначала настроим АЦП. Кликаем по кнопке «ADC1».
    Откроется окно. Настраиваем все также.

    Теперь кликаем по кнопке «USB_Device». Откроется окно.

    То что находится в разделе «Basic parameters» изменять не нужно — подойдут параметры по умолчанию.
    Параметр USBD_CUSTOM_HID_REPORT_DESC_SIZE это размер дескриптора HID_Report (о нем поговорим позже). Его размер в данной программе 33 байта.
    Параметр USBD_CUSTOMHID_OUTREPORT_BUF_SIZE определяет размер буфера приема данных из компьютера.

    Переходим на вкладку «Device descriptor». Настраиваем как на скриншоте.

    Сохраняем настройки нажав на кнопку OK.

    Теперь генерируем код и экспортируем его в EmBitz.

    В EmBitz открываем файл «usbd_custom_hid_if.c», находящийся в папке SourcesSrc проекта.

    В нем находим массив CUSTOM_HID_ReportDesc_FS и вставляем в него код HID дескриптора. Должно получится.

    Сохраняем файл.
    Теперь открываем файл main.c , находящийся в папке SourcesSrc проекта.
    В него нужно добавить идентификатор USB

    а также константы из даташита, для датчика температуры.

    Теперь в функции main нужно до цикла while добавить объявление переменных.

    а в цикле while, код чтения данных с АЦП, преобразования его в температуру и передачи в компьютер.

    Программа написана. Как видим, большинство кода было сгенерировано программной STM32CubeMX. Нам же понадобилось добавить HID_Report, пару переменных и констант, а также несколько строк кода, считывающих температуру с АЦП и передающих ее в компьютер.
    Программа написана так, что работает с компьютерной программой из другого проекта.

    Судя по начальной температуре, и по той что измерена через несколько минут работы, температура кристалла на 8 градусов выше температуры воздуха.