Нужна помощь по коду

denisario
Offline
Зарегистрирован: 12.04.2016

Всем привет! Недавно купил arduino uno. Чуть изучил язык и делал по урокам простые схемки. Сейчас делаю rgb ночник. Но вот одна проблема: при затемнении фоторезистора включается красный. Потом ещё темнеет-зелёный, НО красный остаётся включенным. Также и с синим. Что надо исправить в коде, чтобы горел только один цвет. 

void loop() {
 
  if (analogRead(foto) < 300) digitalWrite(r, HIGH);
  else (digitalWrite (g, LOW) && digitalWrite(b, LOW));
                              
                              
  if (analogRead(foto) < 200) digitalWrite(g, HIGH);
  else (digitalWrite (r, LOW) && digitalWrite(g, LOW));
                              
                              
  if (analogRead(foto) < 50) digitalWrite(b, HIGH); 
  else (digitalWrite (r, LOW) && digitalWrite(g, LOW));  

 

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

denisario пишет:

 Что надо исправить в коде, чтобы горел только один цвет. 

А else-то при каких делах? Наоборот, надо в блок объединять. Типа

 if (analogRead(foto) < 300) {
     digitalWrite(r, HIGH);
     digitalWrite (g, LOW);
     digitalWrite(b, LOW);
}

и так же в остальных двух.

denisario
Offline
Зарегистрирован: 12.04.2016

А всё равно 3 цвета излучает

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

Вы все три блока сделали как у меня и горят все три цвета?

Тогда приводите полный скетч. а не огрызок и схему подключения.

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

Попробуйте изменить условия в строках номер 3 и 7. Так как в границы условия analogRead(foto) < 300 попадают и условия строк номер 7 и 11:  analogRead(foto) < 200; и analogRead(foto) < 50. А в границы условия строки 7 попадает условие строки 11.

В третьей строке не просто <300, а поменяйте на <300 & >=200.

В седьмой строке не просто <200, а поменяйте на <200 & >=50.

Я не настаиваю на своей правоте, но попробовать стоит.

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

Причин может быть много. Нужно увидеть весь скетч и схему. В приведенном куске скетча нет delay-ев, тогда получается постоянное мерцание диодов, что визуально проявляется как постоянное свечение.

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

Но это в том случае, когда значение < 50

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

А когда поменяете условия, то тогда конечно делеи не нужны.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Navigator, открою Вам страшную тайну - в своём сообщении можно нажать на надпись "изменить" и дописать туда. Необязательно постить несколько сообщений подряд.

P.S. Простите за оффтоп.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013
else (digitalWrite (g, LOW) && digitalWrite(b, LOW));

а это правда будет работать?

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

Tomasina пишет:

else (digitalWrite (g, LOW) && digitalWrite(b, LOW));

а это правда будет работать?

Кабы б digitalWrite было не void, то работало бы, только не так, как автору хочется (можно было бы попкорном запсаться).

А так - даже скучно, компилятор ругнётся и на этом всё веселье закончится :(

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

Jeka_M. Замечание принято. Просто хотел помочь человеку с кодом, задача как раз для моего начального уровня, но постоянно отвлекал телефон.