| Ваш IP: 3.235.74.184 | Online(55) - гости: 24, боты: 31 | Загрузка сервера: 0.76 ::::::::::::

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

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

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

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

  • Подключение LCD1602 по I2C к Ардуино

    Подключение LCD1602 по I2C к Ардуино

    I2C модуль на базе микросхем PCF8574 позволяют подключить символьный дисплей 1602 к плате Arduino всего по двум проводам SDA и SCL (А4 и А5), что дает возможность не использовать цифровые выходы Arduino при подключении дисплея. Подключение  I2C модуля к дисплею 1602 очень простое, установите модуль как показано на фото и …Подробнее...
  • Регуляторы мощности

    Регуляторы мощности

    Cхема первого варианта регулятора позволяет регулировать мощность в нагрузке рассчитанной на сетевое напряжение 220В, от 5 до 97..99% номинальной мощности. КПД уст-ва не менее 98%. Регулирующие элементы 2-а тиристора включенных последовательно нагрузке, изменение мощности происходит изменением угла открывания тиристоров. Изменение угла открывания тиристоров обеспечивается однопереходным транзистором V4. С1 соединен с …Подробнее...
  • Три простых УМЗЧ

    Три простых УМЗЧ

    1. Усилитель при Uпит = 12В развивает мощность до 3 Вт при Rн=4 Ом. Чувствительность 50 мВ, диапазон при неравномерности 6 дБ 50…16000кГц, КНИ не более 1% при номинальной выходной мощности. 2. Усилитель при питании 12В развивает мощность до 5Вт, при этом КНИ не более 0,35%, а диапазон рабочих частот …Подробнее...
  • Чувствительный индикатор скрытой проводки на микросхемах

    Прибор состоит из двух узлов: усилителя напряжения переменного тока на DA1 и генератора колебаний звуковой частоты на DD1.1. При расположении антенны WA1 вблизи от токонесущего провода наводка промышленной частоты усиливается DA1, в результате чего зажигается светодиод HL1. Это же выходное напряжение DA1, пульсирующее с частотой 50 Гц, запускает генератор звуковой …Подробнее...
  • Импульсный стабилизатор напряжения на L4960

    Импульсный стабилизатор напряжения на L4960

    На ИМС L4960 можно собрать простой но достаточно мощный импульсный стабилизатор напряжения. Выходное напряжение может находится в пределах от 5,1 В до 40В при выходном токе до 2,5 А. Входное напряжение может достигать 50 В. ИМС L4960 имеет встроенную защиту по току и перегреву, КПД до 90%. Мощность рассеивания с радиатором — 15 …Подробнее...