немогу переделать функционал под Ir

pitrus
Offline
Зарегистрирован: 22.05.2018

здраствуйте помогите плиз переделать мой скеч под управление не серез кнопки а через инфракрасный пульт. нужно реализовать чтоб пульт менял яркость + можно было колибровать температуру с пульта и настраивать время. ну и цвета менять тоже не плохо былобы

вот мой скеч

//Made by Stevehh
//
//Seven-segment clock project
//Project for arduino-nano(ATmega328P)
//
//Small guide:
// pin 2  Button for turn Off/On running leds
// pin 4  Button for change minutes
// pin 5  Button for change hours 
// your can change it on 75th-78th string



#include <iarduino_RTC.h>
#include <FastLED.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2       
#define NUM_LEDS 86         //Your number of leds 
#define LED_TYPE WS2812B     //Your chip in led-strip
#define COLOR_ORDER GRB      //Type of led-strip
#define BRIGHTNESS 255      //Brigghtness for led-strip
#define LED_PIN 9            //Logic pin for led-strip
#define max_bright 255       
#define min_bright 10       
#define bright_constant 150

CRGB leds[NUM_LEDS]; 
iarduino_RTC time(RTC_DS3231); //Your time-module(DS1302, DS1307, DS3231)
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

byte digits[12][21] = {{0,0,0, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1},  // Digit 0
                       {0,0,0, 1,1,1, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 1,1,1},   // Digit 1
                       {1,1,1, 0,0,0, 1,1,1, 1,1,1, 0,0,0, 1,1,1, 1,1,1},   // Digit 2
                       {1,1,1, 0,0,0, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 0,0,0},   // Digit 3
                       {1,1,1, 1,1,1, 0,0,0, 1,1,1, 1,1,1, 0,0,0, 0,0,0},   // Digit 4
                       {1,1,1, 1,1,1, 1,1,1, 0,0,0, 1,1,1, 1,1,1, 0,0,0},   // Digit 5
                       {1,1,1, 1,1,1, 1,1,1, 0,0,0, 1,1,1, 1,1,1, 1,1,1},   // Digit 6
                       {0,0,0, 0,0,0, 1,1,1, 1,1,1, 1,1,1, 0,0,0, 0,0,0},   // Digit 7
                       {1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1, 1,1,1},   // Digit 8
                       {1,1,1, 1,1,1, 1,1,1, 0,0,0, 1,1,1, 1,1,1, 1,1,1},   // Digit 9 
                       {1,1,1, 1,1,1, 1,1,1, 1,1,1, 0,0,0, 0,0,0, 0,0,0},   // Digit *0
                       {1,1,1, 1,1,1, 1,1,1, 0,0,0, 0,0,0, 0,0,0, 0,0,0}};  // Digit C

bool TempShow=true;
bool LedSettings= false;
bool Dot = true; 
int last_digit = 86;
long ledColor = CRGB::Red;
long ColorTable[16] = {
  CRGB::Amethyst,
  CRGB::Aqua,
  CRGB::Red,
  CRGB::Chartreuse,
  CRGB::DarkGreen,
  CRGB::DarkMagenta,
  CRGB::DarkOrange,
  CRGB::DeepPink,
  CRGB::Fuchsia,
  CRGB::Gold,
  CRGB::GreenYellow,
  CRGB::LightCoral,
  CRGB::Tomato,
  CRGB::Salmon,
  CRGB::Red,
  CRGB::Orchid
};

void setup() {
    sensors.begin();  
    delay(300);
    time.begin();
    FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS);
    FastLED.setBrightness(255);
    pinMode(13, OUTPUT);           
    pinMode(7, INPUT_PULLUP); //Turn Off/On running leds
    pinMode(4, INPUT_PULLUP); //Change minutes
    pinMode(5, INPUT_PULLUP); //Change hours
  
}

void BrightnessCheck() {
    const byte sensorPin = A0;                 // light sensor pin
    const byte brightnessLow = 10;            // Low brightness value
    const byte brightnessHigh = 255;          // High brightness value
    int sensorValue = digitalRead(sensorPin); // Read sensor
    if (sensorValue != 0) {
      LEDS.setBrightness(brightnessHigh);
                          }
    else {
      LEDS.setBrightness(brightnessLow);
         }
}

int Get_Time() { 
  time.gettime();
  byte hour = time.Hours;
  byte minute = time.minutes;
  byte second = time.seconds;
  if (second % 2 == 0) {Dot = true;}
  else {Dot = false;};
  return (hour * 100 + minute);
};
void TimeToArray() {
int Now = Get_Time(); 
int cursor = 86; 

  if (Dot) {
    leds[42] = ledColor;  //LED flashing
    leds[43] = ledColor;
  }else {
    leds[42] = 0x000000;
    leds[43] = 0x000000;
  };

  for (int i = 1; i <= 4; i++) {
    int digit = Now % 10; 
    if (i == 1) {     
      cursor = 0; 
      for (int k = 0; k <= 20; k++) {
        if (digits[digit][k] == 1) {
          leds[cursor] = ledColor;
        }
        else if (digits[digit][k] == 0) {
          leds[cursor] = 0x000000;
        };
        cursor ++;
      };

      if (digit != last_digit)
         {if(LedSettings == 1){};
          ledColor = ColorTable[random(16)];
         }
        last_digit = digit;
    }
    else if (i == 2) {
      cursor = 21;
      for (int k = 0; k <= 20; k++) {
       if (digits[digit][k] == 1) {
          leds[cursor] = ledColor;
        }
        else if (digits[digit][k] == 0) {
          leds[cursor] = 0x000000;
        };
       cursor ++;
      };
    }
    else if (i == 3) {
    cursor = 44;
      for (int k = 0; k <= 20; k++) {
        if (digits[digit][k] == 1) {
          leds[cursor] = ledColor;
        }
       else if (digits[digit][k] == 0) {
          leds[cursor] = 0x000000;
        };
        cursor ++;
      };
    }
    else if (i == 4) {
     cursor = 65;
     for (int k = 0; k <= 20; k++) {
        if (digits[digit][k] == 1) {
          leds[cursor] = ledColor;
        }
        else if (digits[digit][k] == 0) {
          leds[cursor] = 0x000000;
        };
        cursor ++;
      };
    };
      Now /= 10;
    };
  };
void TimeChange(){
    time.gettime();
    int SysHour = time.Hours;
    int SysMin = time.minutes;
    bool ChHourSys = !digitalRead(5);
       if (ChHourSys == 1){
        if(SysHour<23){
          SysHour++;
          time.settime(-1,-1,SysHour,-1,-1,-1,-1);  // 0  сек, 51 мин, 21 час, 27, октября, 2015 года, вторник
        }else{
          SysHour=0;
          time.settime(-1,-1,SysHour,-1,-1,-1,-1);  // 0  сек, 51 мин, 21 час, 27, октября, 2015 года, вторник
        }
         delay(500);
       }
    bool ChMinSys = !digitalRead(4);
       if (ChMinSys == 1){
        if(SysMin<59){
          SysMin++;
          time.settime(-1,SysMin,-1,-1,-1,-1,-1);  // 0  сек, 51 мин, 21 час, 27, октября, 2015 года, вторник
        }else{
          SysMin=0;
          time.settime(-1,SysMin,-1,-1,-1,-1,-1);  // 0  сек, 51 мин, 21 час, 27, октября, 2015 года, вторник
        };
         delay(500);
        };


}

void TempToArray(){
  if (time.seconds < 20 ) { ////////////////////////////////////////////////////////////////////
    TempShow = false;
    return;
  } else {
  if (time.seconds > 20 ) {
  TempShow = true;
  delay(3000);
sensors.requestTemperatures();
float cel = sensors.getTempCByIndex(0);
cel = cel*100+150;
int celsius = trunc(cel);  
  int cursor = 86;                     // last led number
    
    leds[42]=ledColor;
    leds[43]=0x000000;
      
  for(int i=1;i<=4;i++){
    int digit = celsius % 10;           // get last digit in time
    if (i==1){

      cursor = 0;      
      for(int k=0; k<=20;k++){ 
        if (digits[10][k]== 1){leds[cursor]=ledColor;}
         else if (digits[10][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
    }
    else if (i==2){
      cursor =21;    
      for(int k=0; k<=20;k++){       
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    else if (i==3){
      cursor =44;
      for(int k=0; k<=20;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    else if (i==4){
      cursor =65;
      for(int k=0; k<=20;k++){ 
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      }
    celsius /= 10;
  };
  };
  }; 
}

void loop() {
  BrightnessCheck();  // Check brightness
  TimeChange();
  TimeToArray();      // Get leds array with required configuration
  TempToArray();
  FastLED.show();     // Display leds array
}

за ранее спасибо

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

А препод чо говорит?

b707
Offline
Зарегистрирован: 26.05.2017

читайте правила форума - на форуме не делают работу за других. Мы можем вам помочь с вашей задачей при условии, что вы покажете, что пытались решить ее сами. Обязательгым условием является свой собственный код, направленный на решение задачи.

В выложенном вами скетче нет никаких попыток добавления IR управления. так что пока помогать вам причин нет.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

pitrus пишет:

здраствуйте помогите плиз переделать мой скеч под управление не серез кнопки а через инфракрасный пульт. нужно реализовать чтоб пульт менял яркость + можно было колибровать температуру с пульта и настраивать время. ну и цвета менять тоже не плохо былобы

вот мой скеч

за ранее спасибо

Спасибо - это очень много. Вот 15т.р. - это нормально.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

54 стока ни о чем не говорит?

b707
Offline
Зарегистрирован: 26.05.2017

pitrus пишет:

ну если на то пошло.

вот добавил функции ИР и смены яркость но всеравно как реализовать подствойку времени и смену цвета пока незнаю

 

смену цвета - так же как яркость. Текущий цвет задается в строке 54, в строке 55 начинается таблица всех доступных цветов.

В процедуре приема команд с пульта заводите код еще одной кнопки по аналогии с яркостью - и на эту кнопку вешаете увеличение номера цвета из таблицы. В итоге у вас при нажатии кнопки 16 цветов будут менятся по кругу.

 

Подстройку времени сделать с пульта сложнее, но принциптот же - на одну кнопку заводите увеличение часов на единицу, на другую - увеличение минут на 10 и на третью - минут на один...

sadman41
Offline
Зарегистрирован: 19.10.2016

Проблема может быть в чем угодно.

sadman41
Offline
Зарегистрирован: 19.10.2016

Я-то как раз имею понятие и ответ соответствует заданному вопросу. Абсолютли.

b707
Offline
Зарегистрирован: 26.05.2017

про коды повтора кнопок в курсе?

Пишите вопросы четче, чтоб не получать "остроумные" ответы.  В каких ситуацих выдает "несколько кодов"? "несколько" - это сколько? - два, пять, десять? какие из них разные и какие совпадают?

b707
Offline
Зарегистрирован: 26.05.2017

pitrus пишет:

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

так вы сами насажали в код задержек. Зачем у вас в процедуре настройки времени две задержки по 500 мс? Более того - зачем у вас процедуре показа температуры задержка в 3 сек (3000 мс)? - с ней у вас вообще этот код нормально работать не будет

Я знаю тот код, который вы брали за основу, в нем никаких задержек не было.

b707
Offline
Зарегистрирован: 26.05.2017

вариантов много. Можно обнулять results.value, а можно добавить флаг "новые данные. Приняли сигнал с пульта - выставили флаг. Обработали один раз - сбросили. И реагировать на команду с пульта. только когда флаг выставлен

sadman41
Offline
Зарегистрирован: 19.10.2016

Поищи сам. Тебе же надо, а нам трудно.

b707
Offline
Зарегистрирован: 26.05.2017

pitrus - если вам не отвечают, то вариантов может быть много:

 - никто не знает ответа
 - всем лень или недосуг, нет настроения
-  неохота связываться с нубом, слишком много обьяснять...
-  личные мотивы и тд

Главное, что вам стоит усвоить - вам никто ничем не обязан. Ответили - скажите спасибо, не ответили - ищите ответы в другом месте или разбирайтесь сами.

А обсирать форум. только потому что никто не берется с вами за ручку выписывать буковки в прописи - не дело.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

ОК, сжалюсь над новичком и дам ссылку на флаги - ссылка.

b707
Offline
Зарегистрирован: 26.05.2017

pitrus, когда вы только сюда пришли -  вас сразу предупредили, что писать код за вас никто не будет. 

Я дал вам несколько ответов по делу, хотя вы постоянно оскорбляете форум.  Но "пережевывать" тему за вас я не собираюсь

вы получили направление  - дальше искать нужно самостоятельно