РЕШЕНО Полное сглаживание данных фоторезистора.

Тема в разделе "Arduino & Shields", создана пользователем Gritsan, 13 дек 2019.

  1. asam

    asam Гик

    Попробуй поставить
    #define BUF_SZ 128
     
  2. Gritsan

    Gritsan Нерд

    Попробовал все 4,8,16,32,64 или 128
     
  3. asam

    asam Гик

    Так если поставить минимальную яркость, то от 1,2.3 мерцать не будет, так как заменятся на 50 или что там поставить
     
    Gritsan нравится это.
  4. Gritsan

    Gritsan Нерд

    Использую 5, все равно мерцает. Но возможно минимальная яркость будет выше.
     
  5. asam

    asam Гик

    А ты можешь собрать "сырые" данные когда мерцает? Желательно 100-200 показаний

    Код (C++):
    void loop() {

      uint16_t rdata = analogRead(inputPin);
      Serial.println(rdata); //или что там у дигиспарка для вывода наружу
      uint8_t data = rdata>>2;
      data = GetNextAvrg(data);
      if (data<MIN_BR) data = MIN_BR;
      analogWrite(LED, data);
    }
     
    Gritsan нравится это.
  6. Gritsan

    Gritsan Нерд

    Код (C++):


    30                    
    29
    29
    29
    30
    29
    29
    31
    30
    30
    30
    29
    30
    29
    30
    29
    30
    30
    29
    30
    30
    30
    30
    30
    29
    29
    30
    29
    29
    30
    30
    30
    29
    30
    29
    29
    29
    30
    30
    30
    30
    29
    29
    30
    30
    29
    29
    29
    29
    29
    29
    29
    29
    29
    26
    29
    30
    29
    29
    29
    29
    29
    30
    26
    31
    29
    29
    29
    29
    30
    29
    29
    29
    29
    30
    30
    30
    29
    29
    29
    30
    30
    30
    30
    29
    29
    30
    29
    30
    30
    30
    30
    29
    29
    30
    29
    30
    30
    29
    30
    30
    29
    30
    30
    30
    30
    30
    29
    29
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    29
    28
    27
    30
    30
    30
    30
    29
    30
    30
    30
    29
    33
    30
    30
    30
    30
    30
    30
    30
    30
    34
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    30
    27
    30
    30
     
  7. asam

    asam Гик

    Добавил округление. Теперь на вышеприведенных данных дает постоянно 7 на выходе

    Код (C++):

    uint8_t GetNextAvrg(uint8_t in)
    {
        static uint8_t buf[BUF_SZ];
        static uint8_t head = 0;
        static uint8_t tail = 0;
        static uint8_t num  = 0;
        static uint16_t sum = 0;
        uint16_t ret;
       
        sum = sum + in;
        if (++num > BUF_SZ)
        {
            num = BUF_SZ;
            sum = sum - buf[tail];
            tail = ++tail & BUF_MASK;
        }
        buf[head] = in;
        head = ++head & BUF_MASK;
        //cчитаем среднее округляя результат с десятых до целого
        ret = sum * 10 / num;
        if (ret % 10 < 5)
            ret = ret / 10;
        else
            ret = ret / 10 + 1;
        return uint8_t(ret);
    }
     
     
    Gritsan нравится это.
  8. Gritsan

    Gritsan Нерд

    Все победа. Никаких мерцаний! asam спасибо большое!
     
    asam нравится это.