Изменение цвета шрифта в зависимости от температуры.

Тема в разделе "Arduino & Shields", создана пользователем Dioskuri, 8 окт 2015.

  1. Nalbagar

    Nalbagar Нуб

    Здравствуйте. Как и автор темы заморочился подобным вопросом, только собираю метеостанцию в автомобиль.
    вернее собрал и уже два года успешно пользуюсь. И вот недавно захотелось немного усовершенствовать. А если быть точнее
    добавить функцию изменения цвета шрифта в диапазоне от нуля до минус 3х градусов на красный цвет. Мне не нужны плавные
    переходы. Просто в заданном диапазоне температур цвет шрифта которым прописывается температура за бортом, должен меняться с зелёного на красный. вроде как предупреждая о возможном гололёде. скетч прикладываю. Вышеописанный способ от AlexVS мне подошёл бы но не совсем понимаю подойдёт ли он к моей конфигурации. А да. у меня два датчика температуры, наружный и внутренний. Ориентироваться нужно на наружный DS18B20. Заранее спасибо если направите в нужное русло.

    скетч отправляю файлом
     

    Вложения:

    Последнее редактирование модератором: 5 ноя 2019
  2. b707

    b707 Гуру

    Nalbagar - если не нужны плавные переходы. то вам подойдет первый же ответ AlexVS в этой ветке
     
  3. Nalbagar

    Nalbagar Нуб

    Да. Конечно. Я и говорю. Но не совсем понимаю как его применить и применим ли он в моём случае. я пробовал но у меня не вышло. При компиляции выдаёт ошибку.
    Если не трудно поглядите мой скетч.

    Код (C++):
    #include <Wire.h>
    #include "DHT_NEW.h"
    #include <Adafruit_ST7735.h>

    #include <SPI.h>

    #include <Adafruit_GFX.h>
    #include <OneWire.h>
    #include <BMP085.h>
    DHT _dht1;

    byte _d18x2x1Addr[8] = {0x28, 0xFF, 0x43, 0x51, 0x60, 0x17, 0x5, 0xA0};


    BMP085  _bmp085 = BMP085();
    long _bmp085P = 0;

    struct UB_183019361
    {
      String ubo_43452855 = "";
      String _swi1 = "";
      String _swi2 = "";
      String _swi4 = "";
      bool _gen1I = 0;
      bool _gen1O = 0;
      unsigned long _gen1P = 0UL;
    };


      tft.fillScreen(ST7735_BLACK);
      //  tft.drawRect(0, 0, 160, 128, ST7735_WHITE);
      tft.drawLine(0, 30, 160, 30, ST7735_WHITE);
      tft.drawLine(0, 98, 160, 98, ST7735_WHITE);
      tft.drawLine(80, 98, 80, 128, ST7735_WHITE);
      tft.drawLine(80, 0, 80, 30, ST7735_WHITE);
    }
    void loop()
    { if (_isTimer(_bmp0851Tti, 10000)) {
        _bmp0851Tti = millis();
        _bmp085.getPressure(&_bmp085P);
      }




      //Плата:1
      //Наименование:получение температуры с DS18b20
      if (_isTimer(_d18x2x1Tti, 2000)) {
        _d18x2x1Tti = millis();
        _d18x2x1O =  _readDS18_ow3(_d18x2x1Addr, 0);
      }
      _gtv1 = ( _floatToStringWitRaz((_d18x2x1O), 0));

      //Плата:2
      //Наименование:получение данных с BMP180
      _gtv6 = (String((int((_bmp085P) / (133.322))), DEC));

      //Плата:3
      //Наименование:получение температуры и влажности с DHT22
      if (_isTimer(_dht1Tti, 6000)) {
        if (_isTimer(_dht1LRT, ( _dht1.getMinimumSamplingPeriod()))) {
          _dht1.readSensor();
          _dht1LRT = millis();
          _dht1Tti = millis();
        }
      }
      _gtv3 = ( _floatToStringWitRaz(_dht1.humidity, 0));
      _gtv2 = ( _floatToStringWitRaz(_dht1.temperature, 0));

      //Плата:4
      //Наименование:Получение времени
      get3231Date(0x68, &_RTC1);
      _RTC1_GetTime1_HourOut = _RTC1.Hours;
      _RTC1_GetTime1_MinOut = _RTC1.minutes;
      UB_183019361_ubi_86273617 = _RTC1_GetTime1_HourOut;
      UB_183019361_ubi_178716155 = _RTC1_GetTime1_MinOut;
      UB_183019361_ubi_226328769 = 1;
      _func_UB_183019361(&UB_183019361_Instance1, UB_183019361_ubi_86273617, UB_183019361_ubi_178716155, UB_183019361_ubi_226328769);
      get3231Date(0x68, &_RTC1);
      _RTC1_GetTime3_StrOut = ( _convertRealTimeClockNumberToString(_RTC1.day)) +
                              String(".") +
                              ( _convertRealTimeClockNumberToString(_RTC1.month)) +
                              String(".") +
                              ( _dayNameFromRealTimeClockNumber(_RTC1.weekday));
      LN1 = _gtv1;
      LN2 = _gtv2;
      LN3 = String("in");
      LN4 = String("out");
      LN5 = UB_183019361_Instance1.ubo_43452855;
      LN6 = _RTC1_GetTime3_StrOut;
      LN7 = _gtv6;
      LN8 = String("mmHg");
      LN9 = _gtv3;
      LN10 = String("%");
      tft.setTextWrap(0);//запрещаем перенос строки
      tft.setCursor(42,8);
      tft.setTextColor(ST7735_GREEN, ST7735_BLACK); //цвет шрифта и цвет фона
      tft.setTextSize(2);
      tft.println(LN1);
      tft.setCursor(120, 8);
      tft.setTextColor(ST7735_GREEN, ST7735_BLACK); //цвет шрифта и цвет фона
      tft.setTextSize(2);
      tft.println(LN2);
      tft.setCursor(85, 10);
      tft.setTextColor(ST7735_WHITE, ST7735_BLACK); //цвет шрифта и цвет фона
      tft.setTextSize(2);
      tft.println(LN3);
      tft.setCursor(5, 10);
      tft.setTextColor(ST7735_WHITE, ST7735_BLACK); //цвет шрифта и цвет фона
      tft.setTextSize(2);
      tft.println(LN4);
      tft.setCursor(35, 40);
      tft.setTextColor(ST7735_WHITE, ST7735_BLACK); //цвет шрифта и цвет фона
      tft.setTextSize(3);
      tft.println(LN5);
      tft.setCursor(20, 75);
      tft.setTextColor(ST7735_WHITE, ST7735_BLACK); //цвет шрифта и цвет фона
      tft.setTextSize(2);
      tft.println(LN6);
      tft.setCursor(7, 105);
      tft.setTextColor(ST7735_YELLOW, ST7735_BLACK); //цвет шрифта и цвет фона
      tft.setTextSize(2);
      tft.println(LN7);
      tft.setCursor(45, 114);
      tft.setTextColor(ST7735_WHITE, ST7735_BLACK); //цвет шрифта и цвет фона
      tft.setTextSize(1);
      tft.println(LN8);
      tft.setCursor(100, 105);
      tft.setTextColor(ST7735_YELLOW, ST7735_BLACK); //цвет шрифта и цвет фона
      tft.setTextSize(2);
      tft.println(LN9);
      tft.setCursor(135, 103);
      tft.setTextColor(ST7735_WHITE, ST7735_BLACK); //цвет шрифта и цвет фона
      tft.setTextSize(3);
      tft.println(LN10);





    }
    String  _floatToStringWitRaz(float value, int raz)
    {

      return String(value, raz);
    }
    bool _isTimer(unsigned long startTime, unsigned long period )
    {
      unsigned long currentTime;
      currentTime = millis();
      if (currentTime >= startTime) {
        return (currentTime >= (startTime + period));
      } else {
        return (currentTime >= (4294967295 - startTime + period));
      }
    }
    float _convertDS18x2xData(byte type_s, byte data[12])
    {
      int16_t raw = (data[1] << 8) | data[0];
      if (type_s)
      {
        raw = raw << 3;
        if (data[7] == 0x10) {
          raw = (raw & 0xFFF0) + 12 - data[6];
        }
      }
      else
      {
        byte cfg = (data[4] & 0x60);
        if (cfg == 0x00) raw = raw & ~7;   else if (cfg == 0x20) raw = raw & ~3;  else if (cfg == 0x40) raw = raw & ~1;
      }
      return  (float)raw / 16.0;
    }
    float _readDS18_ow3(byte addr[8], byte type_s)
    { byte data[12];
      byte i;
      _ow3.reset();
      _ow3.select(addr);
      _ow3.write(0xBE);
      for ( i = 0; i < 9; i++) {
        data[i] = _ow3.read();
      }
      _ow3.reset();
      _ow3.select(addr);
      _ow3.write(0x44, 1);
      return _convertDS18x2xData(type_s, data);
    } void get3231Date(int addres, struct _I2CRealRimeClockTime *timeStruct)
    {
      if (!(_isTimer ((timeStruct ->startTime), 250))) {
        return;
      }
      Wire.beginTransmission( addres);
      Wire.write(0x00);
      Wire.endTransmission();
      Wire.requestFrom(addres, 7);
      if (Wire.available()) {
        byte  seconds = Wire.read();
        byte minutes = Wire.read();
        byte hours   = Wire.read();
        byte day     = Wire.read();
        byte date    = Wire.read();
        byte month   = Wire.read();
        byte year    = Wire.read();
        timeStruct -> seconds = (((seconds & B11110000) >> 4) * 10 + (seconds & B00001111));
        timeStruct -> minutes = (((minutes & B11110000) >> 4) * 10 + (minutes & B00001111));
        timeStruct -> Hours = (((hours & B00110000) >> 4) * 10 + (hours & B00001111));
        timeStruct -> weekday = (day & B00000111);
        timeStruct -> day    = (((date & B00110000) >> 4) * 10 + (date & B00001111));
        timeStruct -> month   = (((month & B00010000) >> 4) * 10 + (month & B00001111));
        timeStruct -> year    = (((year & B11110000) >> 4) * 10 + (year & B00001111));
      } timeStruct ->startTime = millis();
    }
    String _convertRealTimeClockNumberToString(byte value)
    {
      if (value > 9) {
        return String(value, DEC);
      }
      return (String("0") + String(value, DEC));
    }
    String _dayNameFromRealTimeClockNumber(byte value)
    {
      switch (value) {
        case 1:
          return  String(utf8rus("Пон"));
          break;
        case 2:
          return  String(utf8rus("Вт"));
          break;
        case 3:
          return  String(utf8rus("среда"));
          break;
        case 4:
          return  String(utf8rus("четв"));
          break;
        case 5:
          return  String(utf8rus("Птн"));
          break;
        case 6:
          return  String(utf8rus("суб"));
          break;
        case 7:
          return  String(utf8rus("Вск"));
          break;
      }
      return  String("");
    }
    void _func_UB_183019361(struct UB_183019361 *_ubInstans, int ubi_86273617, int ubi_178716155, bool ubi_226328769)
    {
      String ubo_43452855 = _ubInstans->ubo_43452855;
      String _swi1 = _ubInstans->_swi1;
      String _swi2 = _ubInstans->_swi2;
      String _swi4 = _ubInstans->_swi4;
      bool _gen1I = _ubInstans->_gen1I;
      bool _gen1O = _ubInstans->_gen1O;
      unsigned long _gen1P = _ubInstans->_gen1P;
      if ((ubi_86273617) >= (10))
      {
        _swi1 = (String(ubi_86273617));
      }
      else
      {
        _swi1 = ((String("0")) + ((String(ubi_86273617))));
      }
      if ((ubi_178716155) >= (10))
      {
        _swi2 = (String(ubi_178716155));
      }
      else
      {
        _swi2 = ((String("0")) + ((String(ubi_178716155))));
      }
      if (_gen1O)
      {
        _swi4 = String(":");
      }
      else
      {
        _swi4 = String(" ");
      }
      if (ubi_226328769) {
        if (! _gen1I) {
          _gen1I = 1;
          _gen1O = 1;
          _gen1P = millis();
        }
      } else {
        _gen1I = 0 ;
        _gen1O = 0;
      }
      if (_gen1I) {
        if ( _isTimer ( _gen1P , 500 )) {
          _gen1P = millis();
          _gen1O = ! _gen1O;
        }
      }
      ubo_43452855 = ((_swi1) + (_swi4) + (_swi2));
      _ubInstans->ubo_43452855 = ubo_43452855;
      _ubInstans->_swi1 = _swi1;
      _ubInstans->_swi2 = _swi2;
      _ubInstans->_swi4 = _swi4;
      _ubInstans->_gen1I = _gen1I;
      _ubInstans->_gen1O = _gen1O;
      _ubInstans->_gen1P = _gen1P;

    }
    я удалил верхнюю часть кода, где прорисовывается заставка, иначе он не помещается в редакторе по количеству символов
     
    Последнее редактирование модератором: 5 ноя 2019
  4. b707

    b707 Гуру

    я не нашел в этом коде. где бы вы пробовали изменять цвет шрифта от температуры
     
    DetSimen нравится это.
  5. Nalbagar

    Nalbagar Нуб

    Да. Верно. Я не знаю куда вставить блок. Как работает условие я понял. if(если) и else(иначе), но вот в какую часть кода его вставить не соображу.

    пробовал найти примеры в готовых скетчах, не нашёл.
     
    Последнее редактирование модератором: 5 ноя 2019
  6. KindMan

    KindMan Гуру

    Это FLProg что-ли? Черт голову сломит… такого наворотить из элементарных функции.
     
  7. Nalbagar

    Nalbagar Нуб

    Да. но всё работает.
     
  8. KindMan

    KindMan Гуру

    Так и изменения надо там же тогда вносить, а не просить разобрать чудо код, генерируемый ею.
     
  9. Nalbagar

    Nalbagar Нуб

    хорошо. попробую
     
  10. b707

    b707 Гуру

    поэтому вы и не можете найти, куда тут вставить блок....
    и никакие примеры тут не помогут. потому авторы примеров живые люди и пишут человеческий код, а не этот "Абырвалг", как тут :)
     
  11. Nalbagar

    Nalbagar Нуб

    Уже понял. пытаюсь понять что делать