| Ваш IP: 3.235.75.174 | Online(26) - гости: 20, боты: 6 | Загрузка сервера: 0.38 ::::::::::::


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

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

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

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

  • Светодиодный индикатор уровня сигнала на KA2284 (AN6884)

    Светодиодный индикатор уровня сигнала на KA2284 (AN6884)

    Технические характеристики: Напряжение питани от 3,5 до 15 В Ток покоя от 7 до 10 мА Выходной ток от 7 до 10 мА Минимальное входное напряжение 50 мВ Частотный диапазон 20 — 20000 Гц Диапазон индикации 18 — 20 дБ В зависимости от уровня входного сигнала выбирают следующие номиналы резисторов …Подробнее...
  • Предварительный усилитель на TL061

    Предварительный усилитель на TL061

    На рисунке показана схема высококачественного предварительного усилителя, который обладает низким уровнем шума, низким КНИ и регулируемым коэффициентом усиления, что позволяет использовать схему как микрофонный усилитель. Регулировка коэффициента усиления от 10 до 100 осуществляется подстроечным резистором R9. Коэффициент усиления 10 рассчитан на линейный уровень входного сигнала с максимальным напряжением 800 мВ. …Подробнее...
  • Генератор для настройки радиоприемников

    Этот генератор предназначен для настройки каскадов приемников CВ и ДВ диапазонов. Генератор вырабатывает синусоидальные колебания и прямоугольные импульсы радиочастотного диапазона от 0,15 до 1,6МГц, а так же колебания синусоидальные и прямоугольные с частотой 1кГц при этом радиочастотные колебания можно промодулировать низкочастотным сигналам. В генераторе ЗЧ работает элемент DD1.1 и обмотка …Подробнее...
  • КАК РАБОТАЕТ ДИОД

    КАК РАБОТАЕТ ДИОД

    В этом выпуске вы узнаете: что такое диод, принцип действия диода, как работает диод, что такое p — n переход; что такое прямой ток диода, что такое обратный ток диода; каково внутреннее сопротивление диода; что такое вольт- амперная характеристика диода; что такое пропускное и не пропускное напряжение диода; как работает …Подробнее...
  • Датчик воды

    Датчик воды

    Применение датчика воды разнообразное, это может быть сигнализатор утечки, датчик уровня воды, индикатор полива и др. Так же датчик воды снабжен твердотельным реле S201S02 (S201S06) с помощью которого можно коммутировать устройства работающие от переменного тока электрической сети, схема датчика питается от постоянного напряжения 5В. Примечание: S201S02 замена — S201S06 600V 3A С557 …Подробнее...