7-сегментный дисплеи не работают

#include <Wire.h>
#include <Adafruit_INA219.h>

Adafruit_INA219 ina219;


//Adafruit_INA219 ina219_A;
//Adafruit_INA219 ina219_B(0x41);

void setup(void) 
{
  Serial.begin(115200);
  while (!Serial) {
      // will pause Zero, Leonardo, etc until serial console opens
      delay(1);
  }

  uint32_t currentFrequency;
    
  Serial.println("Hello!");
 
  if (! ina219.begin()) {
    Serial.println("Failed to find INA219 chip");
    while (1) { delay(10); }
  }
  ina219.setCalibration_32V_1A();

  Serial.println("Measuring voltage and current with INA219 ...");
}

void data(void) 
{
  float shuntvoltage = 0;
  float busvoltage = 0;
  float current_mA = 0;
  float loadvoltage = 0;
  float power_mW = 0;
    delay(2000);
  shuntvoltage = ina219.getShuntVoltage_mV();
  busvoltage = ina219.getBusVoltage_V();
  current_mA = ina219.getCurrent_mA();
  power_mW = ina219.getPower_mW();
  loadvoltage = busvoltage + (shuntvoltage / 1000);
  
  Serial.print("Bus Voltage:   "); Serial.print(busvoltage); Serial.println(" V");
  Serial.print("Shunt Voltage: "); Serial.print(shuntvoltage); Serial.println(" mV");
  Serial.print("Load Voltage:  "); Serial.print(loadvoltage); Serial.println(" V");
  Serial.print("Current:       "); Serial.print(current_mA); Serial.println(" mA");
  Serial.print("Power:         "); Serial.print(power_mW); Serial.println(" mW");
  Serial.println("");

  delay(2000);
}

void loop() {

    analogWrite(9, 245); //ENA pin
    digitalWrite(8, HIGH);
    digitalWrite(7, LOW);
    data();
    delay(5000);
  
    analogWrite(9, 200); //ENA pin
    digitalWrite(8, HIGH);
    digitalWrite(7, LOW);
    data();
    delay(5000);
  
    analogWrite(9, 150); //ENA pin
    digitalWrite(8, HIGH);
    digitalWrite(7, LOW);
    data();
    delay(5000);
  
    analogWrite(9, 0); //ENA pin
    digitalWrite(8, LOW);
    digitalWrite(7, LOW);
    data();
    delay(5000);

}

Явно что-то не так с моим кодом и 7-сегментные индикаторы не горят все время, пока выполняется программа. Я также разместил ссылку ниже которого направляет проект tinkercad я сделал.

https://www.tinkercad.com/things/7pnnbXoaqrG-improved-stop-light-john-seong/editel?sharecode=jR86i_srV7QgP11u1CxOFzeVwehzjIRr8wcc7vbblay

, 👍1

Обсуждение

Пожалуйста, попробуйте цвет кода провода больше. С почти всеми проводами, зелеными и перекрывающимися во многих местах, действительно трудно следовать монтажной схеме. Кроме 7-сегментных дисплеев, у вас есть еще несколько компонентов, которые здесь не очень уместны. Это общий метод отладки, чтобы удалить весь код и компоненты, которые не имеют отношения к конкретной проблеме, а затем получить решение соответствующей проблемы, а затем добавить остальную часть кода и компонентов один за другим, всегда проверяя ошибки между ними. Вы можете попробовать построить схему только для дисплеев и проверить еще раз, @chrisl

Я отладил; оказывается, все соединения правильные, но когда я нажимаю кнопку, сегментные дисплеи выключаются., @John Seong

Вы никогда не касаетесь дисплея сегмента в любом месте в вашей функции `loop ()'. Поэтому, если что-то происходит (например, выключается), но ни один из светодиодов не действует так, как задумано (т. Е. Переключение с зеленого на красный), То что-то в вашей проводке должно быть неправильно или номера контактов в коде не совпадают., @PMF

Он должен мультиплексировать^, @John Seong

Вы можете сделать это проще для тех, кто пытается помочь вам, структурируя провода более логичным образом (например, не позволяйте проводам одного и того же цвета перекрываться) и, возможно, увеличивая схему (так, чтобы номера контактов были читаемы, например). Сейчас это очень трудно понять., @StarCat

displayNumber показывает только номер для 10μs. Поэтому вам нужно вызывать эту функцию намного больше раз в секунду, чтобы ваши глаза заметили. Вы также можете использовать таймер, чтобы периодически переключаться между сегментами, но достаточно быстро, чтобы казалось, что все два дисплея горят одновременно., @Gerben

Почему бы не преобразовать его в схему, как вы его подключили, мы бы поняли, что это намного проще. Кроме того, в этом формате гораздо проще следовать вашей логике. Вы можете бесплатно скачать несколько программ для создания схем. Я использую Кикад. Схемы являются частью основного языка в электронике., @Gil

Как насчет аннотированной схемы, на языке электроники., @Gil


1 ответ


0

На самом деле это не решение, но изменение кода функции displayNumber, как показано ниже, сделает более очевидным, в чем заключается реальная проблема.

void displayNumber(int num, int displayPin) {
  
  bool binaryValue[][4] = {
    {0, 0, 0, 0}, // 0
    {0, 0, 0, 1}, // 1
    {0, 0, 1, 0}, // 2
    {0, 0, 1, 1}, // 3
    {0, 1, 0, 0}, // 4
    {0, 1, 0, 1}, // 5
    {0, 1, 1, 0}, // 6
    {0, 1, 1, 1}, // 7
    {1, 0, 0, 0}, // 8
    {1, 0, 0, 1}, // 9
  };

  // turn off both displays
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);

  for(int i = 0; i < 4; i++) {
    digitalWrite(segmentPins[i], binaryValue[num][i]);
  }
  
  digitalWrite(displayPin, HIGH);
  /* // удалите эти две строки
  delayMicroseconds(10);
  digitalWrite(displayPin, LOW);
  */
}
,

Почему бы не преобразовать его в схему, мы бы поняли, что это намного проще. Также гораздо проще следовать вашей логике в этом формате. Вы можете бесплатно запустить несколько программ захвата схем. Я использую KiCad., @Gil

@Гил, я думаю, что ты оставил свой комментарий по неправильному поводу., @timemage

Я не мог следить за вьющимся рисунком, он был недостаточно четким, чтобы следить за ним на моей машине. Очевидно, я не единственный, у кого с этим проблемы., @Gil