This page provides a high-level introduction to the frequency measurement and display system implemented in this repository. The system is a single-file Arduino sketch that measures the frequency of digital pulse signals and displays the measurement results on an I2C LCD screen in real-time.
This document describes the system's overall purpose, architecture, and main components. For detailed information about specific subsystems, refer to:
- System measurement capabilities and performance characteristics: System Capabilities
- Hardware requirements and component specifications: Hardware Components
- Software architecture and design patterns: System Architecture
- Detailed initialization sequence: Initialization Process
- Runtime measurement and display logic: Main Operational Loop
Sources: conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino 1-28
The frequency measurement system is an embedded application running on an Arduino microcontroller platform. The system continuously counts digital pulses from an external signal source over fixed time windows (1000ms gate periods) and displays the measured frequency count on a 16x2 character LCD display connected via I2C bus. The application implements a non-blocking polling architecture that checks for available measurements and updates the display when new data is ready.
The system serves as a frequency counter and visualizer, suitable for measuring periodic digital signals within the capabilities of the Arduino's hardware timer/counter peripherals and the FreqCount library's frequency range limitations.
Sources: conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino 1-28
The system consists of three primary software components and their corresponding hardware interfaces:
| Componente | Type | Purpose | Configuration |
|---|---|---|---|
FreqCount |
Library | Frequency measurement using hardware timers | Gate time: 1000ms |
LiquidCrystal_I2C |
Library | I2C LCD display control | Address: 0x27, 16x2 chars |
Serial |
Built-in | UART communication interface | 57600 baud (initialized but unused) |
flowchart LR
subgraph s1["conteo_de_frecuencia_y_visualizacion_I2C.ino"]
n1["loop()"]
A["#include"]
n2["setup()"]
n3["lcd = LiquidCrystal_I2C(0x27, 16, 2)"]
n4["#include"]
end
subgraph s2["Hardware Interfaces"]
n5["Hardware Timer/Counter"]
n6["I2C Bus (SDA/SCL)"]
n9["UART/Serial Port"]
end
subgraph s3["External Libraries"]
n7["FreqCount Library"]
n8["LiquidCrystal_I2C Library"]
end
n1 --> n7 & n8 & n9
A --> n7
n4 --> n8
n2 --> n7 & n8
n3 --> n8
n7 --> n5
n8 --> n6
n2@{ shape: rect}
n3@{ shape: rect}
n4@{ shape: rect}
n6@{ shape: rect}
n9@{ shape: rect}
n7@{ shape: rect}
n8@{ shape: rect}
This diagram shows how the single sketch file includes and instantiates library objects, and how those libraries interface with hardware peripherals.
Sources:
- conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino 1-4
The Arduino sketch follows the standard Arduino execution model with two main functions: setup() and loop().
flowchart TD
A["System Power-On"] --> n1["setup() function"]
n1 --> n2["Serial.begin(57600)"]
n2 --> n3["lcd.init()<br>lcd.backlight()<br>lcd.clear()"]
n3 --> n4@{ label: "Display 'Circle' delay(2000)" }
n4 --> n5@{ label: "Display 'Freq:' at position (0,0)" }
n5 --> n6["FreqCount.begin(1000)"]
n6 --> n7["loop() function"]
n7 -- COntinuous eecution --> n8["FreqCount.available()"]
n8 -- false --> n7
n8 -- true --> n9["count = FreqCount.read()"]
n9 --> n10["lcd.setCursor(0,1)<br>lcd.print(count)"]
n10 --> n7
n1@{ shape: rect}
n2@{ shape: rect}
n3@{ shape: rect}
n4@{ shape: rect}
n5@{ shape: rect}
n6@{ shape: rect}
n7@{ shape: rect}
n8@{ shape: rect}
n9@{ shape: rect}
n10@{ shape: rect}
A:::theclass
n1:::theclass
n2:::theclass
n3:::theclass
n4:::theclass
n5:::theclass
n6:::theclass
n7:::theclass
n8:::theclass
n9:::theclass
n10:::theclass
This diagram shows the actual function calls from the Arduino sketch, illustrating the one-time initialization sequence in setup() and the continuous polling cycle in loop().
Sources:
- conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino 6-28
The setup() function
- conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino 6-19
executes once at system start and performs the following operations in sequence:
- Serial initialization:
Serial.begin(57600)configures UART communication at 57600 baud - LCD initialization:
lcd.init()initializes the I2C LCD controller - Backlight activation:
lcd.backlight()enables the LCD backlight - Display clear:
lcd.clear()clears any existing display content - Splash screen: Displays "Circle" at position (0,0) for 2000ms
- Static label: Displays "Freq:" at position (0,0) as a permanent label
- Frequency counter start:
FreqCount.begin(1000)starts frequency measurement with 1000ms gate time
Sources:
- conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino 6-19
The loop() function
- conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino 21-28
implements a non-blocking polling pattern:
- Availability check:
FreqCount.available()returnstruewhen a measurement is ready - Data retrieval:
count = FreqCount.read()retrieves the accumulated pulse count - Display update: Updates LCD row 1 with the frequency count value and trailing spaces to clear previous digits
The loop executes continuously, with display updates occurring approximately every 1000ms when new measurements complete.
Sources:
- conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino 21-28
flowchart LR
subgraph subgraphName["Measurement Stage"]
nodeId@{ label: "lcd.setCursor(0,1)<br>lcd.print(count)<br>lcd.print(' ')" }
n2@{ label: "I2C LCD Display Address: 0x27 Row 0: 'Freq:' Row 1 <count>" }
end
subgraph s1["Signal Input"]
n1["External Digital Pulse Signal"]
end
subgraph s2["Measurement Stage"]
n4["Arduino Hardware Timer/Counter"]
n5["FreqCount.available() FreqCount.read()"]
n6["unsigned long count"]
end
n1 -- Digital pulses --> n4
n4 -- 1000ms gate --> n5
n5 -- Pulse count --> n6
n6 -- Numeric value --> nodeId
nodeId -- I2C commands --> n2
nodeId@{ shape: rect}
n2@{ shape: rect}
n1@{ shape: rect}
n4@{ shape: rect}
n5@{ shape: rect}
n6@{ shape: rect}
This diagram illustrates the unidirectional data flow from signal input through measurement to display output, showing the specific API methods invoked at each stage.
Sources:
- conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino 21-28
| Characteristic | Value | Location |
|---|---|---|
| Measurement gate time | 1000ms | conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino 18 |
| Update frequency | ~1 Hz | Determined by gate time |
| LCD I2C address | 0x27 | conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino 18 |
| LCD dimensions | 16 columns × 2 rows | conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino 18 |
| Serial baud rate | 57600 | conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino 18 |
| Count variable type | unsigned long |
conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino 18 |
| Display row 0 | Static label "Freq:" |
conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino 18 |
| Display row 1 | Dynamic frequency count | conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino 18 |
Sources:
- conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino 1-28
The entire application is contained in a single Arduino sketch file:
- conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino- Complete frequency measurement and display implementation
FreqCount.h- Frequency counting library (must be installed separately)LiquidCrystal_I2C.h- I2C LCD control library (must be installed separately)
Sources:
- conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino 1-2
The system implements several key design patterns:
The loop() function uses FreqCount.available() to check for data availability without blocking execution. This allows the system to remain responsive while waiting for measurements to complete.
External libraries (FreqCount and LiquidCrystal_I2C) provide abstraction over hardware timer/counter peripherals and I2C bus communication, simplifying the application code.
Each component has a clearly defined purpose:
FreqCount:Measures frequency using hardware timersLiquidCrystal_I2C:Controls I2C LCD displaySerial:Provides debugging interface (initialized but unused)
Sources:
- conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino 21-28