Skip to content

brayanftobonc/frecuency-signal-generator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 

Repository files navigation

Overview

Purpose and Scope

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

System Description

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

Core Components

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)

Component instantiation

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}

Loading

Diagram: Code Entity Relationships

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

System Operation Model

The Arduino sketch follows the standard Arduino execution model with two main functions: setup() and loop().

Function Execution Flow

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
Loading

Diagram: Execution Flow with Function Names

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

Initialization Sequence (setup() function)

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:

  1. Serial initialization: Serial.begin(57600) configures UART communication at 57600 baud
  2. LCD initialization: lcd.init() initializes the I2C LCD controller
  3. Backlight activation: lcd.backlight() enables the LCD backlight
  4. Display clear: lcd.clear() clears any existing display content
  5. Splash screen: Displays "Circle" at position (0,0) for 2000ms
  6. Static label: Displays "Freq:" at position (0,0) as a permanent label
  7. 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

Runtime Operation (loop() function)

The loop() function

- conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino 21-28

implements a non-blocking polling pattern:

  1. Availability check: FreqCount.available() returns true when a measurement is ready
  2. Data retrieval: count = FreqCount.read() retrieves the accumulated pulse count
  3. 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

Data Flow Architecture

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 &lt;count&gt;" }
  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}
Loading

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

Key Technical Characteristics

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

System Files

The entire application is contained in a single Arduino sketch file:

Main Application:

  • - conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino - Complete frequency measurement and display implementation

External Dependencies (not included in repository):

  • 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

Architectural Patterns

The system implements several key design patterns:

Non-Blocking Polling

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.

Hardware Abstraction

External libraries (FreqCount and LiquidCrystal_I2C) provide abstraction over hardware timer/counter peripherals and I2C bus communication, simplifying the application code.

Single Responsibility

Each component has a clearly defined purpose:

  • FreqCount: Measures frequency using hardware timers
  • LiquidCrystal_I2C: Controls I2C LCD display
  • Serial: Provides debugging interface (initialized but unused)

Sources: - conteo de frecuencia y visualizacion i2c/conteo de frecuencia y visualizacion i2c.ino 21-28

About

Frecuencímetro que acondiciona señales analógicas a onda cuadrada mediante un comparador para su medición. El Arduino, usando la librería FreqCount, calcula la frecuencia contando pulsos durante 1 segundo. El resultado se transmite vía protocolo I2C (dirección 0x27) a una pantalla LCD. El codigo es aparte del proyecto generador de señales.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages