| Ваш IP: 44.197.197.23 | Online(45) - гости: 7, боты: 38 | Загрузка сервера: 1.03 ::::::::::::

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

Комментарии

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

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

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

  • MCP9800/1/2/3 — высокоточный цифровой датчик температуры

    MCP9800/1/2/3 — высокоточный цифровой датчик температуры

    Высокоточный цифровой датчик температуры MCP9800/1/2/3 компании Microchip Technology Inc выпускается в миниатюрных корпусах SOT-23-5, MSOP-8 и SOIC-8. Может работать с разрешением 9, 10, 11 и 12 бит. Имеет небольшой рабочий ток порядка  200 мкА. Работает в диапазоне температур от -55°C до +125°C. Основное назначение — измерение температуры окружающей среды. Основные …Подробнее...
  • Предварительный УНЧ с регулировкой тембра

    Схема выполнена на сдвоенном ОУ TL072. На А1.1 сделан предварительный усилитель с коэф. усиления заданным отношением R2\R3. R1-регулятор громкости. На ОУ А1.2 выполнен активный трех полосовой мостовой регулятор тембра. Регулировки осуществляются переменными резисторами R7R8R9. Коэф. передачи этого узла 1. Наряженные питания предварительного УНЧ может быть от ±4В до ±15В Литература …Подробнее...
  • Микромощный УМЗЧ на TDA7050

    Микромощный УМЗЧ на TDA7050

    На ИМС TDA7050 можно собрать простой усилитель для наушников. Схема усилителя на TDA7050 практически не содержит внешних элементов, проста в сборке и в настройке не нуждается. Диапазон питания усилителя от 1,6 до 6 В (3-4 В рекомендуемое). Выходная мощность в стерео варианте 2*75 мВт и в мостовом варианте включения 150 мВт. Сопротивление …Подробнее...
  • ФНЧ для сабвуфера

    ФНЧ для сабвуфера

    На рисунке показана простая схема ФНЧ для сабвуфера. В схеме используется ОУ ua741. Схема достаточно проста, имеет низкую стоимость и не нуждается в настройке после сборки. Частота среза ФНЧ 80 Гц. Для работы ФНЧ для сабвуфера необходим двухполярный источник питания ±12 В.Подробнее...
  • Типы данных (Arduino)

    Типы данных (Arduino)

    При программировании Arduino применяются различные типы данных, ниже показан список основных типов данных: boleand занимает 1 байт, принимает значение от 0 до 1, логическая переменная может принимать значение true (1) b false (0) char занимает 1 байт, принимает значение от -128 до 127, хранит номер символа из таблицы символов ASII …Подробнее...