Управление светодиодами с разных пиноы

zimba
Offline
Зарегистрирован: 21.02.2021

написал код, при вводе в COM порт определенное значение загорается один и тот же светодиод

написал код посмотрите пожалуйста где может быть ошибка

#define RED   11                      
#define GREEN 10                      
#define BLUE5   9                      
#define BLUE4    8 
#define BLUE3   7 
#define BLUE2   6 
#define BLUE1   12 
#define BLACK   13 
bool state = 0;
void setup() {
    Serial.begin(19200);
    
  pinMode(BLUE2, OUTPUT);
  pinMode(BLUE1, OUTPUT);
  pinMode(BLUE3, OUTPUT);
  pinMode(BLUE4, OUTPUT); 
  pinMode(BLUE5, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(RED, OUTPUT);
  pinMode(BLACK, OUTPUT);
  
  
  
}
 
void loop() {
  while (Serial.available() > 0)
  {
     char val= Serial.parseInt();
     if (Serial.read()-'\n'){
    if (val < 2.5){
  digitalWrite(BLUE1, HIGH);   
 delay(10000);
digitalWrite(BLUE1, LOW);
 
 }
     
  else if (val >= 2.5 && val < 4.0){
  digitalWrite(BLUE2, HIGH);   
Serial.println("Filter is working");
delay(10000);
digitalWrite(BLUE2, LOW);
 
  }
 else if (val >= 4.0 && val < 6.0){
  digitalWrite(BLUE3, HIGH);   
Serial.println("Filter is working");
delay(10000);
digitalWrite(BLUE3, LOW);
 
 }
  else if (val >= 6.0 && val < 7.3){
  digitalWrite(BLUE4, HIGH);   
  Serial.println("Filter is working");
  delay(10000);
digitalWrite(BLUE4, LOW);
 
  }
 else if (val >= 7.3 , val < 12.0){
  digitalWrite(BLUE5, HIGH);   
      Serial.println("Filter is working");  
      delay(500);
digitalWrite(BLUE5, LOW);
               
 }
 else if (val >= 12.0 && val < 14.5 ){
  digitalWrite(GREEN, HIGH);   
  Serial.println("Filter is working");
  delay(10000);
digitalWrite(GREEN, LOW);
 }
 else if (val >= 14.5 && val < 21.5){
  digitalWrite(RED, HIGH);   
  Serial.println("Filter is working");
 delay(10000);
digitalWrite(RED, LOW);
 
 }
   else if (val >= 21.5 && val < 30.0){
  digitalWrite(BLACK, HIGH);   
Serial.println("Filter is working");
delay(10000);
digitalWrite(BLACK, LOW);
 
 }
     }
     Serial.flush();
 }
}
 
   
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

в строке №ХЗ

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

zimba пишет:
где может быть ошибка

Вот здесь.

А также в том, что Вы забыли написать, а что собственно Вы хотели сделать.

Ну,

zimba пишет:
при вводе в COM порт определенное значение загорается один и тот же светодиод
Замечательно! А хотелось-то как?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Просто программер спрашивает у программера.... Я даже отвечать боюсь...

zimba
Offline
Зарегистрирован: 21.02.2021

соррян,первый раз здесь,поэтому не сделал сразу

суть такая: к 6-13 цифровым пинам  паралельно подключены биполярные транзисторы.Перед транзисторами стоят резисторы(собирал все по схеме).Каждый транзистор  отвечает за срабатывание реле, тем самых начинает работать полосовой фильтр определенного диапазона.Каждый светодиод служит для указания того,что есть питание на данном участке цепи.

Идея была такая: писав определенное число, из конретного  диапазона,должно подаваться питание только на тот участок,в котором данное число входит в диапазон.

Написав код,указанный ниже, при компиляции/загрузке в ардуино уно никаких ошибок нет,но при вводе любого числа срабатывает только 12 пин и питание подается только на один участок.


#define RED   11                      
#define GREEN 10                      
#define BLUE5   9                      
#define BLUE4    8 
#define BLUE3   7 
#define BLUE2   6 
#define BLUE1   12 
#define BLACK   13 
bool state = 0;
void setup() {
    Serial.begin(19200);
    
  pinMode(BLUE2, OUTPUT);
  pinMode(BLUE1, OUTPUT);
  pinMode(BLUE3, OUTPUT);
  pinMode(BLUE4, OUTPUT); 
  pinMode(BLUE5, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(RED, OUTPUT);
  pinMode(BLACK, OUTPUT);
  
  
  
}

void loop() {
  while (Serial.available() > 0)
  {
     char val= Serial.parseInt();
     if (Serial.read()-'\n'){
    if (val < 2.5){
  digitalWrite(BLUE1, HIGH);   
 delay(10000);
digitalWrite(BLUE1, LOW);
 
 }
     
  else if (val >= 2.5 && val < 4.0){
  digitalWrite(BLUE2, HIGH);   
Serial.println("Filter is working");
delay(10000);
digitalWrite(BLUE2, LOW);
 
  }
 else if (val >= 4.0 && val < 6.0){
  digitalWrite(BLUE3, HIGH);   
Serial.println("Filter is working");
delay(10000);
digitalWrite(BLUE3, LOW);
 
 }
  else if (val >= 6.0 && val < 7.3){
  digitalWrite(BLUE4, HIGH);   
  Serial.println("Filter is working");
  delay(10000);
digitalWrite(BLUE4, LOW);
 
  }
 else if (val >= 7.3 , val < 12.0){
  digitalWrite(BLUE5, HIGH);   
      Serial.println("Filter is working");  
      delay(500);
digitalWrite(BLUE5, LOW);
               
 }
 else if (val >= 12.0 && val < 14.5 ){
  digitalWrite(GREEN, HIGH);   
  Serial.println("Filter is working");
  delay(10000);
digitalWrite(GREEN, LOW);
 }
 else if (val >= 14.5 && val < 21.5){
  digitalWrite(RED, HIGH);   
  Serial.println("Filter is working");
 delay(10000);
digitalWrite(RED, LOW);
 
 }
   else if (val >= 21.5 && val < 30.0){
  digitalWrite(BLACK, HIGH);   
Serial.println("Filter is working");
delay(10000);
digitalWrite(BLACK, LOW);
 
 }
     }
     Serial.flush();
 }
}

   
sadman41
Offline
Зарегистрирован: 19.10.2016
char val= Serial.parseInt();
Serial.println(val);

Но, вообще, меня заинтересовал этот приём:  if (Serial.read()-'\n')

Что он означает?

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

sadman41 пишет:

Но, вообще, меня заинтересовал этот приём:

if (Serial.read() - '\n')

Что он означает?

Насколько я понимаю - эквивалентно

if (Serial.read() != '\n')

Оригинальная, кстати, запись :-)

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

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

Насколько я понимаю - эквивалентно

if (Serial.read() != '\n')

Оригинальная, кстати, запись :-)

Я, конечно, не врач, но вот терзают мен сомнения по поводу эквивалентности))  Мне вообще тяжело представить, что там должно получиться при -'\n'

zimba
Offline
Зарегистрирован: 21.02.2021

ну вообще это подразумевало,что после введения числа, передача в буфер будет окончена.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

zimba пишет:

суть такая: к 6-13 цифровым пинам  паралельно подключены биполярные транзисторы.

Насколько я понимаю, даже электронный элемент с двумя выводами можно подключить "параллельно", минимум, двумя способами. А при трех выводах количество способов существенно увеличивается. Это даже не говоря о том, что пины с 6 по 13 - это 8 штук, что также далеко от двух.

В общем, пока не разместите подробную схему, нет предмета для обсуждения.

zimba
Offline
Зарегистрирован: 21.02.2021

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

Схема, конечно, хорошо, но указанная ТС ошибка в первую очередь обьясняется совершенно несуразным кодом. Ну правда, ведь прям начиная с первой строчки ЛУП каждая строка просто шыдевр :)
Чтобы сделать вывод о том, что это работать не будет - схема не требуется

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

b707 пишет:
Чтобы сделать вывод о том, что это работать не будет - схема не требуется
Практика показывает, что по схеме неработоспособность в большинстве случаев выявляется гораздо быстрее, - достаточно лишь беглого взгляда.

sadman41
Offline
Зарегистрирован: 19.10.2016

Rumata пишет:

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

Насколько я понимаю - эквивалентно

if (Serial.read() != '\n')

Оригинальная, кстати, запись :-)

Я, конечно, не врач, но вот терзают мен сомнения по поводу эквивалентности))  Мне вообще тяжело представить, что там должно получиться при -'\n'

if ('\n' - '\n') => if (0) => if (false)
if ('\r' - '\n') => if (3) => if (true)
if ('\t' - '\n') => if (-1) => if (true)

if ('\n' != '\n') => if (false)
if ('\r' != '\n') => if (true)

 

 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

sadman41 пишет:

if ('\n' - '\n') => if (0) => if (false)
if ('\r' - '\n') => if (3) => if (true)
if ('\t' - '\n') => if (-1) => if (true)

if ('\n' != '\n') => if (false)
if ('\r' != '\n') => if (true)

 охренеть

Возьму на вооружение ))

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

Rumata пишет:

Я, конечно, не врач, но вот терзают мен сомнения по поводу эквивалентности)) 

Давите Гада!

А то с этими сомнительными червяками дорефлексируетесь, как щедринский герой, которому вечно: «чего-то хотелось: не то конституции, не то севрюжины с хреном, не то кого-нибудь ободрать» (М.Е. Салтыков-Щедрин, «Культурные люди»)

sadman41
Offline
Зарегистрирован: 19.10.2016

zimba пишет:

ну вообще это подразумевало,что после введения числа, передача в буфер будет окончена.


Слова понятны, а смысл воспринимается примерно так: https://youtu.be/bq6gMJgguHY

Green
Offline
Зарегистрирован: 01.10.2015

sadman41 пишет:

if ('\n' - '\n') => if (0) => if (false)

Если задумываешься (даже если взгляд задерживается на тексте), значит уже плохо!
Тем более, что нет никакой причины не писать просто.

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

zimba пишет:

написал код

Это не код

     char val= Serial.parseInt();
     if (Serial.read()-'\n'){
    if (val < 2.5){
  digitalWrite(BLUE1, HIGH);   
 delay(10000);
digitalWrite(BLUE1, LOW);

это дичайшая дичь

strarbit
Offline
Зарегистрирован: 12.06.2016

Arduino has a special float read function that you can use that will parse the data from the serial port.

https://www.arduino.cc/reference/en/language/functions/communication/serial/parsefloat/

as an example

// get the ASCII string and convert the resulting string into an floa

float value = Serial.parseFloat(SKIP_ALL, '\n');

if ( value >= 14.5 && value < 21.5 ) {
	digitalWrite(RED, HIGH);
	delay(10000);
	digitalWrite(RED, LOW);
}