1

Тема: max6675 + 2x18b20 >> 3xTM1637

Термометр

3 индикатора TM1637
1 датчик ХА max6675
2 датчика DS18b20

Вывод температуры термопары от 0 до 1000 гр Цельсия
Вывод температуры датчиков DS18B20 от -55 до 125 гр. Цельсия

Данный контент доступен только зарегистрированным пользователям.
Данный контент доступен только зарегистрированным пользователям.
Данный контент доступен только зарегистрированным пользователям.
Данный контент доступен только зарегистрированным пользователям.



#include <max6675.h>
#include <TM1637Display.h>
#include <OneWire.h>
#include <DallasTemperature.h>
 
MAX6675 temp1(2, 3, 4);// CLK,CS,SO
TM1637Display display_1(5, 6);// CLK,DIO
TM1637Display display_2(7, 8);// CLK,DIO
TM1637Display display_3(9,10);// CLK,DIO
OneWire oneWire(A0);// вход для датчиков 18b20
DallasTemperature t(&oneWire);
double t_c,t_sum,t_iz; 
int t1,t2;
uint8_t data[]{0,0,0,0};
 
void setup(){ Serial.begin(9600);
  display_1.setBrightness(3);// яркость TM1637 0-7
  display_2.setBrightness(3);// яркость TM1637 0-7
  display_3.setBrightness(3);// яркость TM1637 0-7
   t.begin(); 
   t.setResolution(10);//10 бит 
}
 
void loop(){
  ///////// max6675 //////////////////////////
  t_sum=0;
  for(int i=0;i<5;i++){t_c=temp1.readCelsius();t_sum=t_sum+t_c;delay(200);}
  t_iz=t_sum/5;
  ///////////// 18b20 
    t.requestTemperatures();
   t1 = t.getTempCByIndex(0);
   t2 = t.getTempCByIndex(1);
  /////// индикация //////////////////////////
  display_1.showNumberDecEx(t_iz,0x00,false);
  
  if(t1 < 0){t1=abs(t1);data[0] = 0x40;}else{data[0] = 0x00;}
  data[1] =  display_2.encodeDigit(t1/100);
  data[2] =  display_2.encodeDigit((t1/10)%10);
  data[3] =  display_2.encodeDigit((t1%10)%10);
  display_2.setSegments(data);
  
  if(t2 < 0){t2 = abs(t2);data[0] = 0x40;}else{data[0] = 0x00;}
  data[1] =  display_3.encodeDigit(t2/100);
  data[2] =  display_3.encodeDigit((t2/10)%10);
  data[3] =  display_3.encodeDigit((t2%10)%10);
  display_3.setSegments(data);
}

2

Re: max6675 + 2x18b20 >> 3xTM1637

Скеч работает. Осталось проверить на точном прибореhttp://forum.rcl-radio.ru/uploads/images/2019/11/7c810cb431a2ff8975f431c9a45b6e2f.jpg
http://forum.rcl-radio.ru/uploads/images/2019/11/6e466294613dd12b11d7fc348d51fc4b.jpg

3

Re: max6675 + 2x18b20 >> 3xTM1637

Ради интереса замерил температуру в морозильной камере  показания индикаторов -16,
сравнивал с бытовым уличным термометром, был приятно удивлен, показания  -16!

4

Re: max6675 + 2x18b20 >> 3xTM1637

2x18b20 достаточно точный датчик, так же если время измерения для Вас не особо важно, то измените строку
t.setResolution(10);//10 бит
на
t.setResolution(12);//12 бит (время измерения 1 сек)

Это конечно не сильно отразится на результате измерения, так как дисплей не показывает десятые и сотые доли градуса, но все же точность определенно еще больше повысится.

5

Re: max6675 + 2x18b20 >> 3xTM1637

тестировал от 20 до 80 гр., разница во всем диапазоне 1гр.
сравнивал с таким термометром. Термометр показывает на 1 гр. большеhttp://forum.rcl-radio.ru/uploads/images/2019/11/dde782cf8a0d58801a571b01fa915853.jpg

6 (2019-12-13 12:59:16 отредактировано sanj76a)

Re: max6675 + 2x18b20 >> 3xTM1637

термопара http://forum.rcl-radio.ru/uploads/images/2019/11/2f73ae25001ac84e23ed97d47bb435ec.jpg http://forum.rcl-radio.ru/uploads/images/2019/11/09f342fe1042231021f9cafc851c6908.jpg http://forum.rcl-radio.ru/uploads/images/2019/11/3bb33459c1df83707eaa8f77fc0e94f0.jpg http://forum.rcl-radio.ru/uploads/images/2019/11/df9d8dcb54129a01c16267aedcca3ede.jpg http://forum.rcl-radio.ru/uploads/images/2019/11/3efae00c5cba85e751e6865c4c5e08bc.jpg

7

Re: max6675 + 2x18b20 >> 3xTM1637

Я скажу, идеальные показания!!!
Протестил по всем диапазонам.  Привел некоторые. Проект удачный!!!
Спасибо Автору за помощь!!!

8 (2019-12-13 13:06:43 отредактировано sanj76a)

Re: max6675 + 2x18b20 >> 3xTM1637

можно еще добавить BMP280 и еще 1  TM1637, только для
показаний барометрии.
Жду BMP и TM, получу соберу и выложу.
И еще, ВМР в режиме Normal, и постоянный вывод показаний на ТМ

9

Re: max6675 + 2x18b20 >> 3xTM1637

И еще, ВМР в режиме Normal, и постоянный вывод показаний на ТМ

Что за режим Normal?

Вам выводить только давление? Купите лучше BME280, в нем еще влажность есть.

Как все купите сообщите, правка кода не займет много времени.

10

Re: max6675 + 2x18b20 >> 3xTM1637

http://www.avislab.com/blog/bme280_ru/

Нужна ток барометрия, BMP намного дешевле.
Если возможно, буду заказвать.
А возможно  на один индикатор поочереди выводить 3 параметра, от датчика BME

11

Re: max6675 + 2x18b20 >> 3xTM1637

А возможно  на один индикатор поочереди выводить 3 параметра, от датчика BME

Да, это не проблема.

12

Re: max6675 + 2x18b20 >> 3xTM1637

Почитайте статью про BME280, купите датчик работающий от 5 В
http://rcl-radio.ru/?p=66937

13 (2019-12-13 14:36:39 отредактировано sanj76a)

Re: max6675 + 2x18b20 >> 3xTM1637

Я читал это, я ваш сайт просмотрел почти весь.
вы не поняли, поочередно выводить 3 параметра ,  а показания поочередно на 1  ТМ1637

14

Re: max6675 + 2x18b20 >> 3xTM1637

Вы просто хотите добавить еще один индикатор и выводить на него поочередно показания датчика bme280? Если да, то это можно сделать, ни чего сложного в этом нет.

15 (2019-12-13 17:33:47 отредактировано sanj76a)

Re: max6675 + 2x18b20 >> 3xTM1637

да я хочу с bmp280  на 1 tm1637 выводить 2 показания, ну например по 10сек каждый параметр.
Если можно, я заказываю, вам отпишу как буду готов, затем когда закончу все, выложу.
У меня была сложность выложить видео, но это потом, как я все сделаю.

16

Re: max6675 + 2x18b20 >> 3xTM1637

Хорошо, заказывайте.

17

Re: max6675 + 2x18b20 >> 3xTM1637

MAX6675 temp1(2, 3, 4);// CLK,CS,SO
TM1637Display display_1(5, 6);// CLK,DIO
TM1637Display display_2(7, 8);// CLK,DIO
TM1637Display display_3(9,10);// CLK,DIO
OneWire oneWire(A0);// вход для датчиков 18b2

могу ли я изменить здесь подключение к ардуино,
назначить входа какие мне удобно, из за особенности монтажа.
Какие еще изменения в скече нужно делать?

18

Re: max6675 + 2x18b20 >> 3xTM1637

цифровой 18В20 подключен к аналоговому вх.
остальные к цифровым, почему

19

Re: max6675 + 2x18b20 >> 3xTM1637

Я заказал BMP280. Будут 2 параметра давление и температура

20

Re: max6675 + 2x18b20 >> 3xTM1637

sanj76a пишет:

MAX6675 temp1(2, 3, 4);// CLK,CS,SO
TM1637Display display_1(5, 6);// CLK,DIO
TM1637Display display_2(7, 8);// CLK,DIO
TM1637Display display_3(9,10);// CLK,DIO
OneWire oneWire(A0);// вход для датчиков 18b2

могу ли я изменить здесь подключение к ардуино,
назначить входа какие мне удобно, из за особенности монтажа.
Какие еще изменения в скече нужно делать?

Да, конечно.

21

Re: max6675 + 2x18b20 >> 3xTM1637

sanj76a пишет:

цифровой 18В20 подключен к аналоговому вх.
остальные к цифровым, почему

Можно так и так, я экономлю цифровые выходы

22

Re: max6675 + 2x18b20 >> 3xTM1637

max6675 + 2x18b20 + BMP280 >> 3xTM1637

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <max6675.h>
#include <TM1637Display.h>
#include <OneWire.h>
#include <DallasTemperature.h>
 
  Adafruit_BMP280 bmp; // I2C
  MAX6675 temp1(2, 3, 4);// CLK,CS,SO
  TM1637Display display_1(5, 6);// CLK,DIO
  TM1637Display display_2(7, 8);// CLK,DIO
  TM1637Display display_3(9,10);// CLK,DIO
  TM1637Display display_4(11,12);// CLK,DIO
  OneWire oneWire(A0);// вход для датчиков 18b20
  DallasTemperature t(&oneWire);
  double t_c,t_sum,t_iz; 
  int t1,t2,bmp_t,bmp_p;
  uint8_t data[]{0,0,0,0};uint8_t data1[]{0,0,0,0};
  unsigned long times;
 
void setup() {
  Serial.begin(9600);Serial.println(F("BMP280 test"));Wire.begin();
  if (!bmp.begin()) {  
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    while (1);
  }
  display_1.setBrightness(3);// яркость TM1637 0-7
  display_2.setBrightness(3);// яркость TM1637 0-7
  display_3.setBrightness(3);// яркость TM1637 0-7
  display_4.setBrightness(3);// яркость TM1637 0-7
   t.begin(); 
   t.setResolution(10);//10 бит 
}
 
void loop() {
 ///////// max6675 //////////////////////////
  t_sum=0;
  for(int i=0;i<5;i++){t_c=temp1.readCelsius();t_sum=t_sum+t_c;delay(200);}
  t_iz=t_sum/5;
  ///////////// 18b20 
    t.requestTemperatures();
    t1 = t.getTempCByIndex(0);
    t2 = t.getTempCByIndex(1);
   bmp_t = bmp.readTemperature();
   bmp_p = bmp.readPressure()/133;
   Serial.println(bmp_t);
   Serial.println(bmp_p);
  /////// индикация //////////////////////////
  display_1.showNumberDecEx(t_iz,0x00,false);
  
  if(t1 < 0){t1=abs(t1);data[0] = 0x40;}else{data[0] = 0x00;}
  data[1] =  display_2.encodeDigit(t1/100);
  data[2] =  display_2.encodeDigit((t1/10)%10);
  data[3] =  display_2.encodeDigit((t1%10)%10);
  display_2.setSegments(data);

  if(t2 < 0){t2 = abs(t2);data[0] = 0x40;}else{data[0] = 0x00;}
  data[1] =  display_3.encodeDigit(t2/100);
  data[2] =  display_3.encodeDigit((t2/10)%10);
  data[3] =  display_3.encodeDigit((t2%10)%10);
  display_3.setSegments(data);

  if(millis()-times<10000){
  data1[0] = 0x73;
  data1[1] =  display_4.encodeDigit(bmp_p/100);
  data1[2] =  display_4.encodeDigit(bmp_p/10%10);
  data1[3] =  display_4.encodeDigit(bmp_p%10%10);
  }
  if(millis()-times>10000){
  data1[0] = 0x78;
  if(bmp_t < 0){bmp_t = abs(bmp_t);data1[1] = 0x40;}else{data1[1] = 0x00;}
  data1[2] =  display_4.encodeDigit(bmp_t/10);
  data1[3] =  display_4.encodeDigit(bmp_t%10);
  if(millis()-times>20000){times=millis();}}
  display_4.setSegments(data1);

}

23

Re: max6675 + 2x18b20 >> 3xTM1637

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <max6675.h>
#include <TM1637Display.h>
#include <OneWire.h>
#include <DallasTemperature.h>
 
  Adafruit_BMP280 bmp; // I2C
  MAX6675 temp1(2, 3, 4);// CLK,CS,SO
  TM1637Display display_1(5, 6);// CLK,DIO
  TM1637Display display_2(7, 8);// CLK,DIO
  TM1637Display display_3(9,10);// CLK,DIO
  TM1637Display display_4(11,12);// CLK,DIO
  OneWire oneWire(A0);// вход для датчиков 18b20
  DallasTemperature t(&oneWire);
  double t_c,t_sum,t_iz; 
  int t1,t2,bmp_t,bmp_p;
  uint8_t data[]{0,0,0,0};uint8_t data1[]{0,0,0,0};
  unsigned long times;
 
void setup() {
  Serial.begin(9600);Serial.println(F("BMP280 test"));Wire.begin();
  if (!bmp.begin()) {  
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    while (1);
  }
  display_1.setBrightness(3);// яркость TM1637 0-7
  display_2.setBrightness(3);// яркость TM1637 0-7
  display_3.setBrightness(3);// яркость TM1637 0-7
  display_4.setBrightness(3);// яркость TM1637 0-7
   t.begin(); 
   t.setResolution(10);//10 бит 
}
 
void loop() {
 ///////// max6675 //////////////////////////
  t_sum=0;
  for(int i=0;i<5;i++){t_c=temp1.readCelsius();t_sum=t_sum+t_c;delay(200);}
  t_iz=t_sum/5;
  ///////////// 18b20 
    t.requestTemperatures();
    t1 = t.getTempCByIndex(0);
    t2 = t.getTempCByIndex(1);
   bmp_t = bmp.readTemperature();
   bmp_p = bmp.readPressure()/133;
   Serial.println(bmp_t);
   Serial.println(bmp_p);
  /////// индикация //////////////////////////
  display_1.showNumberDecEx(t_iz,0x00,false);
  
  if(t1 < 0){t1=abs(t1);data[0] = 0x40;}else{data[0] = 0x00;}
  data[1] =  display_2.encodeDigit(t1/10);
  data[2] =  display_2.encodeDigit(t1%10);
  data[3] = 0x63;
  display_2.setSegments(data);

  if(t2 < 0){t2 = abs(t2);data[0] = 0x40;}else{data[0] = 0x00;}
  data[1] =  display_2.encodeDigit(t2/10);
  data[2] =  display_2.encodeDigit(t2%10);
  data[3] = 0x63;
  display_3.setSegments(data);

  if(millis()-times<10000){
  data1[0] = 0x73;
  data1[1] =  display_4.encodeDigit(bmp_p/100);
  data1[2] =  display_4.encodeDigit(bmp_p/10%10);
  data1[3] =  display_4.encodeDigit(bmp_p%10%10);
  }
  if(millis()-times>10000){
  if(bmp_t < 0){bmp_t = abs(bmp_t);data1[0] = 0x40;}else{data1[0] = 0x00;}
  data1[1] =  display_4.encodeDigit(bmp_t/10);
  data1[2] =  display_4.encodeDigit(bmp_t%10);
  data1[3] = 0x63;
  if(millis()-times>20000){times=millis();}}
  display_4.setSegments(data1);

}

24

Re: max6675 + 2x18b20 >> 3xTM1637

дайте ссылку на библиотеку BMP280

25

Re: max6675 + 2x18b20 >> 3xTM1637

http://rcl-radio.ru/wp-content/uploads/ … Sensor.zip
http://rcl-radio.ru/wp-content/uploads/ … BMP280.zip