Инфракрасная отправка не работает. Неправильное конфигурирование?
Edit: Принял некоторые советы снизу, но это все еще не работает. Я думаю, что это, вероятно, блокирующий код, но, пожалуйста, скажите мне, как я мог бы исправить его, чтобы отправить действительный инфракрасный сигнал, ПРИМЕЧАНИЕ: На самом деле я бы не стал кодировать его так, как это я просто пытаюсь узнать и понять, как это сделать, а затем сделать его лучше после:
uint8_t Status;
uint8_t Counter;
const uint32_t Code[] = {4507,4507,573,1694,573,1694,573,1694,573,573,573,573,573,573,573,573,573,573,573,1694,573,1694,573,1694,573,573,573,573,573,573,573,573,573,573,573,573,573,1694,573,573,573,573,573,573,573,573,573,573,573,573,573,1694,573,573,573,1694,573,1694,573,1694,573,1694,573,1694,573,1694,573,46560};
void setup() {
pinMode(4, OUTPUT);
}
void loop() {
while(Counter<70) {
if (Status=1) {
digitalWrite(4, HIGH);
Status=3;
while(Status=3) {
delayMicroseconds(26);
digitalWrite(4, HIGH);
delayMicroseconds(26);
digitalWrite(4, LOW);
}
delayMicroseconds(Code[Counter]);
Status=2;
Counter++;
} else {
if (Status=2) {
digitalWrite(4, LOW);
Status=0;
while(Status=0) {
delayMicroseconds(26);
digitalWrite(4, HIGH);
delayMicroseconds(26);
digitalWrite(4, LOW);
}
delayMicroseconds(Code[Counter]);
Status=1;
Counter++;
}
}
}
}
@Macaroni, 👍-1
Обсуждение1 ответ
Здесь есть две основные ошибки - одна из них связана с вашим пониманием времени, а другая-с вашим пониманием того, как работает ИК-связь.
Во - первых, тайминги-это как ВКЛЮЧЕННЫЕ, так и ВЫКЛЮЧЕННЫЕ тайминги. Вы не просто включаетесь на определенный промежуток времени - вы включаетесь на определенный промежуток времени, а затем выключаетесь на другой определенный промежуток времени.
Таким образом, для таймингов в вашем коде 4507,4507,573,1694,573,...и т.
Д.... вы должны:
- Включите
- Подождите 4507us
- Выключите
- Подождите 4507us
- Включите
- Подожди 573us
- Выключите
- Подожди 1694us
- Включите
- Подожди 573us
- ... и т.д...
В вашем коде нет времени "выкл", только время от времени.
Во-вторых, это ваше понимание ИК-коммуникаций. Это не требует включения или выключения светодиода в течение определенного времени. Все не так просто. Вместо этого вы управляете модуляцией светодиода. Когда светодиод ИК - пульта дистанционного управления "горит", он не просто включается-он быстро включается и выключается. Приемник проверяет наличие или отсутствие этого быстрого включения и выключения света. Это "несущая частота" сигнала, и она должна соответствовать тому, что ищет приемник.
Обычно это составляет от 30 кГц до 50 кГц, в зависимости от приемника.
Поэтому вам нужен какой-то способ генерирования этого быстрого сигнала включения-выключения. Обычно это делается с помощью ШИМ ИК-библиотек и переключения между 0% и 50% рабочим циклом для периодов выключения и включения сигнала, который вы хотите отправить.
Так что гораздо проще просто использовать библиотеку, которая выполняет всю эту основную работу за вас.
Спасибо, я попробую это и посмотрю, сработает ли это <3, @Macaroni
Я отредактировал свой вопрос, потому что ваш должен работать, но это не так., @Macaroni
Вы рассмотрели первую проблему, но ничего не сделали со второй проблемой., @Majenko
Задержка в микросекундах(26) составляет 38 кГц :/, @Macaroni
Это я могу на 100% проверить, я знаю, так как это упоминалось во всех материалах, которые я читал, @Macaroni
За исключением некоторых проблем: 1. "Цифровая запись" и "в то время как" требуют времени, поэтому ваши 38 кГц будут больше похожи на 10 кГц, если вам повезет. 2. У вас нет возможности когда-либо покинуть свой цикл " пока`. 3. Вы выполняете задание, а не сравнение, которое всегда будет верным., @Majenko
можете ли вы предоставить мне какой-нибудь базовый упрощенный код для того, что мне нужно сделать? :>, @Macaroni
`если (Статус==2) "- это сравнение, "если (статус=2)" - это назначение., @hcheung
Да: используйте библиотеку. Вы пытаетесь выполнить что-то очень сложное и даже не понимаете базового синтаксиса библиотеки., @Majenko
Я имею в виду, что могу пользоваться библиотекой. Я просто хочу понять, как это работает, и я хочу сделать свою собственную упрощенную версию. Удовлетворение от того, что вы делаете это самостоятельно и просто более гибко, так как он маленький, и я могу читать его лучше, и не только это улучшает его производительность, даже если она незначительна., @Macaroni
Начните с чего-то более простого. ИК требует точного времени и глубокого знания внутренних компонентов микроконтроллеров., @Majenko
оки :~ спасибо :>, @Macaroni
- avrdude ser_open() can't set com-state
- Float печатается только 2 десятичных знака после запятой
- ошибка: espcomm_upload_mem failed при загрузке скетча
- Печать массива байтов на экране последовательного монитора Arduino IDE
- Разные и самые быстрые способы вычисления синусов и косинусов в Arduino
- Arduino IDE Отказано В Разрешении На Загрузку, Ubuntu
- Нет заголовочных файлов (.h) в Documents\Arduino\libraries\arduino_144469 с демонстрационным кодом
- Связь Arduino master/slave с использованием RS485
Непонятно, в чем именно заключается проблема. Возможно, у вас есть некоторые основные заблуждения. Например, что инфракрасные пульты (а также большинство библиотек) используют фиксированную модуляцию для импульсов (например, на 38 кГц), чтобы получить лучшую помехоустойчивость. Как вы получаете ИК-сигнал? Вам нужно послать ИК-сигнал, который приемник поймет., @chrisl
Необработанные инфракрасные тайминги, по-моему, не нуждаются в указании Гц. если вы постоянно мигаете светодиодом с частотой 1 Гц, то он будет мигать 1 раз в секунду. 2 Гц 2 раза в секунду. Фактические инфракрасные таймеры в переменной Buf не нужно указывать частоту, так как они являются необработанными. Таким образом, код выше начинается с первого 4507, и это будет задержка. (время). Я считаю, что это так работает после того, как прочитал много об инфракрасном. Но проблема в том, что я не знаю, как это реализовать. делаю ли я задержку flash для 4507, а затем отключаю ее для 4507? Я знаю, как это работает, но мне нужна помощь в отладке этого, @Macaroni
Нет, я очень уверен, что вы не просто посылаете необработанные циклы включения и выключения со светодиодом, хотя это зависит от того, что вы используете для приема сигнала. Ты не ответил на этот вопрос. Так как же вы принимаете сигнал?, @chrisl
Я не смотрю на принимающую сторону., @Macaroni
оооо, как ты проверяешь, работает он или нет? Звучит как проверка выключателя, но не глядя на фактический свет, если он действительно загорается., @chrisl
Если телевизор включен, он работает :/, @Macaroni
если (статус=1) " является назначением, это не будет работать так, как вы думаете. Это должно быть сравнение:
если (статус==1)". Аналогично для операторов 'while (Status=2)и других операторов' if()
иwhile()
в вашем коде. Кроме того, ваши циклы "while () {}" никогда не выйдут, потому что значение "Status" никогда не меняется внутри цикла., @StarCat`Если телевизор включен, то он работает"... не все они одинаковы ... что такое бренд и модель телевизора?, @jsotola