Подсветка LCD не работает даже при 5V. Использование резистора 330 Ом

Я пытался создать этот проект: https://create.arduino. .cc/projecthub/chummer1010/electronic-safe-with-arduino-25d039

Я уверен, что все собрал правильно, но на моем ЖК-дисплее символы не отображаются. Другие проекты, похоже, исправили это, изменив потенциометр, но я его не использую.

Код Arduino:

/* 
Made by Marco Fusco
May 20, 2016
Contact me at: [email protected]
*/


#include <LiquidCrystal.h>
#include <EEPROM.h>
#include <Servo.h>

int address = 0;
static unsigned long SaveTimer;
static unsigned long SaveDelay = (30 * 1000); 


char CODE[10] = "1234E"; 
char Str[10]; 
char CodeLength = 4;
int Pos = 0;
bool Unlocked;
static unsigned long DisplayTimer; 
static unsigned long DisplayDelay = 200;

LiquidCrystal lcd(12, 11, 9, 8, 7, 6); 


int buttonPin1 = 2;   
int buttonPin2 = 3;
int buttonPin3 = 4;
int buttonPin4 = 5;

int enterbutton = 10; 
int clearlockbutton = 13;

Servo myServo;

void setup() {

  myServo.attach(A1);

  int EEPROMCodeOK = true;
  for (Pos = 0; Pos <= (CodeLength); Pos++) {
    Str[Pos] =  EEPROM.read(Pos);
    if (!(strrchr("1123456789", Str[Pos]))) { 
      // неверный код
      EEPROMCodeOK = false;
    }
  }
  Pos++;
  Str[Pos] =  EEPROM.read(Pos); 
  if (Str[CodeLength + 1] != 'E') EEPROMCodeOK = false; 
  if (EEPROMCodeOK) {
    Str[CodeLength + 2] = '\0';
    strncpy(CODE, Str, CodeLength + 1);
  }
  ClearCode();

  pinMode(buttonPin1, INPUT_PULLUP);
  pinMode(buttonPin2, INPUT_PULLUP);
  pinMode(buttonPin3, INPUT_PULLUP);
  pinMode(buttonPin4, INPUT_PULLUP);

  pinMode(enterbutton, INPUT_PULLUP);
  pinMode(clearlockbutton, INPUT_PULLUP);

  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Hello.");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Password:");

  DisplayTimer = millis() + 200;
}


void loop() {

  Lock();

  Pos = constrain(Pos, 0, CodeLength);

  int buttonState1 = digitalRead(buttonPin1);  
  int buttonState2 = digitalRead(buttonPin2);
  int buttonState3 = digitalRead(buttonPin3);
  int buttonState4 = digitalRead(buttonPin4);

  int clButtonState = digitalRead(clearlockbutton);
  int enterButtonState = digitalRead(enterbutton);

  lcd.setCursor(9, 0);

  if (buttonState1 == LOW) {
    Str[Pos] = '1';
    Pos++;
    Str[Pos] = '\0';
    delay(250); 
    while (digitalRead(buttonPin1) == LOW); 

  }

  else if (buttonState2 == LOW) {
    Str[Pos] = '2';
    Pos++;
    Str[Pos] = '\0';
    delay(250); 
    while (digitalRead(buttonPin2) == LOW);

  }

  else if (buttonState3 == LOW) {
    Str[Pos] = '3';
    Pos++;
    Str[Pos] = '\0';
    delay(250); 
    while (digitalRead(buttonPin3) == LOW);
  }

  else if (buttonState4 == LOW) {
    Str[Pos] = '4';
    Pos++;
    Str[Pos] = '\0';
    delay(250); 
    while (digitalRead(buttonPin4) == LOW); 

  }
  else if (enterButtonState == LOW) {
    Str[Pos] = 'E';
    Pos++;
    Str[Pos] = '\0';
    delay(250);
    while (digitalRead(buttonPin1) == LOW); 
     if (strcmp (Str,CODE) == 0) {
      Unlocked = true;
      lcd.setCursor(0, 0);
      lcd.print(" Access Granted");
      delay(2000);
      lcd.clear();
      lcd.print("    Unlocked");
    } 
    else if (SaveTimer > millis() && (Pos + 1) == CodeLength) { 

      strcpy(CODE, Str);
      for (Pos = 0; Pos <= (CodeLength + 1); Pos++) {
        EEPROM.write(Pos, Str[Pos]);
      }
      lcd.setCursor(0, 0);
      lcd.print("Saving Code:");
      lcd.setCursor(0, 1);
      lcd.print(Str);

      Unlocked = true;
    }

    else { 

      lcd.clear();
      lcd.print(" Access Denied.");
      delay(2000);
      lcd.clear();
      lcd.print("Password:");

    }

    while (Unlocked) {
      Unlock();
      if (digitalRead(clearlockbutton) == LOW) {
        delay(200);
        lcd.clear();
        lcd.print("     Locked");
        delay(2000);
        lcd.clear();
        Unlocked = false;
        SaveTimer = millis() + 30000;
      }
    }

    ClearCode();


  }

  else if (clButtonState == LOW) {
    delay(500);

    while (clearlockbutton == LOW);
    if ((millis() - SaveTimer) > 4500) {

    }

    ClearCode();

  }

  if ( (long)( millis() - DisplayTimer ) >= 0) {
    DisplayTimer += DisplayDelay;
    lcd.setCursor(9, 0); 
    lcd.print(Str);
    lcd.print("     ");

  }
}

void ClearCode() {

  Pos = 0;
  Str[Pos] = '\0';
  lcd.setCursor(0, 0);
  lcd.print("Password:");
  lcd.setCursor(0, 1);
  lcd.print("          ");

}

void Unlock() {

  myServo.write(150);

}

void Lock() {

  myServo.write(50);

}

, 👍0

Обсуждение

но я им не пользуюсь; почему не твой? Вы не можете просто исключить части схемы и ожидать, что она все еще будет работать. Если у вас нет потенциометров, вы проверяете комбинации двух резисторов, пока не получите хороший контраст. Наконец, вопрос в заголовке не имеет ничего общего с вопросом в остальной части текста., @Gerben


2 ответа


2

Пожалуйста, добавьте фотографию дисплея. Скорее всего у вас проблемы с контрастом. Схема по приведенной вами ссылке очень странная: пин 3, отвечающий за контрастность, завязан напрямую на GND, что выставляет дисплей на минимальную контрастность. Вы должны использовать либо потенциометр, либо делитель напряжения для этого вывода.

,

Дисплеи 1602, которые я использовал до сих пор, хорошо работали с резистором 2k или 5k между контрастным контактом и GND, в зависимости от модели., @towe

Для меня это очень странно, если честно. Все, что я видел, требует некоторого напряжения на этом контакте, и его, очевидно, нельзя установить с помощью какого-либо одного резистора. Адаптеры I2C также имеют небольшой потенциометр, встроенный в печатную плату., @Zhenek

Вот и я так же думал. Я использую оба как обычные 4-битные параллельные дисплеи. 2k входит в «Elegoo Uno R3 Ultimate Starter Kit». 5k - это "GE-C1602B-TMI-JT/R" от "Gleichmann", которые я использовал для рабочих проектов., @towe

@towe для китайца из стартового комплекта даташита конечно нет, но для второго нашел: http://www.produktinfo.conrad.com/datenblaetter/175000-199999/183045-da-01- en-LCD_MODUL_16X2_LED_GE_C1602B_TMI_JT_R.pdf. На странице 5 четко указано, что вы должны использовать банк в диапазоне 10-20k с выходом на контакт VO. Внизу страницы есть электрическая схема для этого. В таблице указано, что при комнатной температуре типичное напряжение VO составляет 3,7 В., @Zhenek

С резистором 5,1 кОм на землю и 5 В Vcc я получаю 1,08 В на VO и идеальный контраст., @towe

@towe во-первых, это противоречит тому, что указано в техническом описании, и поэтому очень странно. Во-вторых, я до сих пор не понимаю. Чтобы получить 1,08 В из 5,0 В, вам понадобится пара резисторов. Если один из них 5,1к, то другой должен быть около 18,5к. пожалуйста, покажите вашу фактическую установку, @Zhenek

Я хорошо знаю об этом. Я просто использовал то, что работало надежно. Заказная печатная плата (поэтому я был рад не тратить место на горшок), GND на GND, 5 В в качестве Vcc (либо от Uno через USB, либо от Recom R-785.0-0,5), и резистор 5,1 кОм от VO до ЗАЗЕМЛЕНИЕ. Подсветка питается либо от стабилизатора на 3,3В напрямую (первая версия), либо через резистор 100 Ом от 5В., @towe


0

Начните с жидкого кристалла, HelloWorld, пример. Выясните, является ли это вашей конфигурацией контактов или проблемой с потенциометром/без потенциометра, или у вас тупой ЖК-дисплей.

Некоторые LCD 1602 имеют встроенный потенциометр, поэтому убедитесь, что его тоже нет.

Процесс устранения.

,