Как обьеденить DS18B20 с TM1637 ?

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

Уважаемые форумчане подскажите пожалуйста как обьеденить DS18B20 c TM1637 т.е. как сделать чтобы на дисплее отображалась температура с датчика ? Заранее спасибо! (поиск в просторах особых результатов не дал):)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

без ардуины?

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

Извиняюсь с UNO R3

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

У меня получилось измерить положительную температуру но при замере в холодильнике :) дисплей не отображает отрицательной. Как поправить?

#include <TM1637Display.h>
#include <OneWire.h>
OneWire ds(9);
const int CLK = 2; 
const int DIO = 3; 
int NumStep = 0;
TM1637Display display(CLK, DIO); 
void setup() {
display.setBrightness(0x0a);
}
void loop() { 
byte data[2];
ds.reset(); 
ds.write(0xCC);
ds.write(0x44);
delay(1000);
ds.reset();
ds.write(0xCC);
ds.write(0xBE);
data[0] = ds.read(); 
data[1] = ds.read();
int Temp = (data[1]<< 8)+data[0];
Temp = Temp>>4;
display.showNumberDec(Temp);
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

Попробуйте инициировать Temp как float.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я бы разбил число на цифры и выводил по цифре. так и "-" можно выводить

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

Мне подсказали что в этой библиотеке просто нет знака минус

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

А термометр сделать хочется как быть?

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

Можно поподробнее?

bwn
Offline
Зарегистрирован: 25.08.2014

sergeyovs1980 пишет:

Мне подсказали что в этой библиотеке просто нет знака минус

Вы имеете в виду библиотеку дисплея? Очень сомневаюсь. А OneWire минус не требуется. У вас с преобразованием типов проблема.

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

bwn пишет:

sergeyovs1980 пишет:

Мне подсказали что в этой библиотеке просто нет знака минус

Вы имеете в виду библиотеку дисплея? Очень сомневаюсь. А OneWire минус не требуется. У вас с преобразованием типов проблема.

Библиотека дисплея имеет только числа 0-9 и символы A,b,C,d,E,F. Пробовал копнуть в самой библиотеке - увы мало знаний в с++.

bwn
Offline
Зарегистрирован: 25.08.2014

Это семисегментник что ли?

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

bwn пишет:

Это семисегментник что ли?

Да.Он самый

bwn
Offline
Зарегистрирован: 25.08.2014

Тогда действительно, только библиотеку рыть или свой ногодрыг писать((((

vova20081
Offline
Зарегистрирован: 08.08.2015

так можно взять другую библиотеку (у меня их 2- TM1637Display.h  TM1637.h )

 

vova20081
Offline
Зарегистрирован: 08.08.2015

в библиотеке     можно поменять стороки как надо:

const uint8_t digitToSegment[] = {
 // XGFEDCBA
  0b00111111,    // 0
  0b00000110,    // 1
  0b01011011,    // 2
  0b01001111,    // 3
  0b01100110,    // 4
  0b01101101,    // 5
  0b01111101,    // 6
  0b00000111,    // 7
  0b01111111,    // 8
  0b01101111,    // 9
  0b01110111,    // A
  0b01111100,    // b
  0b00111001,    // C
  0b01011110,    // d
  0b01111001,    // E
  0b01110001     // F
  };

 

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

vova20081 пишет:

в библиотеке     можно поменять стороки как надо:

const uint8_t digitToSegment[] = {
 // XGFEDCBA
  0b00111111,    // 0
  0b00000110,    // 1
  0b01011011,    // 2
  0b01001111,    // 3
  0b01100110,    // 4
  0b01101101,    // 5
  0b01111101,    // 6
  0b00000111,    // 7
  0b01111111,    // 8
  0b01101111,    // 9
  0b01110111,    // A
  0b01111100,    // b
  0b00111001,    // C
  0b01011110,    // d
  0b01111001,    // E
  0b01110001     // F
  };

 

 

0b01000000 // - пробывал та же песня!

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

Не в минусе дело а в том что библиотека не понимает отрицательных чисел! Я правильно понимаю ?

bwn
Offline
Зарегистрирован: 25.08.2014

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

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

jeka_tm пишет:

я бы разбил число на цифры и выводил по цифре. так и "-" можно выводить

 

Можно поподробнее?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
msg[1] = K/10;
msg[2] = K%10;
char c4=char(48+temp%10); 
  temp/=10;
  char c3=char(48+temp%10);  
  temp/=10;
  char c2=char(48+temp%10);  
  temp/=10;
  char c1=char(48+temp%10); 

 

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

jeka_tm пишет:

msg[1] = K/10;
msg[2] = K%10;
char c4=char(48+temp%10); 
  temp/=10;
  char c3=char(48+temp%10);  
  temp/=10;
  char c2=char(48+temp%10);  
  temp/=10;
  char c1=char(48+temp%10); 

 

Я извиняюсь но что такое

msg[1] = K/10;
msg[2] = K%10;

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

в си есть два вида деления. / это после деления остается часть до запятой, % после запятой. своими словами так. как правильно звучик не помню. но с помощью этих делений можно разделить на цифры как во 2 коде разделяется число на 4 цифры, 48 + не обращай внимание , это для кодировки в коде откуда взят этот кусок

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

jeka_tm пишет:

в си есть два вида деления. / это после деления остается часть до запятой, % после запятой. своими словами так. как правильно звучик не помню. но с помощью этих делений можно разделить на цифры как во 2 коде разделяется число на 4 цифры, 48 + не обращай внимание , это для кодировки в коде откуда взят этот кусок

Вот так?

#include <TM1637Display.h>
#include <OneWire.h>
OneWire ds(9);
const int CLK = 2; 
const int DIO = 3; 
int NumStep = 0;
TM1637Display display(CLK, DIO); 
void setup() {
display.setBrightness(0x0e);
}
void loop() { 
byte data[8];
ds.reset(); 
ds.write(0xCC);
ds.write(0x44);
delay(1000);
ds.reset();
ds.write(0xCC);
ds.write(0xBE);
data[0] = ds.read(); 
data[1] = ds.read();
int temp = (data[1]<< 8)+data[0];
temp = temp>>4; 
char c4=char(temp%10);
char c3=char(temp%10);
char c2=char(temp%10);
char c1=char(temp%10);
display.showNumberDec(char(temp));
}


 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

вместо char byte лучше использовать. во вторых забыл делить на 10 как в 2-4-6 строках. да и вывод неправильный вроде на дисплей

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

jeka_tm пишет:

вместо char byte лучше использовать. во вторых забыл делить на 10 как в 2-4-6 строках. да и вывод неправильный вроде на дисплей

Подскажите пожалуйста как надо а то у меня сейчас взрыв мозга будет!

byte c4=byte(temp%10); 
temp/=10;
byte c3=byte(temp%10);  
temp/=10;
byte c2=byte(temp%10);  
temp/=10;
byte c1=byte(temp%10); 
display.showNumberDec(byte(temp));

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

в коде ты разделил число из 4 цифр на 4 отдельные цифры. их выводи по одной. эти цифры хранятся в с1 с2 с3 с4

например 1237. ты разделил в с1=1, с2=2, с3=3, с4=7

это пример. у тебя в индикаторе 4 цифры. и тут 3 варианта. 1 цифра на индикаторе это знак, остальные 3 это температура. если температура не будет превывать 99.9 градусов то можно выводит с десятыми, если больше то 2 вариарт. без десятых от 0 до 125 без десятых, или до 99,9 с десятыми а после без десятых. 3 вариант.... короче как угодно можно комбинировать

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

jeka_tm пишет:

в коде ты разделил число из 4 цифр на 4 отдельные цифры. их выводи по одной. эти цифры хранятся в с1 с2 с3 с4

например 1237. ты разделил в с1=1, с2=2, с3=3, с4=7

это пример. у тебя в индикаторе 4 цифры. и тут 3 варианта. 1 цифра на индикаторе это знак, остальные 3 это температура. если температура не будет превывать 99.9 градусов то можно выводит с десятыми, если больше то 2 вариарт. без десятых от 0 до 125 без десятых, или до 99,9 с десятыми а после без десятых. 3 вариант.... короче как угодно можно комбинировать

Вышел из положения так . Вашим методом не получается . Сейчас дисплей показывает и при минусовой температуре цифры но как воткнуть - так и не додумался!

#include <TM1637Display.h>
#include <OneWire.h>
OneWire ds(9);
const int CLK = 2; 
const int DIO = 3; 
TM1637Display display(CLK, DIO); 
void setup() {
display.setBrightness(0x0e);
}
void loop() { 
byte data[2];
ds.reset(); 
ds.write(0xCC);
ds.write(0x44);
delay(1000);
ds.reset();
ds.write(0xCC);
ds.write(0xBE);
data[0] = ds.read(); 
data[1] = ds.read();
int Temp = (data[1]<< 8)+data[0];
Temp = Temp>>4;
display.showNumberDec(abs(Temp));
}

 

vova20081
Offline
Зарегистрирован: 08.08.2015

Пишу со смарта - простите.
Библиотека tm1637.h
Вывод символа-… dysplay(0,15);
0-номер ячейки
15 - выводимый символ
В библиотеке поменять 0x71 на что надо(0х01 пример)
71 спомощю калькулятора из hex перевести в bin

vova20081
Offline
Зарегистрирован: 08.08.2015

40- это минус

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

vova20081 пишет:
40- это минус

А можно поподробнее и в коде ?

 

vova20081
Offline
Зарегистрирован: 08.08.2015
#include <TM1637.h>
//------------дисплей___
#define CLK 3//pins definitions for TM1637 and can be changed to other ports       
#define DIO 2
TM1637 tm1637(CLK,DIO);
void setup() 
  {
   tm1637.init();
  tm1637.set(2);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
.
.
.
}
void Ris()
  {
tm1637.clearDisplay();
  //---рисуем все  0-------
    tm1637.display(0,0);
    tm1637.display(1,0);
    tm1637.display(2,0);
    tm1637.display(3,0);
    delay(400);
 //---рисуем все 8-------
tm1637.clearDisplay();
    tm1637.display(0,8);
    tm1637.display(1,8);
    tm1637.display(2,8);
    tm1637.display(3,8);
    delay(400);
//---рисуем    9,A,b,C-------
tm1637.clearDisplay();
    tm1637.display(0,9);
    tm1637.display(1,10);
    tm1637.display(2,11);
    tm1637.display(3,12);
    delay(400);
/*
если в файле TM1637.cpp в строке 26 заменить 0x71 на 0х40   то  tm1637.display(0,15) выдаст в первом символе -
*/
  
  }  

 

vova20081
Offline
Зарегистрирован: 08.08.2015

hex 0х71 -  bin 1110001 ------ "F"

"-" bin 1000000  - hex 40  (0x40)

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

vova20081 пишет:

#include <TM1637.h>
//------------дисплей___
#define CLK 3//pins definitions for TM1637 and can be changed to other ports       
#define DIO 2
TM1637 tm1637(CLK,DIO);
void setup() 
  {
   tm1637.init();
  tm1637.set(2);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
.
.
.
}
void Ris()
  {
tm1637.clearDisplay();
  //---рисуем все  0-------
    tm1637.display(0,0);
    tm1637.display(1,0);
    tm1637.display(2,0);
    tm1637.display(3,0);
    delay(400);
 //---рисуем все 8-------
tm1637.clearDisplay();
    tm1637.display(0,8);
    tm1637.display(1,8);
    tm1637.display(2,8);
    tm1637.display(3,8);
    delay(400);
//---рисуем    9,A,b,C-------
tm1637.clearDisplay();
    tm1637.display(0,9);
    tm1637.display(1,10);
    tm1637.display(2,11);
    tm1637.display(3,12);
    delay(400);
/*
если в файле TM1637.cpp в строке 26 заменить 0x71 на 0х40   то  tm1637.display(0,15) выдаст в первом символе -
*/
  
  }  

 

Я не понимаю в этой библиотеке и так есть минус вот кусок кода из неё?

#include "TM1637.h"
#include <Arduino.h>
static int8_t TubeTab[] = {0x3f,0x06,0x5b,0x4f,
                           0x66,0x6d,0x7d,0x07,
                           0x7f,0x6f,0x77,0x7c,
                           0x39,0x5e,0x79,0x71,
                           0x40,0x00};//0~9,A,b,C,d,E,F,"-"," "  

 

 

vova20081
Offline
Зарегистрирован: 08.08.2015

Ну да. У меня другая версия библиотеки - без "-" и " "
В вашей версии нужно писать 16 в качестве параметра, вместо моих 15

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

vova20081 пишет:
Ну да. У меня другая версия библиотеки - без "-" и " " В вашей версии нужно писать 16 в качестве параметра, вместо моих 15

 

Вот так?

tm1637.display(0,16);
tm1637.display(temp);

 

vova20081
Offline
Зарегистрирован: 08.08.2015

Да. Только я не знаю, что делает вторая строка. Я начинающий.

woodart
Offline
Зарегистрирован: 07.12.2015

vova20081 пишет:
Пишу со смарта - простите. Библиотека tm1637.h Вывод символа-… dysplay(0,15); 0-номер ячейки 15 - выводимый символ В библиотеке поменять 0x71 на что надо(0х01 пример) 71 спомощю калькулятора из hex перевести в bin

Мучаю такой-же дисплейчик.

Как оказалось, код в библиотеке даже менять не надо, достаточно дописать свои ячейки.

#include "TM1637.h"
#include <Arduino.h>

static int8_t TubeTab[] = {
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,  //0~9,A,b,C,d,E,F 
0x40,0x00,0x63,0x5c, // -,space,degre,n,  
0x54,0x76,0x50,0x6d};  // n,H,r,S       

две нижние строки дописал.

alexku44
Offline
Зарегистрирован: 13.12.2015

добрый день, сегодня стал обладателем arduino uno r3, решил подключить DS18S20 c TM1637, взял скетч из начала темы, почему то не работает, на экране отображается E . может дело в том что датчик с маркировкой S ? где то нужно править код?

p.s. с порта нет данных, если использовать скетч из темы, пробовал скетчи от датчика и дисплея по отднльности, работает.

alexku44
Offline
Зарегистрирован: 13.12.2015

методом тыка, обнаружил если поменять Temp = Temp>>8; на Temp = Temp>>1; показания есть но они вправой части.

как перенести их влево? что бы отображалось к примеру 25.5

P@vel
Offline
Зарегистрирован: 27.04.2016

Всем добрый день!

Прочёл тему ивозник вопрос, по поводу DHT 22  (AM2302) датчика Нигде нет упаминания об активации DHT.h библиатек

Я хотел бы реаизовать 2 варианта отображения дисплеем

1. Отображение температуры и влажности поочерёдно по 2 секунды

2. отображение температуры и влажности одновременно через дваиточие целыми числами без десятичных

 

Vitas_007
Offline
Зарегистрирован: 03.10.2016

Проблему отображения знака минус для себя решил так:


int tempMin = -55;
int tempMax = 00;

void loop()
{
readDS18B20();
display.point(POINT_OFF);   
        if (temp > tempMax) 
              {
                 timeDisp[0] = 16;
              }
             else
              {
                 timeDisp[0] = 17; 
              }     
        timeDisp[1] = (abs(temp)) / 10;
        timeDisp[2] = (byte)(abs(temp)) % 10;
        timeDisp[3] = 18;
}
sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

Vitas_007 пишет:

Проблему отображения знака минус для себя решил так:


int tempMin = -55;
int tempMax = 00;

void loop()
{
readDS18B20();
display.point(POINT_OFF);   
        if (temp > tempMax) 
              {
                 timeDisp[0] = 16;
              }
             else
              {
                 timeDisp[0] = 17; 
              }     
        timeDisp[1] = (abs(temp)) / 10;
        timeDisp[2] = (byte)(abs(temp)) % 10;
        timeDisp[3] = 18;
}

А можно скетч полностью?

Vitas_007
Offline
Зарегистрирован: 03.10.2016

Собирал часы в машину с отображением температуры.

Многие части кода были позаимствованы у других людей.

Возможно есть ошибки, сильно не пинайте я новичек. Часы работают второй месяц, глюков не наблюдаю.

#include <OneWire.h>
#include <DI.h>
#include <Meander.h>
#include <Timer_P.h>
#include <DS3231.h>
#include <Wire.h>
#include <EEPROM.h>
#include "TM1637.h"

#define ONE_WIRE_PIN 11 // пин для подключения DS18B20
OneWire oneWire(ONE_WIRE_PIN);

//Массив, содержащий время компиляции
char compileTime[] = __TIME__;
char compileDate[] = __DATE__;

#define DISPLAY_CLK_PIN 2
#define DISPLAY_DIO_PIN 3
#define MODE_KEY_PIN 5
#define MODE1_KEY_PIN 8
#define PLUS_KEY_PIN 6
#define MINUS_KEY_PIN 7

int tempMin = -55;
int tempMax = 00;

float temp; // переменная для хранения температуры

TM1637 display(DISPLAY_CLK_PIN, DISPLAY_DIO_PIN);
DS3231 Clock(SDA, SCL);
Time RTC_Time;
DI ModeKey(MODE_KEY_PIN, 10), PlusKey(PLUS_KEY_PIN, 10), MinusKey(MINUS_KEY_PIN, 10), Mode1Key(MODE1_KEY_PIN, 10);
Timer_P DisplayPeriod, AutoID_Timer, SecsSetted;
Meander P_s;
int Mode = 0, HourToSet, MinuteToSet, OutPeriod = 200;
int Mode1 = 0; 
boolean ModeKey_old, PlusKey_old, MinusKey_old, Mode2_old, Mode3_old, SecsSetted_old;
byte mode = 0;
void setup()
{
   //Serial.begin(115200);
  // Start the I2C interface
  Clock.begin();
  //Включаем и настраиваем индикатор
  Wire.begin();
  display.set(7);
  display.init();

  //Получаем число из строки, зная номер первого символа
  byte hour = getInt(compileTime, 0);
  byte minute = getInt(compileTime, 3);
  byte second = getInt(compileTime, 6);

  unsigned int hash =  hour * 60 * 60 + minute  * 60 + second;
  if (EEPROMReadInt(0) != hash) {
    //Сохраняем новый хэш
    EEPROMWriteInt(0, hash);
    Clock.adjust(compileDate, compileTime);
  }
  pinMode(13, OUTPUT);
}

void loop()
{
  int8_t TimeDisp[4];
  //Запускаем меандр
  P_s.MeanderV(OutPeriod * 2, OutPeriod);
  ModeKey.DI_Refresh();
  Mode1Key.DI_Refresh();
  PlusKey.DI_Refresh();
  MinusKey.DI_Refresh();

  DisplayPeriod.TimerV(!DisplayPeriod.Q0(), 0, 2, OutPeriod); // Самосбрасывающийся таймер периода
  AutoID_Timer.TimerV(!AutoID_Timer.Q0() && (PlusKey.DI_Read() || MinusKey.DI_Read()) && !(PlusKey.DI_Read() && MinusKey.DI_Read()) , 0, 2, OutPeriod * 2);
  SecsSetted.TimerV((Mode == 1 && ((PlusKey.DI_Read() && !PlusKey_old) || (MinusKey.DI_Read() && !MinusKey_old))), 0, 1, 1500);

  if (ModeKey.DI_Read() && !ModeKey_old) Mode = (++Mode) % 4; //Перебор режимов
  if (Mode1Key.DI_Read() && !ModeKey_old) Mode1 = (++Mode1) % 2; //Перебор режимов
  if (!SecsSetted.Q0() && SecsSetted_old) Mode = 2;
  if (Mode == 2  && !Mode2_old) MinuteToSet = RTC_Time.min;
  if (Mode == 3  && !Mode3_old) HourToSet = RTC_Time.hour;

  if (Mode == 1 && ((PlusKey.DI_Read() && !PlusKey_old) || (MinusKey.DI_Read() && !MinusKey_old))) Clock.setSecond(0);
  if (Mode != 2 && Mode2_old) Clock.setMinute(MinuteToSet);
  if (Mode != 3 && Mode3_old) Clock.setHour(HourToSet);
  if ((PlusKey.DI_Read() || MinusKey.DI_Read()) && !(PlusKey.DI_Read() && MinusKey.DI_Read()) && Mode == 2) {
    if (PlusKey.DI_Read() && (!PlusKey_old || AutoID_Timer.Q0())) MinuteToSet = (++MinuteToSet) % 60;
    if (MinusKey.DI_Read() && (!MinusKey_old || AutoID_Timer.Q0())) MinuteToSet = --MinuteToSet;
    if (MinuteToSet < 0) MinuteToSet = 59;
  }

  if ((PlusKey.DI_Read() || MinusKey.DI_Read()) && !(PlusKey.DI_Read() && MinusKey.DI_Read()) && Mode == 3) {
    if (PlusKey.DI_Read() && (!PlusKey_old || AutoID_Timer.Q0())) HourToSet = (++HourToSet) % 24;
    if (MinusKey.DI_Read() && (!MinusKey_old || AutoID_Timer.Q0())) HourToSet = --HourToSet;
    if (HourToSet < 0) HourToSet = 24;
  }

  if (DisplayPeriod.Q0()) {
    // Get data from the DS3231
    int8_t timeDisp[4];
    //Запрашиваем время
    RTC_Time = Clock.getTime();
    // считываем температуру
    readDS18B20();           

    //Получаем десятки часов с помощью целочисленного деления
    timeDisp[0] = RTC_Time.hour / 10;
    timeDisp[1] = RTC_Time.hour % 10;
    timeDisp[2] = RTC_Time.min / 10;
    timeDisp[3] = RTC_Time.min % 10;

    switch (Mode) {
      case 1:
          //if (P_s.Q0()){
              timeDisp[0] = 16;
              timeDisp[1] = 16;
              timeDisp[2] = 16;
              timeDisp[3] = 16;
          //}
          break;
        case 2:
          if (P_s.Q0()){
              timeDisp[2] = MinuteToSet / 10;
              timeDisp[3] = MinuteToSet % 10;
          }else{
              timeDisp[2] = 16;
              timeDisp[3] = 16;
          }
          break;
        case 3:
          if (P_s.Q0()){
              timeDisp[0] = HourToSet / 10;
              timeDisp[1] = HourToSet % 10;
          }else{
              timeDisp[0] = 16;
              timeDisp[1] = 16;
          }      
          break;
    }
    switch (Mode1) {
      case 1:
        display.point(POINT_OFF); // выключаем точки        
        if (temp > tempMax) // смотрим знак температуры - или +
              {
                 timeDisp[0] = 16;
              }
             else
              {
                 timeDisp[0] = 17;
              }     
        timeDisp[1] = (abs(temp)) / 10; // заполняем массив
        timeDisp[2] = (byte)(abs(temp)) % 10;
        timeDisp[3] = 18; // C
        break;
    }

    display.display(timeDisp);
    display.point(((RTC_Time.sec % 2 ? POINT_ON : POINT_OFF) && !SecsSetted.Q0()) || (!P_s.Q0() && SecsSetted.Q0()));

    // Send Day-of-Week
    //Serial.print(Clock.getDOWStr());
    //Serial.print(" ");

    // Send date
    //Serial.print(Clock.getDateStr());
    //Serial.print(" -- ");

    // Send time
    //Serial.println(Clock.getTimeStr());
  }
  ModeKey_old = ModeKey.DI_Read();
  PlusKey_old = PlusKey.DI_Read();
  MinusKey_old = MinusKey.DI_Read();
  SecsSetted_old = SecsSetted.Q0();
  Mode2_old = (Mode == 2);
  Mode3_old = (Mode == 3);
  digitalWrite(13, P_s.Q0());
}

//Содержимое функции объяснено ниже
char getInt(const char* string, int startIndex) {
  return int(string[startIndex] - '0') * 10 + int(string[startIndex + 1]) - '0';
}

//Запись двухбайтового числа в память
void EEPROMWriteInt(int address, int value)
{
  EEPROM.write(address, lowByte(value));
  EEPROM.write(address + 1, highByte(value));
}
//Чтение числа из памяти
unsigned int EEPROMReadInt(int address)
{
  byte lowByte = EEPROM.read(address);
  byte highByte = EEPROM.read(address + 1);
  return (highByte << 8) | lowByte;
}

void readDS18B20()
{
  static boolean n = false;     // флаг работы: запрос температуры или её чтение
  n = !n;
  if (n)
  {
    oneWire.reset();                 // сброс шины
    oneWire.write(0xCC);             //обращение ко всем датчикам (если всего один DS18B20)
    //oneWire.select(sensorAddress); // выбор конкретного адреса - если несколько DS18B20
    oneWire.write(0x44);             // начать преобразование (без паразитного питания)
  }
  else
  {
    oneWire.reset();                 // сброс шины
    oneWire.write(0xCC);             //обращение ко всем датчикам (если всего один DS18B20)
    //oneWire.select(sensorAddress); // выбор конкретного адреса - если несколько DS18B20
    oneWire.write(0xBE);             // Read Scratchpad (чтение регистров)
    temp = (oneWire.read() | oneWire.read() << 8) / 16.0; //прочитаны 2 байта
  }
}

 

sergeyovs1980
Offline
Зарегистрирован: 20.09.2015

Я извиняюсь а не могли бы скинуть библиотеки из вашего скетча(например DI.h вообще немогу найти))

Vitas_007
Offline
Зарегистрирован: 03.10.2016

Библиотека DigitalTube и XDron.

В библиотеке DigitalTube добавлял символы.

https://yadi.sk/d/f4E9EW6mw9ndz

P@vel
Offline
Зарегистрирован: 27.04.2016

А показания темперетуры с чего снимал? Какой датчик?

Я DHT 22 с дисплеем ни как не могу подружить.

Vitas_007
Offline
Зарегистрирован: 03.10.2016

Чтобы включить отображение температуры на 9-м пине кнопка Mode1 (переключение между часами и температурой).

Тестировал в морозилке холодильника :)

Vitas_007
Offline
Зарегистрирован: 03.10.2016

Датчик DS18B20

Я когда эксперементировал со скетчем тоже 22-й использовать пытался, всё работало. Только на тот момент ещё не догнал как знак минус нарисовать, поэтому скетч не сохранился. 

Vitas_007
Offline
Зарегистрирован: 03.10.2016

Для DHT-22 попробуйте этот скетч, правда проверить не на чем. Датчик так-же к 11 пину.

#include <DHT.h>
#include <DI.h>
#include <Meander.h>
#include <Timer_P.h>
#include <DS3231.h>
#include <EEPROM.h>
#include "TM1637.h"

#define DHTPIN 11     // what digital pin we're connected to
#define DHTTYPE DHT22   // DHT 22
DHT dht(DHTPIN, DHTTYPE);

//Массив, содержащий время компиляции
char compileTime[] = __TIME__;
char compileDate[] = __DATE__;

#define DISPLAY_CLK_PIN 2
#define DISPLAY_DIO_PIN 3
#define MODE_KEY_PIN 6
#define MODE1_KEY_PIN 9
#define PLUS_KEY_PIN 7
#define MINUS_KEY_PIN 8

int tempMin = -55;
int tempMax = 00;

float temp = dht.readTemperature();

TM1637 display(DISPLAY_CLK_PIN, DISPLAY_DIO_PIN);
DS3231 Clock(4, 5);
Time RTC_Time;
DI ModeKey(MODE_KEY_PIN, 10), PlusKey(PLUS_KEY_PIN, 10), MinusKey(MINUS_KEY_PIN, 10), Mode1Key(MODE1_KEY_PIN, 10);
Timer_P DisplayPeriod, AutoID_Timer, SecsSetted;
Meander P_s;
int Mode = 0, HourToSet, MinuteToSet, OutPeriod = 200;
int Mode1 = 0; 
boolean ModeKey_old, Mode1Key_old, PlusKey_old, MinusKey_old, Mode2_old, Mode3_old, SecsSetted_old;
byte mode = 0;
void setup()
{
   //Serial.begin(115200);
  // Start the I2C interface
  dht.begin();
  Clock.begin();
  //Включаем и настраиваем индикатор  
  display.set(7);
  display.init();

  //Получаем число из строки, зная номер первого символа
  byte hour = getInt(compileTime, 0);
  byte minute = getInt(compileTime, 3);
  byte second = getInt(compileTime, 6);

  unsigned int hash =  hour * 60 * 60 + minute  * 60 + second;
  if (EEPROMReadInt(0) != hash) {
    //Сохраняем новый хэш
    EEPROMWriteInt(0, hash);
    Clock.adjust(compileDate, compileTime);
  }
  pinMode(13, OUTPUT);
}

void loop()
{
  int8_t TimeDisp[4];
  //Запускаем меандр
  P_s.MeanderV(OutPeriod * 2, OutPeriod);
  ModeKey.DI_Refresh();
  Mode1Key.DI_Refresh();
  PlusKey.DI_Refresh();
  MinusKey.DI_Refresh();

  DisplayPeriod.TimerV(!DisplayPeriod.Q0(), 0, 2, OutPeriod); // Самосбрасывающийся таймер периода
  AutoID_Timer.TimerV(!AutoID_Timer.Q0() && (PlusKey.DI_Read() || MinusKey.DI_Read()) && !(PlusKey.DI_Read() && MinusKey.DI_Read()) , 0, 2, OutPeriod * 2);
  SecsSetted.TimerV((Mode == 1 && ((PlusKey.DI_Read() && !PlusKey_old) || (MinusKey.DI_Read() && !MinusKey_old))), 0, 1, 1500);

  if (ModeKey.DI_Read() && !ModeKey_old) Mode = (++Mode) % 4; //Перебор режимов
  if (Mode1Key.DI_Read() && !Mode1Key_old) Mode1 = (++Mode1) % 2; //Перебор режимов
  if (!SecsSetted.Q0() && SecsSetted_old) Mode = 2;
  if (Mode == 2  && !Mode2_old) MinuteToSet = RTC_Time.min;
  if (Mode == 3  && !Mode3_old) HourToSet = RTC_Time.hour;

  if (Mode == 1 && ((PlusKey.DI_Read() && !PlusKey_old) || (MinusKey.DI_Read() && !MinusKey_old))) Clock.setSecond(0);
  if (Mode != 2 && Mode2_old) Clock.setMinute(MinuteToSet);
  if (Mode != 3 && Mode3_old) Clock.setHour(HourToSet);
  if ((PlusKey.DI_Read() || MinusKey.DI_Read()) && !(PlusKey.DI_Read() && MinusKey.DI_Read()) && Mode == 2) {
    if (PlusKey.DI_Read() && (!PlusKey_old || AutoID_Timer.Q0())) MinuteToSet = (++MinuteToSet) % 60;
    if (MinusKey.DI_Read() && (!MinusKey_old || AutoID_Timer.Q0())) MinuteToSet = --MinuteToSet;
    if (MinuteToSet < 0) MinuteToSet = 59;
  }

  if ((PlusKey.DI_Read() || MinusKey.DI_Read()) && !(PlusKey.DI_Read() && MinusKey.DI_Read()) && Mode == 3) {
    if (PlusKey.DI_Read() && (!PlusKey_old || AutoID_Timer.Q0())) HourToSet = (++HourToSet) % 24;
    if (MinusKey.DI_Read() && (!MinusKey_old || AutoID_Timer.Q0())) HourToSet = --HourToSet;
    if (HourToSet < 0) HourToSet = 24;
  }

  if (DisplayPeriod.Q0()) {
    // Get data from the DS3231
    int8_t timeDisp[4];
    //Запрашиваем время
    RTC_Time = Clock.getTime();    
    //Получаем десятки часов с помощью целочисленного деления
    timeDisp[0] = RTC_Time.hour / 10;
    timeDisp[1] = RTC_Time.hour % 10;
    timeDisp[2] = RTC_Time.min / 10;
    timeDisp[3] = RTC_Time.min % 10;

    switch (Mode) {
      case 1:
          //if (P_s.Q0()){
              timeDisp[0] = 16;
              timeDisp[1] = 16;
              timeDisp[2] = 16;
              timeDisp[3] = 16;
          //}
          break;
        case 2:
          if (P_s.Q0()){
              timeDisp[2] = MinuteToSet / 10;
              timeDisp[3] = MinuteToSet % 10;
          }else{
              timeDisp[2] = 16;
              timeDisp[3] = 16;
          }
          break;
        case 3:
          if (P_s.Q0()){
              timeDisp[0] = HourToSet / 10;
              timeDisp[1] = HourToSet % 10;
          }else{
              timeDisp[0] = 16;
              timeDisp[1] = 16;
          }      
          break;
    }
    switch (Mode1) {
      case 1:
        display.point(POINT_OFF); // выключаем точки        
        if (temp > tempMax) // смотрим знак температуры - или +
              {
                 timeDisp[0] = 16;
              }
             else
              {
                 timeDisp[0] = 17;
              }     
        timeDisp[1] = (abs(temp)) / 10; // заполняем массив
        timeDisp[2] = (byte)(abs(temp)) % 10;
        timeDisp[3] = 18; // C
        break;
    }

    display.display(timeDisp);
    display.point(((RTC_Time.sec % 2 ? POINT_ON : POINT_OFF) && !SecsSetted.Q0()) || (!P_s.Q0() && SecsSetted.Q0()));

    // Send Day-of-Week
    //Serial.print(Clock.getDOWStr());
    //Serial.print(" ");

    // Send date
    //Serial.print(Clock.getDateStr());
    //Serial.print(" -- ");

    // Send time
    //Serial.println(Clock.getTimeStr());
  }
  ModeKey_old = ModeKey.DI_Read();
  Mode1Key_old = Mode1Key.DI_Read();
  PlusKey_old = PlusKey.DI_Read();
  MinusKey_old = MinusKey.DI_Read();
  SecsSetted_old = SecsSetted.Q0();
  Mode2_old = (Mode == 2);
  Mode3_old = (Mode == 3);
  digitalWrite(13, P_s.Q0());
}

//Содержимое функции объяснено ниже
char getInt(const char* string, int startIndex) {
  return int(string[startIndex] - '0') * 10 + int(string[startIndex + 1]) - '0';
}

//Запись двухбайтового числа в память
void EEPROMWriteInt(int address, int value)
{
  EEPROM.write(address, lowByte(value));
  EEPROM.write(address + 1, highByte(value));
}
//Чтение числа из памяти
unsigned int EEPROMReadInt(int address)
{
  byte lowByte = EEPROM.read(address);
  byte highByte = EEPROM.read(address + 1);
  return (highByte << 8) | lowByte;
}

 

P@vel
Offline
Зарегистрирован: 27.04.2016
#include <dht.h>
#include "TM1637.h"

//{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
//0~9,A,b,C,d,E,F
 

 
#define dht_pin 2 // Pin sensor is connected to
#define CLK 3//Pins for TM1637       
#define DIO 4
 
TM1637 tm1637(CLK,DIO);
dht DHT;
 

void setup(){
  
  tm1637.init();
  tm1637.set(BRIGHT_TYPICAL); 
  //BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
 
  delay(1500);//Delay to let system boot

 
}//end "setup()"
 

 
void loop(){
 
  //Start of Program 
 
  DHT.read11(dht_pin);
 

 int temp = DHT.temperature;
 int humidity = DHT.humidity;
 
 int digitoneT = temp / 10;
 int digittwoT = temp % 10;
 
 int digitoneH = humidity / 10;
 int digittwoH = humidity % 10;
  

    tm1637.display(1,digitoneT); 
    tm1637.display(2,digittwoT);
    tm1637.display(3,12);  // put a C at the end
    
    delay (3000);
    
    tm1637.display(1,23); 
    tm1637.display(2,digitoneH); 
    tm1637.display(3,digittwoH);

    
  //Wait 3 seconds before accessing sensor again.
 
  //Fastest should be once every two seconds.
    delay(3000);
 
}// end loop() 

Вот нашол то что нужно https://brainy-bits.com/tutorials/4-bits-7-segment-led-display-with-arduino/ но при компиляции выдаёт ошибку в 34 строке   DHT.read11(dht_pin); Подскажите пожалуйста как исправить