Бинарный светодиодный 10-битный дисплей Arduino
Я работаю над простым проектом АЦП, цель которого — настроить включение/выключение светодиодов в соответствии с двоичным значением (1-вкл., 0-выкл.). Я пробовал это с 8-битным, и он работает как задумано. Но на 10 бит два светодиода с представлением 2 ^ 8 и 2 ^ 9 не загорятся, хотя на последовательном мониторе отображается 1023 (должно быть 1111111111 — все светодиоды горят). Интересно, есть ли что-то не так с моим кодом или схемой? (Я совершенно новичок в ардуино, извините за нубство) -Я использую Arduino UNO R3, подробности показаны на изображении
void setup(){
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
pinMode(4, OUTPUT);
Serial.begin(9600);
}
void loop(){
int sensorValue = analogRead(A0);
Serial.print("Decimal=");
Serial.print(sensorValue);
Serial.print("\tBinary=");
Serial.println(sensorValue,BIN);
if(sensorValue>=0&&sensorValue<=1023){
digitalWrite(4,(sensorValue&1));
digitalWrite(5,(sensorValue&2));
digitalWrite(6,(sensorValue&4));
digitalWrite(7,(sensorValue&8));
digitalWrite(8,(sensorValue&16));
digitalWrite(9,(sensorValue&32));
digitalWrite(10,(sensorValue&64));
digitalWrite(11,(sensorValue&128));
digitalWrite(12,(sensorValue&256));
digitalWrite(13,(sensorValue&512));
}
delay(20);
}
@Kenj, 👍2
Обсуждение2 ответа
Лучший ответ:
Согласно официальной документации, второй параметр
digitalWrite()
должен быть либо HIGH
, либо LOW
. Таким образом, чтобы быть
соответствует опубликованному API, вы должны написать:
digitalWrite(12, sensorValue&256 ? HIGH : LOW);
На практике digitalWrite()
интерпретирует любое ненулевое значение как HIGH
.
Однако его прототип:
void digitalWrite(uint8_t pin, uint8_t val);
Оба параметра имеют тип uint8_t
, что означает «8-битный беззнаковый
целое». Если вы укажете значение, которое не помещается в 8 бит,
неявное приведение к uint8_t
уменьшит его по модулю 28. Таким образом,
и 256, и 512 становятся нулем из-за неявного приведения.
Ваш трюк с тройным оператором решит проблему 8-битного усечения и отправит документированные значения в функцию. Лично я написал бы функцию, которая принимала битовый индекс и значение и возвращала HIGH или LOW, и вызывала ее. СУХОЙ, @Duncan C
Я знаю, что OP новый, но лучше не писать в порты для группового вывода., @mckenzm
Кажется, digitalWrite не принимает int
!= 0 как ВЫСОКИЙ
Рассмотрите возможность предоставления логического значения (однобайтовое значение)
digitalWrite(12,(sensorValue&256)==256);
digitalWrite(12,(sensorValue>>8)&1);
или аналогичный
- Взаимодействие ADS8319 с Arduino UNO
- Ускорение двигателя постоянного тока с помощью ШИМ
- Как найти пиковое значение аналогового сигнала?
- Как преобразовать эту программу в сборку из c++
- Чтение сигнала 4-20 мА на ардуино
- Питание Arduino от батареи и считывание напряжения батареи
- Как получить среднее значение 16-битного АЦП?
- Измерение тока через шунтирующий резистор (Анализ мощности)
написать отладочный скетч... включить все светодиоды... это работает?, @jsotola