Atmega8 + Ик приёмник (Подсветка рабочей поверхности)

Тема в разделе "Микроконтроллеры AVR", создана пользователем Securbond, 4 июн 2016.

Метки:
  1. Securbond

    Securbond Гуру

    Здавствуйте уважаемые форумчане. Вчера решил сделать подсветку рабочей поверхности на кухне. Идея была использовать атмегу8 (валяется 2 штуки без дела) прошить в неё ардуиновский загрузчик, и повесить на одну ногу ИК приёмник, а другой ногой управлять npn транзистором, для включения светодиодной ленты.
    Всё вроде бы просто. И загрузчик прошил без проблем и код элементарный. Но вот с подлключенной библиотекой IRemote скетч в Атмегу не лезет. Может быть есть у кого решение без этой библиотеки или кто то подскажет более легковесную библиотеку.
    Заранее спасибо....
     
  2. Airbus

    Airbus Радиохулиган Модератор

    Securbond нравится это.
  3. ZAZ-965

    ZAZ-965 Гуру

    Securbond нравится это.
  4. Securbond

    Securbond Гуру

    Сейчас далеко от компа, но показывать особо нечего. Сравнение значения кода в скетче и полученного из приемника. Если совпал - инвертировать значение порта. Там весь объём библиотека занимает...

    P.S мы с Вами про разные приемники говорим. Мне нужно не движение ловить, а команды с пульта считывать.
     
  5. Securbond

    Securbond Гуру

    Загрузчик шил через ArduinoIDE. ARDUINO в качестве программатора. Спасибо.. Завтра попробую..
     
  6. Airbus

    Airbus Радиохулиган Модератор

    А всё понял!Там в библиотеке есть примеры нужные Вам да и библиотека небольшой обьём занимает и всё работает.Если надо скину на мыло.Скетч типа такого?
    Код (C++):
    // Тестировалось на Arduino IDE 1.0.3
    //Управление СД по IR
    #include <IRremote.h>
    int RECV_PIN = 2; //вход IR
    int LED = 13;  //Выход
    IRrecv irrecv(RECV_PIN);
    decode_results results;

    void setup()
    {
      Serial.begin(9600);
      irrecv.enableIRIn(); // Запуск приемника
      pinMode(LED, OUTPUT); //Пин 13 как выход
    }

    void loop() {
      if (irrecv.decode(&results)) {
        Serial.println(results.value);
        if (results.value == 16769565) // При получении кодировки 1
        {
          digitalWrite(LED, HIGH); // Включаем светодиод
        }
        if (results.value == 16761405) // При получении кодировки 2
        {
          digitalWrite(LED, LOW); // Выключаем светодиод
        }
        irrecv.resume(); // Получаем следующее значение
      }
    }
     
    Securbond нравится это.
  7. Securbond

    Securbond Гуру

    Спасибо, Да именно так, но с этой библиотекой в Atmega8 не влезает, сейчас попробую с другой.
     
  8. ZAZ-965

    ZAZ-965 Гуру

    Кстати мысль, в библиотечном IRremote.h поотключать неиспользуемые протоколы.
    P.S. Проверил, отключил все SEND, оставил три популярных
    Код (C++):
    #define DECODE_RC5           1
    #define DECODE_NEC           1
    #define DECODE_JVC           1
    Скетч (пример Airbus) использует 5 972 байт (83%) памяти устройства. Всего доступно 7 168 байт.
     
    Последнее редактирование: 5 июн 2016
    Securbond нравится это.
  9. Securbond

    Securbond Гуру

    Спасибо... то же попробую, но библиотека NEC отлично отрабатывает (Размер скетча в двоичном коде: 3 314 байт) с нужным мне пультом, а вот с самсунгом не дружит))
     
    Последнее редактирование: 5 июн 2016
  10. Securbond

    Securbond Гуру

    Вот как то так получилось на скорую руку, одновременно уплетая сложную яишенку.
    Код (C++):
    #include <Adafruit_NECremote.h> // Connect a 38KHz remote control sensor to the pin below

    #define IRpin  7  // нога приемника
    #define LED_PIN  8 // нога светодиода
    boolean power=0;

    Adafruit_NECremote remote(IRpin);

    void setup(void) {
      Serial.begin(9600);
      pinMode(LED_PIN, OUTPUT);
    }
    void loop(void) {
      int c = remote.listen();
        Serial.print("code = ");
        Serial.println(c);  // выводим код считанной кнопки в сериал.
     
      if (c==93) { //тут пишете код своего пульта.
          power=!power;            
          digitalWrite(LED_PIN, power); //нажали, включился, еще раз нажали, выключился.
        }
    }
    Размер очень подходит для Atmega8 -
    Размер скетча в двоичном коде: 3 380 байт (из 7 680 байт максимум).
    UDP:
    Если убрать вывод в сериал, то скетч занимает смешные -
    Размер скетча в двоичном коде: 1 642 байт (из 7 680 байт максимум)
     
    Последнее редактирование: 5 июн 2016
  11. Securbond

    Securbond Гуру

    Подскажите пожалуйста.. Если не ставить внешний кварц, то нельзя использовать шим на аналоговых выходах ?
    Не хватает мозгов сделать ШИМ для плавного включения подсветки. Нога A0 не работает как нужно (, Даже с кварцом. Подозреваю, что нужно менять фьюзы, но это для меня пока темный лес.
    Код (C++):

    #include <Adafruit_NECremote.h> // Connect a 38KHz remote control sensor to the pin below

    #define IRpin  7  // нога приемника
    #define LED_PIN  9 // нога светодиода
    boolean power=0;

    Adafruit_NECremote remote(IRpin);

    void setup(void) {
    // Serial.begin(9600);
      pinMode(LED_PIN, OUTPUT);

    }
    void loop(void) {
      int c = remote.listen();
        //Serial.print("code = ");
        //Serial.println(c);  // выводим код считанной кнопки в сериал.
    if(c==93){
       if(power ==0) {     // плавное включение
         for(int i=0; i<=250; i++) {    
            analogWrite(LED_PIN, i);
            delay(50);
          }
          power =1;
          }
      else {
        if (power == 1){  // плавное выключение
          for(int i=250; i>=0; i--) {
            analogWrite(LED_PIN, i);
            delay(50);
          }
          power = 0;
        }
      }
    }
    }
     
    UDP: Разобрался..., функция - analogWrite может работать только с 9, 10 и 11 ногой Atmeaga8. (код поправил)
     
    Последнее редактирование: 5 июн 2016
    Airbus и ZAZ-965 нравится это.
  12. ZAZ-965

    ZAZ-965 Гуру

    Загрузчик optiboot поддерживает работу без кварца. Как я понял в Uno\Mini\Nano он по умолчанию, а в старых платах на Atmega8 загрузчик ATmegaBOOT. Можно собрать самому (лежит в папке C:\Program Files\Arduino\hardware\arduino\avr\bootloaders) или через онлайн-конструктор + добавить новую плату в boards.txt
    Размер свободной памяти у optiboot 7680 байт, у ATmegaBOOT 7168 байт.
    Для работы с точными таймингами я бы кварц оставил.
     
  13. Airbus

    Airbus Радиохулиган Модератор

    А я бы убрал и его. Знаю сколько занимает канитель Serial.begin(9600); даже на асме + Serial.print("code = "); Serial.println(c); // выводим код считанной кнопки в сериал. Это около 30% А на Си ещё больше около 50% и получается.Вывод в USART это ИМХО лишнее сразу получили код-сравнили-переключили.
     
  14. Securbond

    Securbond Гуру

    Спасибо всем, доделал наконец то .. Прошу админов перенести в раздел "Глядите что я сделал"
    photo_2016-06-05_18-30-44.jpg photo_2016-06-05_18-30-54.jpg photo_2016-06-05_18-31-01.jpg photo_2016-06-05_18-31-09.jpg

    Ну и конечный код .. добавил уменьшение, увеличение яркости.
    Код (C++):
    #include <Adafruit_NECremote.h> // Connect a 38KHz remote control sensor to the pin below

    #define IRpin  7  // нога приемника
    #define LED_PIN  10 // нога светодиода
    boolean power=0;
    int i=0;

    Adafruit_NECremote remote(IRpin);

    void setup(void) {
      pinMode(LED_PIN, OUTPUT);

    }
    void loop(void) {
      int c = remote.listen();

    if(c==93){ //плавное включение до максимума
          if(power ==0) {
         for( i=0; i<=250 ; i++) {
            analogWrite(LED_PIN, i);
            delay(10);
            power = 1;
          }
              }
    }
        if(c==92){ // добавляем яркость
          if (i<250){
          i=i+10;
        analogWrite(LED_PIN, i);
        power =1;
      }
       }
    if(c==78){
          if (i!=0){ // убавляем яркость
          i=i-10;
        analogWrite(LED_PIN, i);
        if (i<=0){
          power = 0;
        }
          }
    }
    if(c==94){ //выключаем
         analogWrite(LED_PIN, 0);
          power = 0;
      }
    }
    Пойду примумукивать всё это на кухню.;)
    UDP: Вот !!!
    photo_2016-06-05_19-59-09.jpg
     
    Последнее редактирование: 5 июн 2016
    Airbus нравится это.
  15. Securbond

    Securbond Гуру

    Один косяк.. всё таки на одной из кнопок (выключения) оказалась менюшка яркости телевизора :eek: ..., но она быстро исчезает... (все равно свободных кнопок нет):rolleyes:.
     
  16. Airbus

    Airbus Радиохулиган Модератор

    Молодец!Хорошо сделано!планирую сделать что то подобное но на датчике движения
     
  17. Securbond

    Securbond Гуру

    Хммм тогда Вам придётся ставить датчик освещённости. Зачем светить когда и так светло.;)
     
  18. ИгорьК

    ИгорьК Гуру

    Делюсь опытом. Там и датчик движения и освещения и IR. Логика такова, что если пришел ночью на кухню - оно слегка светится, а начал колбасу резать - яркость и время работы увеличивается.
    Ну и от пульта можно включить. Но пультом практически не пользуюсь.
    Прошу прощения уважаемого ТС что влез со своей темой. Но она мне кажется более подходящей для кухни, чем просто включение от пульта. Тем более что мы с Вами по OpenHab работаем, и тут на тебе - ручное включение...
    В любом случае прошу прощения за вторжение.
     
    Последнее редактирование: 6 июн 2016
    Airbus нравится это.
  19. Securbond

    Securbond Гуру

    Спасибо за советы. Прикрутить к опенхабу конечно интересно, но практика показала, что мои женщины сие чудо игнорируют. А на кухне основное время проводит тёща и для неё использование пульта от телевизора самый удобный вариант. А мне просто хотелось попробовать прошить голый контроллер, а раз получилось, почему бы не сделать что то полезное )). Еще раз спасибо всем за советы и помощь.
     
  20. Airbus

    Airbus Радиохулиган Модератор

    Да Игорь спасибо!Посмотрел идея интересная. Но всё же решил сделать только от движения-кухня у меня тёмная даже днём да и люблю я яркую подсветку в любое время.