Вывод информации на 7 сегментный индикатор

s1ght
Offline
Зарегистрирован: 25.05.2018

Хочу реализовать градусник и часы. Необходимо, чтобы дисплей выводил часы, а через 5 секунд информацию о температуре. Подскажите что сделать в коде. 

#include <TimerOne.h>
#include <TM1637.h>
#define ON 1
#define OFF 0
 
#define B 3950 // B-коэффициент
#define SERIAL_R 10000 // сопротивление последовательного резистора, 102 кОм
#define THERMISTOR_R 10000 // номинальное сопротивления термистора, 100 кОм
#define NOMINAL_T 25 // номинальная температура (при которой TR = 100 кОм)
const byte tempPin = A0;
 
#define CLK 6//pins definitions for TM1637 and can be changed to other ports    
#define DIO 7
TM1637 tm1637(CLK,DIO);
 
#define PIN1 9
#define PIN2 10
 
int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};
int8_t TempDisp[]= {0x00,0x00,0x00,0x63};
unsigned char ClockPoint = 1;
unsigned char Update;
unsigned char halfsecond = 0;
unsigned char second;
unsigned char minute = 0;
unsigned char hour = 11;
 
void setup() {
 
tm1637.set();
  tm1637.init();
  Timer1.initialize(500000);//timing for 500ms
  Timer1.attachInterrupt(TimingISR);//declare the interrupt serve routine:TimingISR
  pinMode (PIN1, INPUT_PULLUP);
  pinMode (PIN2, INPUT_PULLUP);
}
 
void loop() {
  if(Update == ON)
  {
    TimeUpdate();
    tm1637.display(TimeDisp);
  }
  
}
void TimingISR()
{
  halfsecond ++;
  Update = ON;
  if(halfsecond == 2){
    second ++;
    if(second == 60)
    {
      minute ++;
      if(minute == 60)
      {
        hour ++;
        if(hour == 24)hour = 0;
        minute = 0;
      }
      second = 0;
    }
    halfsecond = 0;  
  }
  int but1 = digitalRead(PIN1);
  if (but1==0){
    minute++;
    second=0;
  }
  if (minute==60){
    minute=0;
  }
 
  int but2= digitalRead (PIN2);
  if (but2==0){
    hour++;
  }
  if (hour==24){
      hour=0;
     }
 // Serial.println(second);
  ClockPoint = (~ClockPoint) & 0x01;
}
 
void TimeUpdate(void)
{
  if(ClockPoint)tm1637.point(POINT_ON);
  else tm1637.point(POINT_OFF); 
  TimeDisp[0] = hour / 10;
  TimeDisp[1] = hour % 10;
  TimeDisp[2] = minute / 10;
  TimeDisp[3] = minute % 10;
  Update = OFF;
}
 
 
 
//градусник
 
void Termo (){
  int t = analogRead( tempPin );
    float tr = 1023.0 / t - 1;
    tr = SERIAL_R / tr;
 
    float temp;
    temp = tr / THERMISTOR_R; // (R/Ro)
    temp = log(temp); // ln(R/Ro)
    temp /= B; // 1/B * ln(R/Ro)
    temp += 1.0 / (NOMINAL_T + 273.15); // + (1/To)
    temp = 1.0 / temp; // Invert
    temp -= 273.15;
    int zpt=temp*10;
    if ( zpt<0){
      zpt=-zpt;
    }
    int ty=temp;
    if ( ty<0){
      ty=-ty;
    }
 
  if (temp<0) {
    tm1637.displayByte(0,0x40);}
  else{
  tm1637.displayByte(0,0x00);}
  tm1637.display(1,ty/10);
  tm1637.display(2,ty%10);
  tm1637.display(3,0x63);
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ну этот код ты не сам же писал?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

s1ght пишет:
Подскажите что сделать в коде. 

1. Разобраться в коде и понять как он устроен;
2. Дописать (изменить) его так, "чтобы дисплей выводил часы, а через 5 секунд информацию о температуре"

Начинать надо обязательно с п.1, тогда п.2 никаких затруднений не вызовет.

s1ght
Offline
Зарегистрирован: 25.05.2018

Код отчасти сам отчасти, проблема не в понимании, а в том, что я могу вывести например время, но какой командой менять показ времени на показ температуры?? delay приводит к тому, что часы идут неправильно и двоеточие ведет себя некорректно

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

s1ght пишет:

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

Это и называется "проблема в понимании". Обратитесь в раздел "Ищу исполнителя", оплатите и Вам сделают.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Проблема не в понимании, а в отсутствии понимания. И если нет понимания, то его точно надо купить, хотя бы на это устройство.