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

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

Метки:
  1. Securbond

    Securbond Гуру

    Помогите !!! Весб день убил ...
    Код (C++):
    #include <Adafruit_NECremote.h>
    Adafruit_NECremote remote(7);
    String command;        // String для чтения всей команды
    String temp1,temp2;    // Временные
    char inByte;            // Byte для чтения
    int pin ;                // Нога для управления
    int data ;                // Данные для управления
    int place = 0;            // Позиция, где обнаруживается знак "двоеточие".
                            // Когда следующий опрос датчика
    unsigned long timeToCheckPins;                    
    #define DELAY_TO_NEXT_CHECK_PINS 10000  // Задержка между опросами

    void setup(){
    delay(6000);
      Serial.begin(9600);
      pinMode(10, OUTPUT);
      digitalWrite(10,0);
      timeToCheckPins = millis()+ DELAY_TO_NEXT_CHECK_PINS;
    }

    void loop(){
       
      ////////// работа с UART/////////
      if (Serial.available() > 0){ // Читаем UART и формируем управляющий стринг
        inByte = Serial.read();
        if ((inByte >= 48 && inByte <=58) || inByte ==46 ) { // Цифры, двоеточие и точка
            command.concat(inByte); // command - управляющий стринг
        }
      }
      if  (inByte == 0x0A || inByte == 0x0D) { // Если знак перевода или возврата каретки
        inByte = 0;    // Обнуляем
        if (command != "") { // Это удалить потом
          Serial.println(command);
        }
        place = command.indexOf(":"); // Находим позицию ":"
        if (place == 1 || place == 2) { // Если она первая или вторая, то есть первая цифра из одного или двух знаков, иное - ошибка
         
            temp1 = command.substring(0,place); // Стринг номера управляемой ноги
            temp2 = command.substring(place+1); // Стринг полученного значения
            pin = temp1.toInt();  // Переводим стринги в цифры
            data = temp2.toInt();
            if ( pin == 10) { // Здесь ваши условия, в зависимости от управляемых ног
                analogWrite(10,data);
            }
         
            place = 0;
        }
      command = "";
      }

        if(millis() > timeToCheckPins) {  // Если пришло время проверки, то определяем новое
            timeToCheckPins = millis()+ DELAY_TO_NEXT_CHECK_PINS;
         
            String toUART = (String) 10;    // Формируем стринг для отправки через UART
            toUART += ":";
            toUART += (String) data;
            Serial.println(toUART);
                    }
     
       //  pult ();
    }
        void pult(){  //функция управления с пульта

      int c = remote.listen(); //Получаем код пульта (коды кнопок в моём пульте 78,93,92)
      if(c==78){ //Плавное включение до максимума
      int i;        
         for( i=data; i<=250 ; i++) {    
            analogWrite(10, i);
            delay(10);              
          }
          data = 250;
              }
        if(c==93){ // Слабый свет (ночник)
            analogWrite(10, 40);
        data = 40;
      }
     
    if(c==92){ // Выключаем свет
          analogWrite(10, 0);
        data = 0;
          }
       }
    Стоит раскомментировать функцию работы с пультом, перестаёт работать управление по UART ((((
     
  2. Securbond

    Securbond Гуру

    Выяснилось, что перестаёт работать только получение данных из UART (Serial.read();). Почитал статьи, похоже проблема в прерываниях. Для меня это тёмный лес. Может кто то из местных гуру сможет подсказать, как заставит работать обе функции ? - Чтение кодов пульта и получение данных из UART.
     
  3. ZAZ-965

    ZAZ-965 Гуру

    Securbond, попробуйте так
    Код (C++):
    //ваш код
    int c = remote.listen(); //ждем приход  сигнала

    //попробуйте так
    int c = remote.listen(1);  //ожидаем 1 секунду
     
  4. Securbond

    Securbond Гуру

    Попробую только завтра... Пробовал 5 сек ставить, тогда и пульт перестаёт работать...
     
  5. Securbond

    Securbond Гуру

    За 3 дня убил 3 контроллера 2 atmega8 и 1 atmega 328... Печаль... :(
     
  6. Airbus

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

    Как убил то?Залочил чтоли?
     
  7. Securbond

    Securbond Гуру

    Думаю что совсем ...
    image.jpeg
    Вверху справа Китайский dc-dc. Что то у него питание плавает (выставил 5в, потом проверяю, а там уже 11в. Предполагаю просто сжёг камни. Перестали прошиваться через SPI . Заказал новые. Нужно какой нибудь стаб. поставить на 5 в что бы уж точно не превысить подаваемое напряжение.
     
  8. Максим B

    Максим B Гуру


    А исходнички будут и схема сборки? Спасибо
     
  9. Securbond

    Securbond Гуру

    Как только приползут контроллеры из поднебесной, и решу проблему с питанием. Сырые недоделки выкладывать как то не хочется.
     
  10. Максим B

    Максим B Гуру

    Ждем )))
     
  11. Securbond

    Securbond Гуру

    Вчера весь день паял ..
    image.jpeg image.jpeg
    Работать отказывается (где то накосячил) ... Короче или делать без ESP. Только управление с пульта. Или использовать Atmega328, потому что нужен софтварный сериал, который на atmega8 у меня работать отказался.
    Честно говоря замучила меня эта подсветка, давно такого не было что бы вот так ничего не получалось... Скорее всего оставлю пока только на пульте и буду искать в чем проблема. Но лучше всего всё сделать на ESP, но пока не знаю (не пробовал), как она с IR библиотеками дружит... Извиняюсь что не порадовал, но сам пока в легком раздрайве.:(:confused:
     
  12. ИгорьК

    ИгорьК Гуру

    ИМХО, без ИК вполне можно обходиться. Сделайте логику: пара-тройка движений в течение определенного времени - полное включение и проверка раз в 15 минут, например.
    Я не пользуюсь пультом вообще, хотя такая возможность есть.
    И тогда можно на одной ESP8266 сделать. Я бы сейчас сделал так. К сожалению, уже все что можно подсвечено :)
     
  13. Максим B

    Максим B Гуру

    Да ладно ничего тут страшного, чуть позже можно еще попробовать поделать.
     
  14. Airbus

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

    Зачем софтверный сериал?Там же есть свой USART?Да и под такую задачу у Мега8 с головой ресурсов хватит.Я бы поставил (и поставил у себя) датчик движения+Тини13 а далее всё просто
    В начале темы выложил таую Байду на IR+Тини 13 и от движения включается и от пульта.Можно сделать так:считать сигнал кнопки пульта и передавать его через USART TX 6 раз в секунду через IR светодиод иммитируя сигнал пульта. При приближении сигнал ловиться TSOP (USART RX) и включается свет скажем на минуту и так по кругу как в ардуино. Пропал сигнал свет горит ещё минуту потом гаснет.
     
  15. Securbond

    Securbond Гуру

    1. По поводу софтсериала... Попробуйте прикрутить IR и обмен данными с ESP-01 На софтовом сериале эта связка работает, на железном начинается конфликт, нужно копать библиотеки и переделывать работу с прерываниями. По этому софтсериал.
    2. Датчик движения мне не подходит, по причине того что на кухне живёт тёща и если ночью у неё будет включаться свет, когда это не нужно, боюсь она будет не в восторге. Тем более что телевизор на кухне работает постоянно и пульт всегда под рукой. В коридоре например соглашусь, лучше на движение включать, и то с условием определения освещённости. Как то так.....
    P.S Может кто то объяснить ... есть два режима на разные кнопки пульта. Первый режим в цикле for передаёт в analogWrite значение от 0 до 250 ( плавное включение света до полной яркости) и второй включает (analogWrite (i,40)) слабую подсветку. Вопрос в том, почему при включении первого режима светодиод разгорается и затем контроллер уходит в перезагрузку????? Второй режим работает без всякой перезагрузки. Питание от отдельного Блока питания.
     
  16. ИгорьК

    ИгорьК Гуру

    Если у Вас работает устройство реально - пользуетесь ли Вы пультом? Если нет - зачем это нужно вообще: достаточно датчика движения.
    Я пытаюсь сказать, что в практических условиях, когда вы находитесь на кухне, хотя бы раз в пять минут вы двигаетесь. Пара зафиксированных движений на некотором участке времени - освещение включено полностью. Выключение (у меня - 7 минут) - через определенное время. Пульт надо хранить, искать... Не нужен он. Просто не нужен.
    И это не теория и размышления - а выводы из моего опыта эксплуатации.

    Опс. Сорри. Все беру обратно.
     
  17. ИгорьК

    ИгорьК Гуру

    Код покажите, пожалуйста.
     
  18. Securbond

    Securbond Гуру

    Вот по памяти.
    Код (C++):

    #include <Adafruit_NECremote.h>

    #define IRpin  8  // нога приемника
    #define LED_PIN  9 // нога светодиода

    int data=0;

    Adafruit_NECremote remote(IRpin);

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

    }
    void loop(void) {

      int c = remote.listen(1);

    if(c==93){ //плавное включение до максимума
         for( int i=data; i<=250 ; i++) {
            analogWrite(LED_PIN, i);
            delay(10);
          }
    data = 250;
           
    }
        else if(c==92){ // низкая яркость
        analogWrite(LED_PIN, 40);
        data =40;
      }
     

    else if(c==94){ //выключаем
         analogWrite(LED_PIN, 0);
          data = 0;
      }
    }

    Тестил на светодиоде... Возможно с MOSFET все будет работать.
     
  19. DIYMan

    DIYMan Guest

    А светодиод как подключён? Есть токоограничивающий резистор?
     
  20. Securbond

    Securbond Гуру

    Разумеется.. Где то на 270-330 Ом, иначе бы он сгорел при первом включении.