Несогласованный цифровой вывод на простом коде
Поэтому я новичок в кодировании 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);
}
Кто-нибудь знает, почему это происходит? или кто-нибудь может порекомендовать другой способ сделать то, что я пытаюсь сделать? спасибо ребята!!!
@Mochammad Farid, 👍1
1 ответ
Лучший ответ:
Если я посмотрю на первые 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);
Вы видите, что pinMode
out, 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)
), но не кажется нормальным переключать входные и выходные контакты, поэтому, возможно, вам следует объяснить, что вы намереваетесь с вашим приложением.
- Двоичный в десятичный с использованием побитовых операторов
- Multiple Wire.write() не работает для Arduino Nano I2C
- Самый прямой способ назначить байты Serial.read() массиву?
- Проблема последовательной связи RS-485 с arduino
- Как точно получить значения потенциометра через USB-порт?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Ошибка "'Serial' does not name a type"
- Последовательная связь между ESP8266 и Arduino Uno
Эй, большое спасибо, ваша рекомендация на самом деле решает проблему, лол, и цель программы довольно проста, мне просто нужно ввести номер в последовательный монитор и заставить цифровые контакты выдавать вывод в соответствии с числами, (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