RGB было на HEX теперь иначе

Тема в разделе "Arduino & Shields", создана пользователем moskovskiy82, 8 май 2017.

  1. moskovskiy82

    moskovskiy82 Нерд

    Использовал Sketch с контроллером, который передавал HEX значения. Сейчас же выдает уже готовые значения вида
    244,125,168

    Но вот как поменять код в void setColor(String hexstring)... Помогите

    Код (C++):
    #define SN "Temperature Humidity Gas Sensor"
    #define SV "2.1"

    #define MY_NODE_ID 31
    //#define MY_REPEATER_FEATURE

    //Disable blinking
    #define MY_DEFAULT_ERR_LED A10
    #define MY_DEFAULT_TX_LED A10
    #define MY_DEFAULT_RX_LED A10

    #define MY_RADIO_NRF24

    #include <SPI.h>
    #include <MySensors.h>
    #include <DHT.h>
    #include <math.h>
    #include <Wire.h>

    const int MQ_Pin = A4;
    #define RED_PIN 3
    #define GREEN_PIN 5
    #define BLUE_PIN 6
    #define DHT_PIN 8

    #define SAVE_LIGHT_STATE 1
    #define SAVE_DIMMER_LEVEL 2
    #define SAVE_LIGHT_COLOR 3
    #define RELAY_ON 1
    #define RELAY_OFF 0
    long RGB_values[3] = {0,0,0};
    String hexstring;

    int RValue;
    int GValue;
    int BValue;
    int CurrentLevel;

    //Define connections
    #define CHILD_ID_HUM 7
    #define CHILD_ID_TEMP 8
    #define CHILD_ID_MQ 9

    DHT dht;

    //MQ+DHT
    long MQ_Millis = 0;
    long MQ_interval = 60000;
    long DHT_Millis = 0;
    long DHT_interval = 60000;
    MyMessage msgHum(CHILD_ID_HUM, V_HUM);
    MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
    MyMessage msgMQ(CHILD_ID_MQ, V_LEVEL);

    void before()
    {
        dht.setup(DHT_PIN);
        pinMode(RED_PIN, OUTPUT);
        pinMode(GREEN_PIN, OUTPUT);
        pinMode(BLUE_PIN, OUTPUT);
        TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);

    }
    void setup()
    {
    }
    void presentation()
    {
      sendSketchInfo(SN, SV);
      present(CHILD_ID_HUM, S_HUM);
      present(CHILD_ID_TEMP, S_TEMP);
      present(CHILD_ID_MQ, S_AIR_QUALITY);
      present(0, S_RGB_LIGHT);
    }

    void loop()
    {
    unsigned long DHT_Current_Millis = millis();
    if((unsigned long)(DHT_Current_Millis - DHT_Millis) >= DHT_interval)
        {
        DHT_Millis = DHT_Current_Millis;
        delay(dht.getMinimumSamplingPeriod());
        float temperature = dht.getTemperature();
        float humidity = dht.getHumidity();
        if (isnan(temperature))
            {Serial.println("Failed reading temperature from DHT");}
        if (isnan(humidity))
            {Serial.println("Failed reading humidity from DHT");}
        else
            {
            send(msgTemp.set(temperature, 1));
            send(msgHum.set(humidity, 1));
            Serial.print("T: ");
            Serial.println(temperature);
            Serial.print("H: ");
             Serial.println(humidity);
            }
      }

    unsigned long MQ_Current_Millis = millis();
    if((unsigned long)(MQ_Current_Millis - MQ_Millis) >= MQ_interval)
        {
        MQ_Millis = MQ_Current_Millis;
        float mq_reading = analogRead(MQ_Pin);
        if (isnan(mq_reading))
          { Serial.println("Failed mq_reading"); }
        else
            {
            send(msgMQ.set(mq_reading, 1));
            Serial.print("MQ: ");
            Serial.println(mq_reading);
            }
        }
    }
    void receive(const MyMessage &message) {
        if (message.type==V_RGB)
        {
            hexstring = message.getString();
            Serial.print("RGB command: ");
            Serial.println(hexstring);
            setColor(hexstring);
        }
      else if (message.type==V_PERCENTAGE)
        {
        int dimLevel = message.getInt(); //0-100%
        Serial.print("Dim command: ");
        Serial.println(dimLevel);
        setDimLevel(dimLevel);
        saveState(SAVE_DIMMER_LEVEL, dimLevel);
        }
        else if (message.type==V_STATUS)
        {
            if(message.getBool() == RELAY_ON)
            {
            setColor("FFF1E0");
            saveState(SAVE_LIGHT_STATE, RELAY_ON);
            }
            if(message.getBool() == RELAY_OFF)
            {
            analogWrite(RED_PIN, 0);
            analogWrite(GREEN_PIN, 0);
            analogWrite(BLUE_PIN, 0);
            saveState(SAVE_LIGHT_STATE, RELAY_OFF);
            }
        }
    }

    void setDimLevel(int level)
    {
        level = level > 100 ? 100 : level;
        level = level < 0 ? 0: level;
        int delta = ( level - CurrentLevel) < 0 ? -1 : 1;
        RValue = (int)(level / 100. * RValue);
        BValue = (int)(level / 100. * BValue);
        GValue = (int)(level / 100. * GValue);
        analogWrite(RED_PIN, RValue);
        analogWrite(GREEN_PIN, GValue);
        analogWrite(BLUE_PIN, BValue);
        CurrentLevel = level;
    }
    void setColor(String hexstring)
    {
        long number = (long) strtol( &hexstring[0], NULL, 16);
        Serial.print("Color long: ");
        Serial.println(number);
        RValue = number >> 16;
        GValue = number >> 8 & 0xFF;
        BValue = number & 0xFF;
        Serial.print("Color: ");
        Serial.println(hexstring);
        Serial.print("Red: ");
        Serial.println(RValue);
        Serial.print("Green: ");
        Serial.println(GValue);
        Serial.print("Blue: ");
        Serial.println(BValue);
        analogWrite(RED_PIN, RValue);
        analogWrite(GREEN_PIN, GValue);
        analogWrite(BLUE_PIN, BValue);
    }
     
  2. ostrov

    ostrov Гуру

    Код (C++):
    Serial.println(hexstring,HEX);
     
  3. moskovskiy82

    moskovskiy82 Нерд

    Разве после этого он разложит сообщение
    0,218,29?
    Обязательно попробую
     
  4. ostrov

    ostrov Гуру

    Что значит разложит? Вы задачу сформулируйте так чтобы было понятно не только вам.
     
  5. moskovskiy82

    moskovskiy82 Нерд

    Скетч в первом посте был адаптирован под контроллер (openhab) - который передавал значения цвета в hex. Ардуино получал значения вида ffffff и уже раскладывал их в значения PWM ардуино по каналам.
    Сейчас сменил контроллер и он передает уже не hex а именно 3 значения 0-255 в виде сообщения 255,255,255 вот отсюда и вопрос как переписать скетч, чтобы убрать hex составляющую
     
  6. ostrov

    ostrov Гуру

    Для контроллера нет понятия hex, bin, dec или oct. Все это для людей, а для контроллера любая система исчисления двоична. Поэтому абсолютно пофиг в каком виде информация передается в контроллер, лишь бы правильно. 255, 255, 255 это то же самое что 0xFF, 0xFF, 0xFF, что есть максимальная яркость всех трех каналов.
     
  7. moskovskiy82

    moskovskiy82 Нерд

    Согласен. Но контроллер дальше передает это через MQTT на исполнителя.
    А вот он уже ожидает увидеть либо hex, bin, dec или oct. И в нем уже заложено определенное преобразование (как выше). Как результат если ему послать dec 255,255,255 а он ожидает строку hex - его несколько это смущает.
    Значит варианта 2. Или настроить контроллер на отсылку ожидаемой исполнителем информации или изменить код исполнителя. Вот со вторым и прошу помощи.
     
  8. ostrov

    ostrov Гуру

    Я написал выше как заставить метод Serial выдавать числа в HEX. Если требования не совпадают по стандарту с тем что выдает Serial, то придется городить огород, а именно готовить строку из чисел.