1602 ЖК-дисплей 16×2 не загорается для моего проекта системы автоматического полива

Я работаю над проектом по созданию системы автоматического полива с использованием платы Arduino Uno R3, ЖК-дисплея 16x2, водяного насоса и датчика влажности почвы. Однако я столкнулся с препятствием и мне действительно нужна помощь.

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

Вот краткое описание моей настройки:

  1. Плата Arduino Uno R3
  2. ЖК-дисплей 16x2
  3. Водяной насос
  4. Датчик влажности почвы

Я подключился:

  • контакты VCC и GND ЖК-дисплея к + и - на макетной плате
  • контакт SCA ЖК-дисплея к аналоговому контакту A4 Arduino
  • контакт SCL ЖК-дисплея к аналоговому контакту A5 Arduino

Я внимательно следовал инструкциям и руководствам, но, похоже, не могу понять, в чем причина проблемы.

Если кто-то сталкивался с подобной проблемой или у него есть предложения по ее устранению, я буду очень признателен за вашу помощь.

Вот код, который я использовал:

#Include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);
 
void setup() {
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);
  delay(1000);
  lcd.setCursor(0, 0);
  lcd.print("IRRIGATION");
  lcd.setCursor(0, 1);
  lcd.print("SYSTEM IS ON ");
  lcd.print("");
  delay(3000);
  lcd.clear();
}
 
void loop() {
  int value = analogRead(A0);
  Serial.println(value);
  if (value > 950) {
    digitalWrite(2, LOW);
    lcd.setCursor(0, 0);
    lcd.print("Water Pump is ON ");
  } else {
    digitalWrite(2, HIGH);
    lcd.setCursor(0, 0);
    lcd.print("Water Pump is OFF");
  }
 
  if (value < 300) {
    lcd.setCursor(0, 1);
    lcd.print("Moisture : HIGH");
  } else if (value > 300 && value < 950) {
    lcd.setCursor(0, 1);
    lcd.print("Moisture : MID ");
  } else if (value > 950) {
    lcd.setCursor(0, 1);
    lcd.print("Moisture : LOW ");
  }
}

, 👍-1

Обсуждение

Описание электрических соединений не особенно полезно. Схематическая диаграмма (или, на худой конец, диаграмма Fritzing) была бы улучшением. Также какой ЖК-дисплей? Какая распиновка? Существует много разных версий. Водяной насос и датчик почвы, похоже, не имеют отношения к вашей проблеме и только запутывают ее . Вам следует удалить все, что не имеет прямого отношения к проблеме с дисплеем. Обращайтесь к одному модулю за раз., @Greenonline

запустите скетч I2CScanner, чтобы увидеть, обнаруживает ли он ЖК-дисплей и по какому адресу, @Juraj

контакты VCC и GND ЖК-дисплея к + и - макетной платы ... подключена ли шина макетной платы к + и -? ... некоторые шины макетной платы имеют разрыв посередине, обычно обозначаемый разрывом красной линии, @jsotola


1 ответ


1

Адрес ЖК-дисплея может не быть 0x27.

Проверьте адрес вашего ЖК-дисплея, проверив производителя PCF8574 (на задней стороне ЖК-панели). Из Интерфейс I2C LCD с Arduino:

  • Если на вашем ЖК-дисплее установлен чип PCF8574 от Texas Instruments, его адрес I2C — 0x27;
  • Если в нем установлен чип PCF8574 от NXP Semiconductors, его адрес I2C — 0x3F.

Или из комментария 6v6gt:

На самом деле, суффикс «A» (или его отсутствие) в идентификаторе чипа отличает диапазон адресов I2C, поддерживаемый чипом. NXP PCF8574 и PCF8574A см. 7.1: Удаленный 8-битный расширитель ввода-вывода для шины I<sup>2</sup>C с прерыванием TI PCF8574 см. 8.4: Удаленный 8-битный расширитель ввода-вывода PCF8574 для шины I2C TI PCF8574A см. гл. 7 : PCF8574A Удаленный 8-битный расширитель ввода-вывода для шины I<sup>2</sup>C. В этом диапазоне пользователь, конечно, может также изменить 3 перемычки для точной настройки адреса.

Процитируем соответствующие разделы:

Из Удаленный 8-битный расширитель ввода-вывода для шины I<sup>2</sup>C с прерыванием

7.1 Адрес устройства

После условия START мастер шины должен отправить адрес подчиненного устройства, к которому он подключен. доступ и операция, которую он хочет выполнить (чтение или запись). Формат адреса PCF8574/74A показан на рисунке 6. Контакты адреса ведомого устройства A2, A1 и A0 удерживаются на ВЫСОКОМ уровне или LOW для выбора одного из восьми адресов подчиненных. Для экономии энергии, нет внутреннего подтягивающего резистора Резисторы встроены в выводы A2, A1 или A0, поэтому их необходимо удерживать внешним способом в состоянии ВЫСОКОГО или НИЗКОГО УРОВНЯ. Адресные контакты (A2, A1, A0) могут подключаться к VDD или VSS напрямую или через резисторы.

Последний бит первого байта определяет операцию, которая должна быть выполнена. При установке в логическую 1 выбирается чтение, а логический 0 выбирает операцию записи (операция записи показана на Рисунок 6).

В разделе 8.4, Функциональные режимы устройства, из PCF8574 Удаленный 8-битный расширитель ввода-вывода для шины I2C, показаны адресные и временные диаграммы для режимов записи и чтения.

В разделе 7 PCF8574A Remote 8-Bit I/O Expander для шины I<sup>2</sup>C приведена информация об измерении параметров со схемами и временными диаграммами.


В качестве альтернативы, согласно комментарию Юрая, запустите I2CScanner:

 // --------------------------------------
// i2c_сканер
//
// Версия 1
// Эта программа (или код, похожий на нее)
// можно найти во многих местах.
// Например, на форуме Arduino.cc.
// Первоначальный автор неизвестен.
// Версия 2, июнь 2012 г., с использованием Arduino 1.0.1
// Адаптировано для максимальной простоты пользователем Arduino.cc Krodal
// Версия 3, 26 февраля 2013 г.
// V3 от louarnold
// Версия 4, 3 марта 2013 г., с использованием Arduino 1.0.3
// от пользователя Arduino.cc Krodal.
// Изменения пользователя louarnold удалены.
// Адреса сканирования изменены с 0...127 на 1...119,
// по данным сканера i2c Ника Гэммона
// https://www.gammon.com.au/forum/?id=10896
// Версия 5, 28 марта 2013 г.
// Как и версия 4, но адрес теперь сканируется до 127.
// Датчик, похоже, использует адрес 120.
// Версия 6, 27 ноября 2015 г.
// Добавлено ожидание последовательной связи Leonardo.
//
//
// Этот скетч тестирует стандартные 7-битные адреса
// Устройства с более высоким битовым адресом могут отображаться некорректно.
//

#include <Wire.h>


void setup()
{
  Wire.begin();

  Serial.begin(9600);
  while (!Serial);             // Леонардо: ждем серийный монитор
  Serial.println("\nI2C Scanner");
}


void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    // i2c_scanner использует возвращаемое значение
    // Write.endTransmission, чтобы проверить,
    // устройство подтвердило адрес.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknown error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(5000);           // ждем 5 секунд для следующего сканирования
}

из i2c_scanner

,

На самом деле именно суффикс «A» (или его отсутствие) в идентификаторе чипа отличает диапазон адресов I2C, поддерживаемый чипом. NXP PCF8574 и PCF8574A см. 7.1: https://www.mouser.ch/datasheet/2/302/PCF8574_PCF8574A-3139141.pdf TI PCF8574 см. 8.4: https://www.ti.com/lit/ds/symlink/pcf8574.pdf TI PCF8574A см. гл. 7: https://www.ti.com/lit/ds/symlink/pcf8574a.pdf. В этом диапазоне пользователь, конечно, может также изменить 3 перемычки для пайки, чтобы точно настроить адрес., @6v6gt

Хорошо, большое спасибо. Ответ обновлен., @Greenonline