ИК приёмник и светодиод

Здравствуйте! Решаю следующую задачу:
ИК передатчик отправляет последовательно (через 200 мс) некоторое количество значений “2” (не более 10) и заканчивает значением “1”. Приемник при получении “2” увеличивает счетчик на 25 и при получении значения “1” UNO включает светодиод шим сигналом, равном значению счетчика.
ПРОБЛЕМА: светодиод не включается, отдельно управляется, но при задании переменной ничего не происходит. Попробовал использовать классификатор, не помогло. Что можно попробовать еще?

long W = 0;
volatile int R = 0;

#include <IRremote.h>
 IRsend irsend;

IRrecv ir_rx(2);
decode_results ir_rx_results;

unsigned long fnc_ir_rx_decode()
 {
  bool decoded=false;
  if( ir_rx.decode(&ir_rx_results))
	{
		decoded=true;
		ir_rx.resume();
	}
	if(decoded)
		return ir_rx_results.value;
	else
		return 0;
 }


void setup() {
  Serial.begin(9600);
  ir_rx.enableIRIn();

  pinMode(3, OUTPUT);

}

void loop() {
    W = (unsigned long)fnc_ir_rx_decode();
    if (W > 0) {
      if (W == 2) {
        R = R+25;
        Serial.println(R);
      }
      if (W == 1) {
        delay(1000);
         analogWrite(3, R);
        Serial.println(R);
        delay(1000);
        R = 0;
      }
    }

}

Попробуйте закомментировать стр.29 pinMode(3, OUTPUT);

Какое значение R выводится в сериал?

поясните эту фразу

Если записать как analogWrite(3, 255); вместо analogWrite(3, R); светодиод включится при получении конечного значения

В 45й строке

R = 0;

зачем?

Обнуляется значение счетчика

За комментируй 45ю строку и скажи что изменилось.
И еще…

analogWrite(3, 128);

тоже работает?

А если за 45-ой добавить W = 0;

1 лайк

Ещё раз, зачем назначать пин как цифровой выход?
В этом случае ничего делать не надо

Зачем пытаться использовать как шим цифровой пин D3?
Пробуйте так analogWrite(A3, R);

Серьёзно?

1 лайк

А как же!)))

Спойлер

long W = 0;
volatile int R = 0;

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

}

void loop() {
    if(++W > 2)
      W = 0;
    if (W > 0) {
      if (W == 2) {
        R = R+25;
        Serial.println(R);
      }
      if (W == 1) {
        delay(1000);
         analogWrite(A3, R);
        Serial.println(R);
        delay(1000);
        //R = 0;
      }
    }

}
Спойлер

P.S. Можно конечно и так
analogWrite(17, R);

Посмотри распиновку uno.

Так что на уно, что на нано…

Screenshot_35

Ты, похоже, АЦП с PWM спутал…

On an Arduino Uno, PWM output is possible on digital I/O pins 3, 5, 6, 9, 10 and 11 .

А схема в wokwi вообще дикая. Зачем к A0 прицепил?))

1 лайк

Screenshot_36

Тьма сгустилась над Ершалаимом…

2 лайка

Да , не знаю почему, но работает, а с `analogWrite(3, R); не работает.
Сам сижу сейчас в Протеусе на WinAVR, подзабыл малость ардуино

Это ещё хлеще :rofl:

Чем А3 хлеще А0?)))