#1 04-08-2020 18:08:30

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Термостат DS18B20 + Arduino UNO + дисплей MAX7219.

Очередной градусник на Arduino UNO + восьмиразрядный дисплей на MAX7219.

#include <max7219.h>
MAX7219 max7219;
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 8 on the Arduino
#define ONE_WIRE_BUS 8
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);
void setup(void)
{
 Serial.begin(9600);
  max7219.Begin();
  max7219.Clear();
  sensors.begin();
}
void loop(void)
{ 
   String temp;
  char temp2[18];
  int y;
   sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  float tempC = sensors.getTempCByIndex(0);
  if(tempC != DEVICE_DISCONNECTED_C) 
  {
    Serial.println(tempC);
    temp = tempC;
    temp.toCharArray(temp2, temp.length());    
    max7219.DisplayText(temp2, 0); //0=left justify 1=right justify
    max7219.DisplayText(temp2, 1);
  } 
  else
  {
    Serial.println("Error: Could not read temperature data");
  }
}

Не в сети

#2 04-08-2020 18:11:11

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Термостат DS18B20 + Arduino UNO + дисплей MAX7219.

1596539396326509728833509336891.jpg

Не в сети

#3 05-08-2020 12:46:52

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Термостат DS18B20 + Arduino UNO + дисплей MAX7219.

Два градусника DS18B20, висят на восьмом порту.
Распиновка дисплея для стандартной библиотеки max7219.h следующая - DIN-12,CS-11,CLK-10. VCC соответственно +5 В, GND - земля.

#include <max7219.h>
MAX7219 max7219;//DIN-12,CS-11,CLK-10
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 8
#define TEMPERATURE_PRECISION 12//Разрешающая способность DS18B20 12/9bit
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer, outsideThermometer;
String temp;
  char temp2[18];
void setup(void)
{
  Serial.begin(9600);
 max7219.Begin();
  max7219.Clear();
  sensors.begin();
  Serial.print("Locating devices...");
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");
  Serial.print("Parasite power is: ");
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");
  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
  if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1");
  Serial.print("Device 0 Address: ");
  printAddress(insideThermometer);
  Serial.println();
  Serial.print("Device 1 Address: ");
  printAddress(outsideThermometer);
  Serial.println();
  sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
  sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);
  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(insideThermometer), DEC);
  Serial.println();
  Serial.print("Device 1 Resolution: ");
  Serial.print(sensors.getResolution(outsideThermometer), DEC);
  Serial.println();
}
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    // zero pad the address if necessary
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if(tempC == DEVICE_DISCONNECTED_C) 
  {
    Serial.println("Error: Could not read temperature data");
    return;
  }
  Serial.print("Temp C: ");
  Serial.print(tempC);
  
  temp = tempC;
    temp.toCharArray(temp2, temp.length());    
}
// function to print a device's resolution
void printResolution(DeviceAddress deviceAddress)
{
  Serial.print("Resolution: ");
  Serial.print(sensors.getResolution(deviceAddress));
  Serial.println();
}
// main function to print information about a device
void printData(DeviceAddress deviceAddress)
{
    Serial.print("Device Address: ");
  printAddress(deviceAddress);
  Serial.print(" ");
  printTemperature(deviceAddress);
  Serial.println();
}
void loop(void)
{
  // call sensors.requestTemperatures() to issue a global temperature
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures();
  Serial.println("DONE");
 // print the device information
  printData(insideThermometer);
  max7219.DisplayText(temp2, 0); //0=left justify 1=right justify
   // max7219.DisplayText(temp2, 1);
  printData(outsideThermometer);
  max7219.DisplayText(temp2, 1);
}

Не в сети

#4 07-08-2020 16:24:50

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Термостат DS18B20 + Arduino UNO + дисплей MAX7219.

Двухканальный термостат. Добавлена сигнализация потери датчиков. На порт 5, добавил мощный полевой транзистор, для управления электроклапаном на 12В.

#include <max7219.h>
MAX7219 max7219;//DIN-12,CS-11,CLK-10
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 8
#define TEMPERATURE_PRECISION 12//Разрешающая способность DS18B20 12/9bit
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer, outsideThermometer;
String temp;
  char temp2[18];
void setup(void)
{
  Serial.begin(9600);
 pinMode(5,0);
 digitalWrite(5,0);
  max7219.Begin();
  max7219.Clear();
  sensors.begin();
  Serial.print("Locating devices...");
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");
  Serial.print("Parasite power is: ");
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");
  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
  if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1");
  Serial.print("Device 0 Address: ");
  printAddress(insideThermometer);
  Serial.println();
  Serial.print("Device 1 Address: ");
  printAddress(outsideThermometer);
  Serial.println();
  sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
  sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);
  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(insideThermometer), DEC);
  Serial.println();
  Serial.print("Device 1 Resolution: ");
  Serial.print(sensors.getResolution(outsideThermometer), DEC);
  Serial.println();
}
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 11; i++)
  {
    // zero pad the address if necessary
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if(tempC == DEVICE_DISCONNECTED_C) 
  {
    Serial.println("Error: Could not read temperature data");
    return;
  }
  Serial.print("Temp C: ");
  Serial.print(tempC);
  if (tempC>=50) tone(3,100,500);//Подаём тональный сигнал на порт 3, если температура выше 50 градусов.
  temp = tempC;
    temp.toCharArray(temp2, temp.length());    
}
// function to print a device's resolution
void printResolution(DeviceAddress deviceAddress)
{
  Serial.print("Resolution: ");
  Serial.print(sensors.getResolution(deviceAddress));
  Serial.println();
}
void loop(void)
{ 
  sensors.requestTemperatures();
  float tempC = sensors.getTempC(outsideThermometer);
  if(tempC == DEVICE_DISCONNECTED_C) 
  {
    Serial.println("Error: Could not read temperature data");
    max7219.DisplayText("HHHH", 0);
    
    tone(3,1000,500);
    delay(1000);
    return;
  }
  Serial.print("Temp C: ");
  Serial.print(tempC);
//  if (tempC>=30) tone(3,100,500);//Подаём тональный сигнал на порт 3, если температура выше 50 градусов.
  temp = tempC;
    temp.toCharArray(temp2, temp.length());    
  max7219.DisplayText(temp2, 0); //0=left justify 1=right justify 
 sensors.requestTemperatures();
  float tempC1 = sensors.getTempC(insideThermometer);
  if(tempC1 == DEVICE_DISCONNECTED_C) 
  {
    Serial.println("Error: Could not read temperature data");
    
max7219.DisplayText("HHHH", 1);
    tone(3,1000,500);
    delay(1000);
    return;
  }
  Serial.print("Temp C: ");
  Serial.print(tempC1);
  if (tempC1>=50) {
    tone(3,50,500);//Подаём тональный сигнал на порт 3, если температура выше 50 градусов.
  digitalWrite(5,1);//Подаём сигнал на порт 5, если температура выше 50 градусов.
  } else digitalWrite(5,0); //Выключаем порт 5, если температура ниже 50 градусов.
  temp = tempC1;
    temp.toCharArray(temp2, temp.length());    
  max7219.DisplayText(temp2, 1);
}

Не в сети

#5 07-08-2020 16:30:59

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Термостат DS18B20 + Arduino UNO + дисплей MAX7219.

Собрал пока всё навесным монтажём. Возможно, потом разведу плату.

15967925109398515081344085567155.jpg

15967925665013601441786214995146.jpg

Не в сети

Подвал раздела

Работает на FluxBB (перевод Laravel.ru)