| Ваш IP: 3.237.186.116 | Online(24) - гости: 18, боты: 6 | Загрузка сервера: 0.41 ::::::::::::


STM32 + DS18B20 — терморегулятор (Arduino)

При использовании отладочной платы STM32 (базе микроконтроллера STM32F103C8T6) совместно с цифровым датчиком температуры можно сделать простой терморегулятор (-50…+125 °С). Информация об текущей температуре и температуре регулирования выводится на 4-х разрядный семисегментный дисплей на базе драйвера TM1637 (модуль). Управление терморегулятором осуществляется при помощи двух кнопок (+ и -), значение температуры регулирования сохраняется в энергонезависимой памяти.

#include <OneWireSTM.h>   // Библиотека Arduino_STM32-master.zip
#include <STM32_TM1637.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=403&download=1
#include <EEPROM.h>       // Входит в состав набора библиотек Arduino_STM32-master
 
STM32_TM1637 tm(PB0,PB1);// CLK, DIO
OneWire  ds(7); // A7
 
//  CLK      PB0 (TM1637)
//  DIO      PB1 (TM1637)
//  OUT      PA7 (DS18B20)
 
byte i,present = 0,type_s = 0, data[12], addr[8];
float celsius;
byte w;
int reg;
const float gis = 1.0;// гистерезис
unsigned long times;
 
void setup(){   
  Serial.begin(9600);  
  tm.brig(7); // ЯРКОСТЬ 0...7
  EEPROM.init(0x801F000,0x801F800,0x400);// 1024 byte
  pinMode(PB6,INPUT); // рег. темп. +
  pinMode(PB5,INPUT); // рег. темп. -
  pinMode(PB7,OUTPUT);// выход управления реле
  reg = EEPROM.read(10)-50;
}
 
void loop(){  
  if(millis()-times>1000){
  ///////// 18b20 //////////////////////
  if ( !ds.search(addr)) {ds.reset_search();delay(250);return;}
  ds.reset();ds.select(addr);ds.write(0x44, 1);delay(500); present = ds.reset();ds.select(addr);ds.write(0xBE); 
  for (i = 0; i < 9; i++) {data[i] = ds.read();}
  int16_t raw = (data[1] << 8) | data[0];if (type_s) {raw = raw << 3;}celsius = (float)raw / 16.0;
  //////// end 18b20 ////////////////////
  }
 
    if(digitalRead(PB6)==HIGH){reg++;w=1;times = millis();if(reg>125){reg=125;}delay(200);}    
    if(digitalRead(PB5)==HIGH){reg--;w=1;times = millis();if(reg<-50){reg=-50;}delay(200);}    
 
    if(millis()-times<3000){tm.print_float(reg,0,  0b01010000,0,0,0);}
    else{tm.print_float(celsius,1,  0,0,0,0);}
 
    if(reg >= celsius + gis){digitalWrite(PB7,HIGH);}
    if(reg <= celsius - gis){digitalWrite(PB7,LOW);}
 
    if(w==1){w=0;EEPROM.update(10, reg+50);}
  }

Второй пример скетча позволяет использовать вместо кнопок энкодер ky-040. Для регулировки температуры регулирования достаточно повернуть ручку энкодера, при этом на дисплее будет высвечиваться температура регулирования, которая при не активности энкодера смениться через 3 секунды на текущие показания температуры.

#define pinA PB6
#define pinB PB5
 
#include <OneWireSTM.h>   // Библиотека Arduino_STM32-master.zip
#include <STM32_TM1637.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=403&download=1
#include <EEPROM.h>       // Входит в состав набора библиотек Arduino_STM32-master
#include <STM32_Encoder.h> // https://rcl-radio.ru/wp-content/uploads/2020/01/STM32_Encoder.zip
  STM32_Encoder encoder(pinA, pinB);
  STM32_TM1637 tm(PB0,PB1);// CLK, DIO
  OneWire  ds(7); // A7
 
//  CLK      PB0 (TM1637)
//  DIO      PB1 (TM1637)
//  OUT      PA7 (DS18B20)
//  CLK      PB6 (ЭНКОДЕР)
//  DT       PB5 (ЭНКОДЕР)
 
byte i,present = 0,type_s = 0, data[12], addr[8];
float celsius;
int position = -999;
byte w;
int reg;
const float gis = 1.0;// гистерезис
unsigned long times;
 
void setup(){   
  Serial.begin(9600);  
  tm.brig(7); // ЯРКОСТЬ 0...7
  EEPROM.init(0x801F000,0x801F800,0x400);// 1024 byte
  encoder.begin();                                                         
  attachInterrupt(digitalPinToInterrupt(pinA),Read,CHANGE);  
  attachInterrupt(digitalPinToInterrupt(pinB),Read,CHANGE); 
  pinMode(PB7,OUTPUT);// выход управления реле
  reg = EEPROM.read(10)-50;
}
 
void loop(){  
  if(millis()-times>1000){
  ///////// 18b20 //////////////////////
  if ( !ds.search(addr)) {ds.reset_search();delay(250);return;}
  ds.reset();ds.select(addr);ds.write(0x44, 1);delay(500); present = ds.reset();ds.select(addr);ds.write(0xBE); 
  for (i = 0; i < 9; i++) {data[i] = ds.read();}
  int16_t raw = (data[1] << 8) | data[0];if (type_s) {raw = raw << 3;}celsius = (float)raw / 16.0;
  //////// end 18b20 ////////////////////
  }
 
    if(position != encoder.getPosition()){position = encoder.getPosition();
    reg = reg + encoder.getPosition();encoder.setPosition(0);position = 0;
    w=1;times = millis();if(reg>125){reg=125;}if(reg<-50){reg=-50;}}   
 
    if(millis()-times<3000){tm.print_float(reg,0,  0b01010000,0,0,0);}
    else{tm.print_float(celsius,1,  0,0,0,0);}
 
    if(reg >= celsius + gis){digitalWrite(PB7,HIGH);}
    if(reg <= celsius - gis){digitalWrite(PB7,LOW);}
 
    if(w==1){w=0;EEPROM.update(10, reg+50);}
  }
 
void Read(){encoder.readAB();}

Перед заливкой скетча в STM32 Вам необходимо ознакомиться со следующей статьей — STM32 Arduino IDE

Комментарии

Добавить комментарий

Войти с помощью: 

Случайные статьи

  • Простой лабораторный блок питания

    Как известно, для питания схем на операционных усилителях требуется двуполярный стабилизированный источник питания ±15 В. Желательно иметь в лабораторном блоке питания и регулируемый источник питания при выходном токе до 1 А. Принципиальная электрическая схема блока питания, отвечающая этим требованиям, изображена на рис.1. Снимаемое со вторичной обмотки трансформатора Т1 напряжение 14… …Подробнее...
  • Регулятор яркости ночника

    В статье представлены простые регуляторы яркости. VS1 управляется динистором VD1. При каждой полу волне сетевого напряжения С1 заряжается через R1. Когда напряжение на С1 подымается до напряжения включения VD1, он перейдет в открытое состояние. VS1 откроется, а С1 разряжается через динистор и управляющий вход тиристора. Изменяя сопротивление R1, меняем время …Подробнее...
  • Усилитель для постоянного уровня сигнала

    Усилитель для постоянного уровня сигнала

    2N3819 Отечественный аналог ОУ 741 К140УД7, 2N3819 аналог КП307Б Данный усилитель обеспечивает постоянный уровень выходного сигнала при значительном изменении входного. ОУ используется как усилитель постоянного тока усиление которого зависит от соотношения R2/R1 и делителя напряжения на R4 и сопротивления полевого транзистора. Транзистор играет роль резистора в данной схеме, его сопротивление …Подробнее...
  • Узел управления электровентилятором

    Схема узла управления электровентилятором рассчитана на питание от напряжения 12В. В течении каждого включения вентилятор работает 5 секунд, а временной промежуток между включениями может быть до 35 секунд. Этот промежуток выбирается переключателем S1. Описание: мультивибратор на D1.1 D1.2 вырабатывает импульсы частотой 0,2Гц(5с), эти импульсы поступают на счетчик-дешифратор D2. Счетчик считает …Подробнее...
  • Секундомер на Arduino

    Секундомер на Arduino

    Секундомер выполнен на основе Arduino Nano (Uno), показания секундомера выводятся на индикатор 1602. На индикатор выводятся показания часов (до 24), минут, секунд и десятые доли секунды. Секундомер содержит два секундомера управляемые одной кнопкой, алгоритм работы секундомера следующий: При первом нажатии на кнопку происходит запуск первого секундомера (1 строка индикатора) Второе …Подробнее...