Мигающий светодиод без delay, с потенциометром, почему-то не работает

Electroniume
Offline
Зарегистрирован: 05.06.2018

Написал в эмуляторе https://www.tinkercad.com/ такой скретч:

const int min=0;
const int max=1023;

int periodMin=10;
int periodMax=3000;

// ==============================================

int ledPin = 13;
int regPin = A0;

void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(regPin, INPUT);
}

unsigned long currentMillis=0;
unsigned long prevMillis=0;
int period=0;
int ledState=LOW;

void loop()
{
  /*
  Serial.begin(9600);
  Serial.println(analogRead(regPin));
  delay(100);
  */
  
  period=map(analogRead(regPin),min,max,periodMin,periodMax);
  
  currentMillis=millis();
  if (currentMillis - prevMillis > period) {
    prevMillis = currentMillis;
    if (ledState==LOW)
      ledState=HIGH;
    else
      ledState==LOW;
    digitalWrite(ledPin,ledState);
  }
}

Цель - светодиод должен моргать без delay, при этом потенциометром должна быть возможность изменять частоту включения/выключения светодиода.

На эмуляторе светодиод включается по прошествии периода, но почему-то не выключается.

Подскажите, где я напутал?

Или может это эмулятор косячит а на плате всё заработает?...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А с чего ему вдруг выключаться, если Вы его нигде и никогда не выключаете? Посмотрите  внимательно на строку №39. Вас ничто не смущает?

Ну, и заодно уж, сравнение в строке 34 проихсодит между знаковыми и беззнаковыми переменными. Это всегда плохая идея.

bwn
Offline
Зарегистрирован: 25.08.2014

А чтобы не блукать в дебрях else-if :
digitalWrite(ledPin, !digitalRead(ledPin));

Electroniume
Offline
Зарегистрирован: 05.06.2018

ЕвгенийП пишет:

А с чего ему вдруг выключаться, если Вы его нигде и никогда не выключаете? Посмотрите  внимательно на строку №39. Вас ничто не смущает?

Вот чуствую что да, тут у меня какой-то косяк, но никак не могу понять какой именно. Если выключено - включить - иначе (если включено) - выключить. Что тут не так?

bwn пишет:

А чтобы не блукать в дебрях else-if :
digitalWrite(ledPin, !digitalRead(ledPin));

вот это да, работает! спасибо.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Здесь написано не это.

Здесь

39      ledState==LOW;

написано, проверить равно ли ledState LOW, результат отбросить, ибо пофиг, идём дальше. 

b707
Offline
Зарегистрирован: 26.05.2017

Electroniume пишет:

Вот чуствую что да, тут у меня какой-то косяк, но никак не могу понять какой именно. Если выключено - включить - иначе (если включено) - выключить. Что тут не так?

Вы сравните посимвольно свои строки "включить" и "выключить" - там синтаксическая ошибка

Electroniume
Offline
Зарегистрирован: 05.06.2018

Нашёл я свою ошибку.

if (ledState==LOW)
      ledState=HIGH;
    else
      ledState=LOW;
    digitalWrite(ledPin,ledState);

Знак равенства нужно было ставить одинарный! Ошибся.

Спасибо! Всё понятно.