Индикатор уровня сигнала (Arduino)

На рисунке показана схема линейного индикатора уровня сигнала, уст-во основано на Arduino Nano, индикатор LCD 1602. Индикатор способен отображать 30 уровней входного сигнала, входной сигнал не должен превышать 1.1 В, так как вход АЦП имеет внутреннее опорное напряжение 1.1 В. При большом уровне входного сигнала используйте делитель напряжения.

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);// RS,E,D4,D5,D6,D7
byte a1[8]={ 
  0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011};
byte a2[8]={ 
  0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000};
byte a3[8]={
  0b00011,0b00011,0b00011,0b00011,0b00011,0b00011,0b00011,0b00011};
byte znak_r[8]={ // R
  0b00000,0b00000,0b11111,0b00101,0b00101,0b11010,0b00000,0b00000};
byte znak_l[8]={ // L
  0b00000,0b00000,0b11111,0b10000,0b10000,0b10000,0b00000,0b00000};
int u_r,u_l,i=1,x,u_maxr,u_maxl,z,z1,u_r0[15],u_l0[15];
unsigned long time1; 
void setup(){  
  analogReference(INTERNAL);
  lcd.begin(16, 2);// LCD 16X2
  lcd.createChar(0,a1); 
  lcd.createChar(1,a2); 
  lcd.createChar(2,znak_r); 
  lcd.createChar(3,znak_l);
  lcd.createChar(4,a3); 
  pinMode(A0,INPUT);
  pinMode(A2,INPUT);
}

void loop(){  
  lcd.setCursor(0,0);// R 
  lcd.write((uint8_t)2);
  lcd.setCursor(0,1);
  lcd.write((uint8_t)3);// L

  u_r = analogRead(A0); // измерение R
  u_l = analogRead(A2); // измерение L

  for(int z=1,z1=0,z2=30;z<=15;z++,z1=z1+30,z2=z2+30){ // l+r
    if(u_l>z1){
      lcd.setCursor(z,1);
      lcd.write((uint8_t)1);
    } 
    if(u_r>z1){
      lcd.setCursor(z,0);
      lcd.write((uint8_t)1);
    } 
    if(u_l>z2){
      lcd.setCursor(z,1);
      lcd.write((uint8_t)0);
    } 
    if(u_r>z2){
      lcd.setCursor(z,0);
      lcd.write((uint8_t)0);
    } 
  }

  i++;
  if(i<=15){
    u_l0[i]=u_l;
    u_r0[i]=u_r;
  }
  else{
    i=1;
  }
  if(i==15){
    u_maxr=0;
    u_maxl=0;
    for(x=1;x<=15;x++){
      u_maxl=max(u_maxl,u_l0[x]);
      u_maxr=max(u_maxr,u_r0[x]);
    }
  }

  if(u_maxl<=u_l){
    u_maxl=u_l;
  } 
  if(u_maxr<=u_r){
    u_maxr=u_r;
  }

  for(z=1,z1=0;z<=15;z++,z1=z1+30){
    if(u_maxl > z1 && u_maxl <= z1+15){
      lcd.setCursor(z,1);
      lcd.write((uint8_t)1);
    }
    if(u_maxl > z1+15 && u_maxl <= z1+30){
      lcd.setCursor(z,1);
      lcd.write((uint8_t)4);
    }

    if(u_maxr > z1 && u_maxr <= z1+15){
      lcd.setCursor(z,0);
      lcd.write((uint8_t)1);
    }
    if(u_maxr > z1+15 && u_maxr <= z1+30){
      lcd.setCursor(z,0);
      lcd.write((uint8_t)4);
    }
  } 
  delay(75);
  lcd.clear();
}


Comments

Добавить комментарий

Войти с помощью: