Несогласованный цифровой вывод на простом коде

Поэтому я новичок в кодировании Arduino, и я сделал этот код, где я ввожу данные с последовательного монитора, а затем использую его как команду для цифровой записи. проблема в том, что иногда код работает отлично, но затем, когда я ввожу 4, оба D3 и D4 высоки, и это также происходит в D5 и D6. но это непоследовательно, и я также печатаю значение «out», а также то, какой цифровой контакт является высоким, чтобы упростить его.

byte b;
int out;
int D3 = 3;int D4 = 4;int D5 = 5;int D6 = 6;int D7 = 7;int D8 = 8;
void setup() {
  Serial.begin(9600);
  pinMode(out, OUTPUT);
  digitalWrite(D3, LOW);digitalWrite(D4, LOW);digitalWrite(D5, LOW);digitalWrite(D6, LOW);digitalWrite(D7, LOW);digitalWrite(D8, LOW);
 
  
}

void loop() {
  while (Serial.available() == 0) {}
  b = Serial.read() - 48;
  out = b;
  Serial.print("\n Out is ");
  Serial.println(out);
  digitalWrite(out, HIGH);
  delay(600);
 if (digitalRead(D3) == HIGH)
{
   Serial.print("D3 HIGH");
}
 if (digitalRead(D4) == HIGH)
{
   Serial.print("D4 HIGH");}
 if (digitalRead(D5) == HIGH)
{
   Serial.print("D5 HIGH");
} 
 if (digitalRead(D6) == HIGH)
{
   Serial.print("D6 HIGH");
   }
 if (digitalRead(D7) == HIGH)
{
   Serial.print("D7 HIGH");
}
 if (digitalRead(D8) == HIGH)
{
   Serial.print("D8 HIGH");
   }
  digitalWrite(out, LOW);
  delay(1000);
  
  

 
}

Кто-нибудь знает, почему это происходит? или кто-нибудь может порекомендовать другой способ сделать то, что я пытаюсь сделать? спасибо ребята!!!

, 👍1


1 ответ


Лучший ответ:

0

Если я посмотрю на первые 5 строк:

byte b;
int out;
int D3 = 3;int D4 = 4;int D5 = 5;int D6 = 6;int D7 = 7;int D8 = 8;
void setup() {
  Serial.begin(9600);
  pinMode(out, OUTPUT);

Вы видите, что pinModeout, OUTPUT)использует переменнуюout, которая не инициализирована (она только объявлена вint out`'.

Я предполагаю, что от D3 до D8 все выходные контакты, поэтому вам нужно заменить последнюю строку на:

pinMode(D3, OUTPUT);
pinMode(D4, OUTPUT);
pinMode(D5, OUTPUT);
pinMode(D6, OUTPUT);
pinMode(D7, OUTPUT);
pinMode(D8, OUTPUT);

Кроме того, поскольку вы используете все контакты одинаково, я предлагаю вам использовать две переменные: startPin и endPin. Затем вы можете использовать цикл for для перебора всех контактов. Также

  • всегда инициализируйте переменные.
  • используйте «0» вместо 48 при преобразовании байтового значения в символ (поскольку вам не нужно знать значение ASCII «0»).

У меня нет под рукой компилятора Arduino, но он должен выглядеть примерно так:

byte b = 0;
int out = 0;
const byte startPin = 3;
const byte endPin = 8;

void setup() {
  Serial.begin(9600);
  for (byte pin = startPin; pin <= endPin; pin++)
  {
      pinMode(pin, OUTPUT);
      digitalWrite(pin, LOW);
  }
}

void loop() {
  while (Serial.available() == 0) {}
  b = Serial.read() - '0';
  out = b;
  Serial.print("\n Out is ");
  Serial.println(out);
  digitalWrite(out, HIGH);
  delay(600);

  ...

Тем не менее, отсюда вы используете контакты в качестве контактов ВХОДА. Вы не можете изменить их на лету, вы можете изменить их вручную (используя pinMode(pin, INPUT)), но не кажется нормальным переключать входные и выходные контакты, поэтому, возможно, вам следует объяснить, что вы намереваетесь с вашим приложением.

,

Эй, большое спасибо, ваша рекомендация на самом деле решает проблему, лол, и цель программы довольно проста, мне просто нужно ввести номер в последовательный монитор и заставить цифровые контакты выдавать вывод в соответствии с числами, (3456 в последовательном мониторе означает, что контакт D3 до тех пор, пока контакт D6 не выдаст высокое значение один за другим., @Mochammad Farid

но я так и не понял, зачем нужно читать пины; если вы пишете HIGH, вы можете предположить, что контакт будет HIGH, нет необходимости (или вы не должны) не читать их, так как они настроены на выходные, а не на входные контакты., @Michel Keijzers

да, мне не нужно, но мне просто нужно проверить, работает ли мой код так, как задумано, и у меня ограниченные ресурсы, где я сейчас нахожусь, из-за короны, поэтому я застрял в месте, где никто даже не продает резистор или светодиод, @Mochammad Farid

Я сомневаюсь, что это будет работать таким образом, потому что, если вы измените режим вывода, он больше не будет выводить сигнал. Лучше мультиметром проверить напряжение на контактах., @Michel Keijzers

да, это временно, спасибо за совет!!! я очень ценю это! :), @Mochammad Farid

Хорошо, желаю удачи. Если ответ помог, проголосуйте за него (стрелка вверх рядом с моим ответом), если проблема решена, также примите ответ (флажок рядом с ответом). Добро пожаловать на стековый обмен Arduino., @Michel Keijzers

По крайней мере, на AVR digitalRead() на контакте, сконфигурированном как OUTPUT, прекрасно работает. pinMode() управляет выходным буфером, входной буфер всегда активен., @Edgar Bonet

@EdgarBonet Спасибо за комментарий, приятно знать., @Michel Keijzers