TM1637, вывести знак "_", "-", и только верхний сегмент

yden
Offline
Зарегистрирован: 30.01.2016

Здравствуйте.

Прошу совета, плиз. Есть китайские дисплеи TM1637, использую библиотеку TM1637.h. Делаю информер, выводящий время, температуру улицы, атмосферное давление. Значение выводятся поочередно, считаю периоды через millis. Это все работает, значения сменяют друг друга.

Есть проблемы: 

1. хочу для давления выводить метки изменения. После значения давления, горящий сегмент снизу - давление понижается, сегмент в центре - постоянно, сегмент сверху - повышается. Но как это сделать на это индикаторе и этой библиотеке ума не приложу.

2. При выводе показаний происходит помигивание дисплея, т.е подмигивают незадействованные сегменты.

Код:

 //экран TM1687
  //часы
  if (currentMillis_change - previousMillis_change <= interval_clock)
  {    
    tm1637.point(POINT_ON);  // включаем точки 
    //dispLED.clear();
//    dispLED.print(hours,minutes,TIME);
    TimeDisp[0] = hours / 10; //выводит часы
    TimeDisp[1] = hours % 10; //выводит часы
    TimeDisp[2] = minutes / 10; //выводит минуты
    TimeDisp[3] = minutes % 10; //выводит минуты
  }
  //температура улица
  else if (currentMillis_change - previousMillis_change <= interval_clock + interval_temp)
  {   
    tm1637.point(POINT_OFF);  // включаем точки 
    //dispLED.clear();
//    dispLED.print(-t_out, TEMP);
    TimeDisp[0] = "";
    if (t_out < 0) 
    {
      TimeDisp[1] = 16;
    }
    else TimeDisp[1] = "";
    TimeDisp[2] = t_out / 10; //выводит минуты;
    TimeDisp[3] = t_out % 10; //выводит минуты;
  }
  //давление
  else if (currentMillis_change - previousMillis_change <= interval_clock + interval_temp + interval_p_atm)
  {    
    tm1637.point(POINT_OFF);  // включаем точки 
    //dispLED.clear();
//    dispLED.print(p_atm);
    TimeDisp[1] = "";
    TimeDisp[1] = p_atm / 100; //выводит сотни давление
    TimeDisp[2] = (p_atm - (p_atm / 100)*100) / 10; //выводит десятки давление
    TimeDisp[3] = p_atm % 10; //выводит единицы давление
  else 
  {
    previousMillis_change = currentMillis_change;
  }
  
  tm1637.display(TimeDisp); // выводим на индикатор

Может кто уже делал подобное, как вы решили эти две проблемы? поделитесь идеей плиз.

 

благодарю

auct
Offline
Зарегистрирован: 14.12.2014

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

void setSegments(byte addr, byte data)
{
  tm1637.start();
  tm1637.writeByte(ADDR_FIXED);
  tm1637.stop();
  tm1637.start();
  tm1637.writeByte(addr | 0xc0);
  tm1637.writeByte(data);
  tm1637.stop();
  tm1637.start();
  tm1637.writeByte(tm1637.Cmd_DispCtrl);
  tm1637.stop();
}

вывод на экран

  setSegments(0, 0b01000000); // центр
  setSegments(1, 0b00000001); // верх
  setSegments(2, 0b00001000); // низ
  setSegments(3, 0b00000000); // нет ничего