Для отображения показаний водосчетчика полученных в предыдущем уроке воспользуемся LCD индикатором 1602 (16 символов, 2 ряда). Чтобы не тянуть пучок проводов к плате Arduino и усложнять код приложения, присоединим индикатор по интерфейсу 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. Откорректируем код в дальнейшем, чтобы он совпадал с показаниями счетчика.