Бинарный светодиодный 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); 
}

, 👍2

Обсуждение

написать отладочный скетч... включить все светодиоды... это работает?, @jsotola


2 ответа


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

3

Согласно официальной документации, второй параметр 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


1

Кажется, digitalWrite не принимает int != 0 как ВЫСОКИЙ

Рассмотрите возможность предоставления логического значения (однобайтовое значение)

   digitalWrite(12,(sensorValue&256)==256);
   digitalWrite(12,(sensorValue>>8)&1);

или аналогичный

,