Вывод на индикаторную лампу

zacc
Offline
Зарегистрирован: 28.02.2020

Здравствуйте .  хочу построить  вольтметр(на 0-30В) на лампах 4 шт ГРИ. подскажите что нужно прописать чтобы был вывод показания напряжения. делитель напряжения есть . потому как запутался  делал вывод но показания были 1111. Пробный вывод в виде 2,3,5,4 выводит .Спасибо!

int out1 = 2;
int out2 = 4;
int out4 = 7;
int out8 = 8;

int key1= 3;
int key2 = 5;
int key3 = 6;
int key4 = 9;


void setup() {
  
  pinMode(out1,OUTPUT);
  pinMode(out2,OUTPUT);
  pinMode(out4,OUTPUT);
  pinMode(out8,OUTPUT);

  pinMode(key1,OUTPUT);
  pinMode(key2,OUTPUT);
  pinMode(key3,OUTPUT);
  pinMode(key4,OUTPUT);

}

void loop() {
    // put your main code here, to run repeatedly:
  int a[]={2,3,5,4};
   
   
  show(a);  
   
 
}
void show(int a[])
{
   setNumber(a[0]);
  digitalWrite(key1,HIGH);
  delay(1);
  digitalWrite(key1,LOW);
  
   setNumber(a[1]);
  digitalWrite(key2,HIGH);
  delay(1);
  digitalWrite(key2,LOW);

  setNumber(a[2]);
  digitalWrite(key3,HIGH);
  delay(1);
  digitalWrite(key3,LOW);

  setNumber(a[3]);
  digitalWrite(key4,HIGH);
  delay(1);
  digitalWrite(key4,LOW);
}
void setNumber(int num)
{
  switch (num)
  {
    case 0:
    digitalWrite (out1,LOW);
    digitalWrite (out2,HIGH);
    digitalWrite (out4,HIGH);
    digitalWrite (out8,LOW);
    break;
    case 1:
    digitalWrite (out1,LOW);
    digitalWrite (out2,LOW);
    digitalWrite (out4,LOW);
    digitalWrite (out8,LOW);
    break;
    case 2:
    digitalWrite (out1,HIGH);
    digitalWrite (out2,LOW);
    digitalWrite (out4,LOW);
    digitalWrite (out8,HIGH);
    break;
    case 3:
    digitalWrite (out1,HIGH);
    digitalWrite (out2,LOW);
    digitalWrite (out4,LOW);
    digitalWrite (out8,LOW);
    break;
    case 4:
    digitalWrite (out1,HIGH);
    digitalWrite (out2,HIGH);
    digitalWrite (out4,HIGH);
    digitalWrite (out8,LOW);
    break;
    case 5:
    digitalWrite (out1,LOW);
    digitalWrite (out2,LOW);
    digitalWrite (out4,HIGH);
    digitalWrite (out8,LOW);
    break;
    case 6:
    digitalWrite (out1,LOW);
    digitalWrite (out2,LOW);
    digitalWrite (out4,LOW);
    digitalWrite (out8,HIGH);
    break;
    case 7:
    digitalWrite (out1,HIGH);
    digitalWrite (out2,LOW);
    digitalWrite (out4,HIGH);
    digitalWrite (out8,LOW);
    break;
    case 8:
    digitalWrite (out1,HIGH);
    digitalWrite (out2,HIGH);
    digitalWrite (out4,LOW);
    digitalWrite (out8,LOW);
    break;
    case 9:
    digitalWrite (out1,LOW);
    digitalWrite (out2,HIGH);
    digitalWrite (out4,LOW);
    digitalWrite (out8,LOW);
    break;
  }
}

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

А теперь то же самое, но по русски, с чувством, с темпом , с расстановкой.

bwn
Offline
Зарегистрирован: 25.08.2014

Получить значение напряжения, разбить на разряды и прижимать катод (цифру) соответствующюу разряду включенного анода.
Загуглите "Динамическая индикация".
Здесь считается хорошим тоном и схему выкладывать.

P/S Динамика на делеях, как эмуляция при отладке отбражения, вполне годно. Для живого девайса, не лучшая идея. ИМХО.

zacc
Offline
Зарегистрирован: 28.02.2020

я не совсем могу понять как прописать вывод на индикатор  . на лсд я понял и получается  выводить.

можете показать пример. или есть кусок готового кода. Спасибо

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/**/
byte display[] = {2, 3, 5, 4};
const byte outPin[] = {2, 4, 7, 8};
const byte keyPin[] = {3, 5, 6, 9};
void initDevice() {
  for (int i = 0; i < 4; ++i) {
    pinMode(outPin[i], OUTPUT);
    pinMode(keyPin[i], OUTPUT);
  }
}
void runDevice() {
  static const byte MAP[] =
    // 0       1       2       3     4        5      6       7      8      9
  {0b0110, 0b0000, 0b1001, 0b0001, 0b0111, 0b0100, 0b1000, 0b0101, 0b0011, 0b0010};
  static uint32_t past = 0;
  static byte j = 0;
  if (millis() - past >= 100) {
    past = millis();
    digitalWrite(keyPin[j], LOW);
    for (int i = 0; i < 4; ++i)
      digitalWrite (outPin[i], (MAP[j] >> i) & 0x1);
    digitalWrite(keyPin[j], HIGH);
    ++j; if (j > 3) j = 0;
  }
}
//---------------------------------
void setup() {
  initDevice();
}
void loop() {
  runDevice();
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

На LCD, вы не поняли, там за вас библиотека это делает.)))
Не знаю почитали за динамическую индикацию или нет, но вкратце: в каждую единицу времени может светиться только один разряд, выбор разряда, в вашем случае, определяется высоким уровнем на аноде, отображаемая цифра, низким уровнем на катоде, но катоды, едины для всех разрядов. Соответственно, мы должны подать напряжение на анод нужного разряда и вместе с ним прижать нужный катод (цифру), делаем задержку, снимаем напряжение с анода, прижимаем катод (цифру) следующего разряда, подаем анодное на следующий разряд. И так по кругу. Создается впечатление одновременно светящихся цифр.
Чтобы вывести значение напряжения, вам понадобится разбить его на отдельные цифры, которые потом выводить последовательно. Для расчленения числа применяем %-оператор, используя делитель на 10. Т.к. он работает только с целыми, а у вас наверняка дробное, придется сперва домножить до целого, а десятичную точку выводить программно.
Чтобы было легче, поставьте большую задержку (секунду-две) и выводите сперва на один индикатор, потом увеличивайте их количество. Прижали нужный катод, подали анодное, задержка, сняли анодное..........................

zacc
Offline
Зарегистрирован: 28.02.2020

Всем спасибо буду пробовать !)