Отображение показаний счетчика расхода воды на Arduino. LCD 1602 + I2C.

Для отображения показаний водосчетчика полученных в предыдущем уроке воспользуемся LCD индикатором 1602 (16 символов, 2 ряда). Чтобы не тянуть пучок проводов к плате Arduino и усложнять код приложения, присоединим индикатор по интерфейсу I2C. Таким образом нам понадобятся следующие компоненты:

Можно заказать сразу комплект индикатор LCD 1602 + плата I2C. Иногда так выгоднее. Кроме того можно найти уже распаянный на индикатор вариант сэкономив немного времени на пайке.

LCD 1602 с интерфейсом I2C

Интерфейс I2C для работы требует указания адреса устройства. Он может отличаться от стандартного 0х27, а китайские продавцы не всегда указывают его в документации. Чтобы подобрать адрес воспользуемся следующим кодом:

/*****************************************************
 * name:I2C_Address
 * function:read the address of the I2C lcd1602
 * Connection:
 * I2C                 UNO 
 * GND                 GND
 * VCC                  5V
 * SDA                  A4(pin20 in mega2560, pin16 in UNO R3)
 * SCL                  A5(pin21 in mega2560, pin17 in UNO R3)
 ********************************************************/

#include "Wire.h"

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  Serial.println("\nI2C Scanner");
}
void loop()
{
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    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("Unknow 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); // wait 5 seconds for next scan
}

В моем случае адрес оказался 0x3F. Добавим в приложение код для вывода показаний водосчетчика на индикатор. Необходимо будет добавить библиотеку LiquidCrystal_I2C в Arduino IDE -> Sketch -> Include Libriary -> Add .zip Libriary или Manage Libriaries…

#include "Bounce2.h";
#include "Wire.h"; 
#include "LiquidCrystal_I2C.h";

LiquidCrystal_I2C lcd(0x3F,16,2);  // set the LCD address to 0x3F for a 16 chars and 2 line display

int LED_PIN = 13;
int PULSE_PIN = 2;
int water_counter = 0; 
bool last_PULSE_PIN_State = false;

// Initiate Debouncer 
Bounce debouncer = Bounce();

void setup() {
  // Initialize digital pin 2 as an input with the internal pull-up (+5V) resistor enabled
  pinMode(PULSE_PIN, INPUT_PULLUP);

  // Attach PULSE_PIN for debouncing
  debouncer.attach(PULSE_PIN);
  debouncer.interval(50); // Ignore interval
  
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600, SERIAL_8N1);

  lcd.init();  //initialize the lcd
  lcd.backlight();  //open the backlight
}

void loop() {  
  debouncer.update();
 
  // Read Reed Switch state
  int value = debouncer.read();
 
  // Now all processes are finished and we know exactly the state of the Reed Switch
  if ( value == LOW ) {
    digitalWrite(LED_PIN, HIGH );
    if (last_PULSE_PIN_State == false)
    {
      water_counter++;
      Serial.println("Water consumption: " + (String)(water_counter*10) + " l.");
      lcd.setCursor(0, 0); // set the cursor to column 3, line 0
      lcd.print("Cold: " + (String)(water_counter*10) + " l");  // Print a message to the LCD
    }
    last_PULSE_PIN_State = true;
  }
  else {
    digitalWrite(LED_PIN, LOW);
    last_PULSE_PIN_State = false;
  }
}

В примере отображение водопотребления сделано в литрах, хотя водосчетчик показывает в m3, т.е. полученное значение нужно разделить на 1000. Откорректируем код в дальнейшем, чтобы он совпадал с показаниями счетчика.

Продолжение следует…

Spread the love
Запись опубликована в рубрике IT tools, IT рецепты с метками , . Добавьте в закладки постоянную ссылку.