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

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

Метки:
  1. ИгорьК

    ИгорьК Гуру

    Код несложный. В чем разница между 250 и 40? в том, что они останавливают работу на разное время.
    В коде есть библиотека, которая делает что-то там свое. Полагаю, в перезагрузку устройство отправляет именно она, когда переполняется какой-то там ее таймер.
    Что надо делать? Избавляться от delay.
    Как ? Писать класс. Суть - есть целевое значение установки света. Пока оно не достигнуто - класс апдейтится.
    К сожалению сейчас просто не могу заняться. Но, может, сами?
     
  2. Securbond

    Securbond Гуру

    Вообще грешу на приёмник. Сейчас стоит такой - http://www.chipdip.ru/product/tsop31238-photomodule-w-38khz-oscil-1/
    Раньше на маленьком приемнике ввиде темного светодиода типа такого -
    http://www.chipdip.ru/product/him602v-photodiode-ir-receiver-vertical/
    проблем не возникало ( но я его удачно спалил подав повышенное напряжение).
     
  3. ИгорьК

    ИгорьК Гуру

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

    Вложения:

    • Desktop.zip
      Размер файла:
      2,5 КБ
      Просмотров:
      265
  4. Securbond

    Securbond Гуру

    Не понял что значит Останавливает работу???.
    В моем понимании он просто передаёт установленный уровень шим на выход контроллера.
     
  5. ИгорьК

    ИгорьК Гуру

    Код (C++):
         for( int i=data; i<=250 ; i++) {
            analogWrite(LED_PIN, i);
            delay(10);
          }
    Этот участок кода тормозит общую работу на 10х250 миллисекунд = 2,5 секунды. Это может быть много для тех процессов, которые задействуют таймеры библиотеки.

    Можно проще. В лупе по времени проверять достижение целевой установки света, если не достигнуто - делать следующий шаг. Сейчас накидаю.
     
    Последнее редактирование: 12 июл 2016
  6. Securbond

    Securbond Гуру

    Посмотрел схемы данного приемника в которых между ногами питания ставится кондер. После его установки проблема стала появляться реже... Так что и в приемнике может быть проблема.
    Это понятно. Но раньше все работало как часы ( пока не заморочился с ESP и не убил три контроллера и 2 Ик приёмника). Доползу завтра до дома, попробую запустить на старой, 100%рабочей макетке. На которой все работало. И ещё раз сравню со старым кодом. Возможно что то добавил лишнее ( или убрал). Хотя код на столько прост, что ...... Чудес то не бывает )))
     
  7. ИгорьК

    ИгорьК Гуру

    Код (C++):

    #include <Adafruit_NECremote.h>

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

    unsigned long timeTocheckLed = 0;
    unsigned long delay = 10;
    uint8_t targetLight = 0;
    uint8_t lightNow = 0;
    bool needChange = false;

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

    void loop(void) {

        int c = remote.listen(1);

        if(!needChange) {
            switch (c) {
                case 93:
                    targetLight = 255;
                    needChange = true;
                break;
                case 92:
                    targetLight = 40;
                    needChange = true;
                break;
                case 94:
                    analogWrite(LED_PIN, 0);
                    targetLight = 0;
                    lightNow = 0;
                    needChange = false;
                break;
            }
        }
       if (needChange && (millis()> timeTocheckLed)) {
           timeTocheckLed = millis() + delay;
           if  (targetLight != lightNow) {
               lightNow++;
               analogWrite(LED_PIN, lightNow);
           }
       else {
            needChange = false;
        }
    }
     
    Можно проще. В лупе по времени проверять достижение целевой установки света, если не достигнуто - делать следующий
     
    Последнее редактирование: 12 июл 2016
    Securbond нравится это.
  8. ИгорьК

    ИгорьК Гуру

    А при чем здесь ESP?
     
  9. ИгорьК

    ИгорьК Гуру

    И тот и другой выдают на вход МК цифровой сигнал размером не более чем питающее их напряжение. Как это может отправить что-то в перезагрузку? Дело не в этом.
     
  10. ИгорьК

    ИгорьК Гуру

    Или так, для плавного гашения. Код неоптимальный, но работать должен:
    Код (C++):

    #include <Adafruit_NECremote.h>

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

    unsigned long timeTocheckLed = 0;
    unsigned long delay = 10;
    uint8_t targetLight = 0;
    uint8_t lightNow = 0;
    uint8_t incr = 1;

    needChange = false;

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

    void loop(void) {
        int c = remote.listen(1);
        if(!needChange) {
            if(c >91 && c < 95) {
                needChange = true;
            }
            switch (c) {
                case 93:
                    targetLight = 255;
                break;
                case 92:
                    targetLight = 40;
                break;
                case 94:
                    targetLight = 0;
                break;
            }
            if(targetLight > lightNow) {
                incr = 1
            }
            else if ((targetLight < lightNow)){
                incr = -1
            }
        }
        if (needChange && (millis()> timeTocheckLed)) {
            timeTocheckLed = millis() + delay;
            if (targetLight != lightNow) {
                lightNow = lightNow + incr;
                analogWrite(LED_PIN, lightNow);
            }
            else{
                needChange = false;
            }
        }
    }
     
     
    Последнее редактирование: 13 июл 2016
    Securbond нравится это.
  11. Securbond

    Securbond Гуру

    Спасибо ... Будет время попробую. Туго у меня с программированием. Сказывается постоянная работа руками, а не головой. А мозг нуждается в тренировках.
     
  12. Securbond

    Securbond Гуру

    Пробую ещё разок ..... Заодно испытаю скетчи выше.

    image.jpeg image.jpeg image.jpeg image.jpeg image.jpeg image.jpeg

    Нашёл у ребёнка цветную глянцевую бумагу. Очень интересный эффект получился. Тонер впитал глянцевую краску...
     
    Последнее редактирование: 13 июл 2016
  13. Securbond

    Securbond Гуру

    Ура, все заработало. С моим скетчем то же норм. Delay задерживает не надолго, на удобстве не сказывается. Предусмотрел штыри UART. Может всётаки прикручу потом ESP. Пока пусть так поработает)
    Вот платка если нужно ( D это диод М7, и рядом стабилитрон на 5.1v. Поставил от греха подальше, что бы в случае неожиданного повышения напряжения сгорел он, а не контроллер) -
     

    Вложения:

    Последнее редактирование: 13 июл 2016
    ИгорьК нравится это.
  14. Securbond

    Securbond Гуру

    Я конечно упрямый овен, но эта ..}#%^*%,>%$$!.. Мне уже все все нервы вымотала. Чуть позже включаю .... Не работает :mad::mad::mad:. Проверил питание-норм, Ик- норм. Переставил контроллер на макетку- всё работает. Слов нет... Одни эмоции.
    Хотел задать вопрос спецам.. - можно ли использовать мелкие smd конденсаторы для кварцевого резонатора ???

    Ещё немного и вставлю обычную кнопку :mad::mad::mad:
     
  15. Securbond

    Securbond Гуру

    Выпаял резистор с reset на vcc, и все заработало как часики.