Los contadores son ampliamente usados en muchos sistemas electrónicos, como por ejemplo en máquinas herramientas, procesos industriales, acceso a sistemas de transporte, bancos, páginas Web, programas de computador, algoritmos matemáticos, etc. De ahí su importancia de saber cómo funcionan en los microcontroladores. En este articulo aprenderemos a construir un contador de 2 dígitos con la tarjeta Arduino Uno.

 

En la Figura 1 podemos ver la tarjeta Arduino Uno y el la Figura 2 el IDE o Interface de Desarrollo para escribir programas en Arduino Uno, comúnmente llamados Sketch. Esta IDE puede ser descargada del sitio web de Arduino.

 

 


 

 

 


 

 

 

Para el desarrollo del contador de 2 dígitos, vamos a usar los pines: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, A0, A1 y A2. El primer digito, es decir, el que representa las unidades, está conectado a los pines: 2, 3, 4, 5, 6, 7 y 8. El segundo digito, es decir, el que representa las decenas, está conectado a los pines: 9, 10, 11, 12, A0, A1 y A2. En los diagramas de este artículo, se muestran los pines A0, A1 y A2, conectados a los pines e1, f1 y g1 del display. Es necesario interconectar estos pines a sus respectivos pines en el display.

En la Figura 3 podemos observar las letras asignadas a cada segmento en el display.

 


 

 

Estas son: a, b, c, d, e, f y g. Los display usados para este articulos tienen 2 digitos y en la Figura 4 podemos ver los pines y sus conexiones a los respectivos segmentos.

 

 


 

 

Ya, la Figura 5 muestra los pines usados en la tarjeta Arduino Uno para controlar el display de 7 segmentos.

 

 


 

 

El orden de pines es el siguiente:

 

Pin 2 - Segmento a2

Pin 3 - Segmento b2

Pin 4 - Segmento c2

Pin 5 - Segmento d2

Pin 6 - Segmento e2

Pin 7 - Segmento f2

Pin 8 - Segmento g2

 

Pin 9 - Segmento a1

Pin 10 - Segmento b1

Pin 11 - Segmento c1

Pin 12 - Segmento d1

Pin A0 - Segmento e1

Pin A1 - Segmento f1

Pin A2 - Segmento g1

 

 

 

CONTADOR INCREMENTAL POR PROGRAMA.

En este sketch implementamos un contador incremental por programa. El contador comienza en cero y se va incrementando hasta 99, luego se detiene por 10 segundos, volviendo a incrementarse hasta llegar a 99. Asi, se repite el mismo bucle infinitamente. La Figura 6 muestra el circuito electronico para implementar este contador.

 


 

 

 

El código para el contador incremental es el siguiente:

const int display_1_Pinout[7] = { 2, 3, 4, 5, 6, 7, 8 };

const int display_2_Pinout[7] = { 9, 10, 11, 12, A0, A1, A2 };

const byte anodeDisplay[10] =

{

0b1000000, //0

0b1111001, //1

0b0100100, //2

0b0110000, //3

0b0011001, //4

0b0010010, //5

0b0000010, //6

0b1111000, //7

0b0000000, //8

0b0010000, //9

};

 

***************************************************************
**************************************************************/
void setup()

{

for(int i = 0; i < 7; i++)

{

pinMode(display_1_Pinout[i], OUTPUT);

pinMode(display_2_Pinout[i], OUTPUT);

}

}

 

***************************************************************
**************************************************************/
void Display_2_Write(int number)

{

 

byte numberBit = anodeDisplay[number];

 

for (int i = 0; i < 7; i++)

{

int bit = bitRead(numberBit, i);

digitalWrite(display_2_Pinout[i], bit);

}

}

 

***************************************************************
**************************************************************/
void Display_1_Write(int number)

{

 

byte numberBit = anodeDisplay[number];

 

for (int i = 0; i < 7; i++)

{

int bit = bitRead(numberBit, i);

digitalWrite(display_1_Pinout[i], bit);

}

}

 

***************************************************************
**************************************************************/
void Display_Show(int number)

{

int units = number % 10;

int tens = number / 10;

 

Display_1_Write(units);

Display_2_Write(tens);

}

 

***************************************************************
**************************************************************/
void loop()

{

for(int cnt=0; cnt<100; cnt++)

{

Display_Show(cnt);

delay(1000);

}

 

delay(10000);

}

 

El incremento se hace por programa usando un bucle for(). La siguiente línea de código se encarga de ejecutar este bucle:

 

for(int cnt=0; cnt<100; cnt++)

 

La variable entera cnt, se inicializa con cero y por cada paso que la instrucción for() ejecute, se verifica si la variable cnt es menor que 100. Si es menor, el bucle for() se ejecuta, incrementado la variable cnt. Si es mayor o igual 100, se sale del bucle for() y se ejecuta la instrucción: delay(10000), la cual retarda el programa por 10 segundos.

La función Display_Show(), recibe un parámetro entero y se encarga de extraer las unidades (units) y las decenas (tens). Luego llamamos las funciones: Display_1_Write(units); y Display_2_Write(tens); para mostrar estos valores en el display de 7 segmentos.

 

CONTADOR DECREMENTAL POR PROGRAMA.

En este sketch implementamos un contador decremental por programa. El contador comienza en 99 y se va decrementando hasta cero, luego se detiene por 10 segundos, volviendo a decrementarse hasta llegar a cero. Así, se repite el mismo bucle infinitamente. La Figura 6 muestra el circuito electrónico para implementar este contador. El código para el contador decremental es el siguiente:

const int display_1_Pinout[7] = { 2, 3, 4, 5, 6, 7, 8 };

const int display_2_Pinout[7] = { 9, 10, 11, 12, A0, A1, A2 };

 

const byte anodeDisplay[10] =

{

0b1000000, //0

0b1111001, //1

0b0100100, //2

0b0110000, //3

0b0011001, //4

0b0010010, //5

0b0000010, //6

0b1111000, //7

0b0000000, //8

0b0010000, //9

};

 

***************************************************************
**************************************************************/
 

void setup()

{

for(int i = 0; i < 7; i++)

{

pinMode(display_1_Pinout[i], OUTPUT);

pinMode(display_2_Pinout[i], OUTPUT);

}

}

 

***************************************************************
**************************************************************/
void Display_2_Write(int number)

{

 

byte numberBit = anodeDisplay[number];

 

for (int i = 0; i < 7; i++)

{

int bit = bitRead(numberBit, i);

digitalWrite(display_2_Pinout[i], bit);

}

}

 

***************************************************************
**************************************************************/
void Display_1_Write(int number)

{

 

byte numberBit = anodeDisplay[number];

 

for (int i = 0; i < 7; i++)

{

int bit = bitRead(numberBit, i);

digitalWrite(display_1_Pinout[i], bit);

}

}

 

***************************************************************
**************************************************************/
void Display_Show(int number)

{

int units = number % 10;

int tens = number / 10;

 

Display_1_Write(units);

Display_2_Write(tens);

}

 

***************************************************************
**************************************************************/
void loop()

{

for(int cnt=99; cnt >= 0; cnt--)

{

Display_Show(cnt);

delay(1000);

}

 

delay(10000);

}

 

 

 

Básicamente el código de este sketch es igual al del ejemplo anterior. La función que se encarga del decremento es:

 

for(int cnt=99; cnt >= 0; cnt--)

 

Este bucle for(), inicializa la variable cnt en 99 y verifica si esta es mayor o igual a cero. Si así, entonces entra en el bucle, decrementando la variable cnt. Caso se menor de cero, el bucle for() sale y es temporizado el programa por 10 segundos. Las demás funciones, trabajan igual que las del ejemplo anterior.

 

CONTADOR INCREMENTAL DECREMENTAL POR PROGRAMA.

En este sketch implementamos un contador incremental decremental por programa. Este sketch es la combinación de los dos anteriores ejemplos. Se configura la entrada digital A3 para seleccionar incrementar o decrementar el contador. Esta selección tiene su efecto cuando el bucle for() salga del loop.

 

 


 

 

 

La Figura 7 muestra el circuito electrónico para testar este ejemplo. El código es el siguiente:

 

int incDecPinin = A3;

 

const int display_1_Pinout[7] = { 2, 3, 4, 5, 6, 7, 8 };

const int display_2_Pinout[7] = { 9, 10, 11, 12, A0, A1, A2 };

 

const byte anodeDisplay[10] =

{

0b1000000, //0

0b1111001, //1

0b0100100, //2

0b0110000, //3

0b0011001, //4

0b0010010, //5

0b0000010, //6

0b1111000, //7

0b0000000, //8

0b0010000, //9

};

 

***************************************************************
**************************************************************/
void setup()

{

pinMode(incDecPinin, INPUT_PULLUP);

 

for(int i = 0; i < 7; i++)

{

pinMode(display_1_Pinout[i], OUTPUT);

pinMode(display_2_Pinout[i], OUTPUT);

}

}

 

***************************************************************
**************************************************************/
void Display_2_Write(int number)

{

 

byte numberBit = anodeDisplay[number];

 

for (int i = 0; i < 7; i++)

{

int bit = bitRead(numberBit, i);

digitalWrite(display_2_Pinout[i], bit);

}

}

 

***************************************************************
**************************************************************/
void Display_1_Write(int number)

{

 

byte numberBit = anodeDisplay[number];

 

for (int i = 0; i < 7; i++)

{

int bit = bitRead(numberBit, i);

digitalWrite(display_1_Pinout[i], bit);

}

}

 

***************************************************************
**************************************************************/
void Display_Show(int number)

{

int units = number % 10;

int tens = number / 10;

 

Display_1_Write(units);

Display_2_Write(tens);

}

 

***************************************************************
**************************************************************/
void loop()

{

 

if ( digitalRead(incDecPinin) == HIGH )

{

for(int cnt=0; cnt<100; cnt++)

{

Display_Show(cnt);

delay(1000);

}

}

else

{

for(int cnt=99; cnt >= 0; cnt--)

{

Display_Show(cnt);

delay(1000);

}

}

 

delay(10000);

}

 

 

CONTADOR INCREMENTAL POR PULSO.

En este sketch implementamos un contador incremental por pulso. El circuito para testar este ejemplo puede ser observado en la Figura 8.

 


| Haga click en la imagen para ampliar |

 

 

Para generar los pulsos del contador, usamos un interruptor o pulsador. La mayor parte de los pines de la tarjeta Arduino Uno, tienen una resistencia interna conectada a positivo y que puede ser habilitada usando el parámetro INPUT_PULLUP, cuando se configure el pin como entrada. En lo que respecta al programa del contador, la Figura 9, muestra una máquina de estados usada para este ejemplo y que explicaremos más adelante.

 

 


 

 

 

El código para este ejemplo es el siguiente:

 

enum States

{

High,

Low

};

 

enum Events

{

EV_HIGH,

EV_LOW,

};

 

 

int buttonPinin = A3;

int buttonValue = 0;

int counter = 0;

int state = High;

 

 

const int display_1_Pinout[7] = { 2, 3, 4, 5, 6, 7, 8 };

const int display_2_Pinout[7] = { 9, 10, 11, 12, A0, A1, A2 };

 

const byte anodeDisplay[10] =

{

0b1000000, //0

0b1111001, //1

0b0100100, //2

0b0110000, //3

0b0011001, //4

0b0010010, //5

0b0000010, //6

0b1111000, //7

0b0000000, //8

0b0010000, //9

};

 

***************************************************************
**************************************************************/
void setup()

{

pinMode(buttonPinin, INPUT_PULLUP);

 

for(int i = 0; i < 7; i++)

{

pinMode(display_1_Pinout[i], OUTPUT);

pinMode(display_2_Pinout[i], OUTPUT);

}

 

Display_Show(counter);

}

 

***************************************************************
**************************************************************/
void Display_2_Write(int number)

{

 

byte numberBit = anodeDisplay[number];

 

for (int i = 0; i < 7; i++)

{

int bit = bitRead(numberBit, i);

digitalWrite(display_2_Pinout[i], bit);

}

}

 

***************************************************************
**************************************************************/
void Display_1_Write(int number)

{

byte numberBit = anodeDisplay[number];

 

for (int i = 0; i < 7; i++)

{

int bit = bitRead(numberBit, i);

digitalWrite(display_1_Pinout[i], bit);

}

}

 

***************************************************************
**************************************************************/
void Display_Show(int number)

{

int units = number % 10;

int tens = number / 10;

 

Display_1_Write(units);

Display_2_Write(tens);

}

 

***************************************************************
**************************************************************/
void StateMachine(Events e)

{

switch (state)

{

case High:

switch (e)

{

case EV_LOW:

counter++;

if(counter>=100)

counter=0;

Display_Show(counter);

state = Low;

}

break;

 

case Low:

switch (e)

{

case EV_HIGH:

state = High;

}

break;

 

}

}

 

***************************************************************
**************************************************************/
void loop()

{

buttonValue = digitalRead(buttonPinin);

 

if (buttonValue == HIGH)

{

StateMachine(EV_HIGH);

}

else

{

StateMachine(EV_LOW);

}

}

 

 

Las máquinas de estado son códigos basados en instrucciones de decisión (switch), la cual determina en qué estado se encuentra un programa y así ejecutar algún respectivo código. Para este ejemplo tenemos los estados High y Low, los cuales determinan el estado del pulsador. Si el programa se encuentra en estado High, y es presionado el pulsador, el programa, envía el evento EV_LOW, a este estado y es llamado un código para incrementar el contador y mostrarlo en display.

Note, que el contador es verificado para ver si ya llego a 100, y de este modo resetearlo a cero (0). Luego llamamos la función: Display_Show(counter); para escribir el valor del contador en los displays. También, es cambiado el estado del pulsador para Low. Esta técnica es usada para incrementar el contador, solamente cuando el pulsador pase de alto para bajo, es decir cuando sea presionado por el usuario. Note que es colocado un capacitor de 0.22 microfaradios, para evitar los ruidos producidos por los pulsadores o interruptores, pues estos al ser mecánicos, envían muchos pulsos al circuito, cuando son presionados.

La función loop(), se encarga de leer el pulsador y llamar la función: StateMachine(Events e), enviando como parámetro el evento apropiado.

 

 

CONTADOR INCREMENTAL CON SETPOINT.

En este sketch implementamos un contador incremental por pulso con setpoint. Cuando se llegue al valor programado en el setpoint, se encenderá un LED. El circuito para testar este programa puede ser visto en la Figura 10. El siguiente es el código ejemplo:

 


 

 

enum States

{

High,

Low

};

 

enum Events

{

EV_HIGH,

EV_LOW,

};

 

const int SETPOINT = 37;

const int buttonPinin = A3;

const int ledPinout = A4;

 

int buttonValue = 0;

int counter = 0;

int state = High;

 

 

const int display_1_Pinout[7] = { 2, 3, 4, 5, 6, 7, 8 };

const int display_2_Pinout[7] = { 9, 10, 11, 12, A0, A1, A2 };

 

const byte anodeDisplay[10] =

{

0b1000000, //0

0b1111001, //1

0b0100100, //2

0b0110000, //3

0b0011001, //4

0b0010010, //5

0b0000010, //6

0b1111000, //7

0b0000000, //8

0b0010000, //9

};

 

***************************************************************
**************************************************************/
void setup()

{

pinMode(ledPinout, OUTPUT);

Led_Off();

pinMode(buttonPinin, INPUT_PULLUP);

 

for(int i = 0; i < 7; i++)

{

pinMode(display_1_Pinout[i], OUTPUT);

pinMode(display_2_Pinout[i], OUTPUT);

}

 

Display_Show(counter);

 

}

 

***************************************************************
**************************************************************/
void Led_On()

{

digitalWrite(ledPinout, LOW);

}

 

***************************************************************
**************************************************************/
void Led_Off()

{

digitalWrite(ledPinout, HIGH);

}

 

***************************************************************
**************************************************************/
void Display_2_Write(int number)

{

 

byte numberBit = anodeDisplay[number];

 

for (int i = 0; i < 7; i++)

{

int bit = bitRead(numberBit, i);

digitalWrite(display_2_Pinout[i], bit);

}

}

 

***************************************************************
**************************************************************/
void Display_1_Write(int number)

{

byte numberBit = anodeDisplay[number];

 

for (int i = 0; i < 7; i++)

{

int bit = bitRead(numberBit, i);

digitalWrite(display_1_Pinout[i], bit);

}

}

 

***************************************************************
**************************************************************/
void Display_Show(int number)

{

int units = number % 10;

int tens = number / 10;

 

Display_1_Write(units);

Display_2_Write(tens);

}

 

***************************************************************
**************************************************************/
void StateMachine(Events e)

{

switch (state)

{

case High:

switch (e)

{

case EV_LOW:

counter++;

 

if(counter == SETPOINT)

{

Led_On();

}

else if(counter > SETPOINT)

{

counter=1;

Led_Off();

}

else

{

Led_Off();

}

 

Display_Show(counter);

state = Low;

}

break;

 

case Low:

switch (e)

{

case EV_HIGH:

state = High;

}

break;

 

}

}

 

***************************************************************
**************************************************************/
void loop()

{

buttonValue = digitalRead(buttonPinin);

 

if (buttonValue == HIGH)

{

StateMachine(EV_HIGH);

}

else

{

StateMachine(EV_LOW);

}

}

 

 

 En este programa usamos la misma técnica del programa contador visto anteriormente en este artículo. Mas se ha agregado un constante entera definida en la siguiente línea de código:

 

const int SETPOINT = 37;

 

Este valor define el setpoint del contador. El valor se puede alterar para ajustarlo a la necesidad, pero debe estar en el rango de 1 hasta 99, para poder ser visualizado en el display. También, se definió un pin de salida para conectar un LED. La siguiente línea de código hace esto:

 

const int ledPinout = A4;

 

 

CONCLUCIÓN.

El manejo de display de 7 segmentos es relativamente fácil y sus aplicaciones son casi ilimitadas. Este código está dirigido a dos dígitos. Los contadores son la base para construir, temporizadores digitales, frecuencímetros digitales, velocímetros, tacómetros, etc.

Nota: No olvidar conectar el capacitor de 0.22 uF al pin de entrada A3, pues esto evitara el ruido producido por los rebotes mecánicos de los pulsadores.

 

 

18.983MBMemory Usage56.44msRequest Duration
Joomla! Version5.2.3
PHP Version8.3.16
Identityguest
Response200
Templatecassiopeia
Database
Server
mysql
Version
10.5.22-MariaDB
Collation
latin1_swedish_ci
Conn Collation
utf8mb4_general_ci
$_GET
[]
$_POST
[]
$_SESSION
array:1 [ "joomla" => "***redacted***" ]
$_COOKIE
[]
$_SERVER
array:51 [ "USER" => "apache" "HOME" => "/usr/share/httpd" "SCRIPT_NAME" => "/index.php" "RE...
session
array:3 [ "counter" => 1 "timer" => array:3 [ "start" => 1741944645 "last" => 1741944645...
registry
array:3 [ "data" => [] "initialized" => false "separator" => "." ]
user
array:21 [ "id" => 0 "name" => null "username" => null "email" => null "password" => "***r...
  • afterLoad (85.86KB) (211μs)
  • afterInitialise (1.14MB) (3.84ms)
  • afterRoute (179.16KB) (1.04ms)
  • beforeRenderComponent com_content (100.65KB) (455μs)
  • Before Access::preloadComponents (all components) (33.5KB) (211μs)
  • After Access::preloadComponents (all components) (107.06KB) (610μs)
  • Before Access::preloadPermissions (com_content) (1.57KB) (8μs)
  • After Access::preloadPermissions (com_content) (16.19MB) (34.18ms)
  • Before Access::getAssetRules (id:289 name:com_content.article.9963) (514.65KB) (777μs)
  • After Access::getAssetRules (id:289 name:com_content.article.9963) (7.38KB) (39μs)
  • afterRenderComponent com_content (460.57KB) (6.39ms)
  • afterDispatch (2.25KB) (48μs)
  • beforeRenderRawModule mod_articles_category (Banco de Circuitos) (359.33KB) (2.11ms)
  • afterRenderRawModule mod_articles_category (Banco de Circuitos) (79.43KB) (379μs)
  • beforeRenderRawModule mod_finder (Busca_inteligente) (5.9KB) (110μs)
  • afterRenderRawModule mod_finder (Busca_inteligente) (64.98KB) (1.33ms)
  • beforeRenderModule mod_articles_category (Banco de Circuitos) (9.98KB) (714μs)
  • afterRenderModule mod_articles_category (Banco de Circuitos) (5.39KB) (75μs)
  • beforeRenderModule mod_finder (Busca_inteligente) (6.39KB) (255μs)
  • afterRenderModule mod_finder (Busca_inteligente) (4.75KB) (62μs)
  • afterRender (289.73KB) (3.51ms)
  • 1 x After Access::preloadPermissions (com_content) (16.19MB) (60.55%)
    34.18ms
    1 x afterRenderComponent com_content (460.57KB) (11.33%)
    6.39ms
    1 x afterInitialise (1.14MB) (6.8%)
    3.84ms
    1 x afterRender (289.73KB) (6.21%)
    3.51ms
    1 x beforeRenderRawModule mod_articles_category (Banco de Circuitos) (359.33KB) (3.75%)
    2.11ms
    1 x afterRenderRawModule mod_finder (Busca_inteligente) (64.98KB) (2.35%)
    1.33ms
    1 x afterRoute (179.16KB) (1.84%)
    1.04ms
    1 x Before Access::getAssetRules (id:289 name:com_content.article.9963) (514.65KB) (1.38%)
    777μs
    1 x beforeRenderModule mod_articles_category (Banco de Circuitos) (9.98KB) (1.26%)
    714μs
    1 x After Access::preloadComponents (all components) (107.06KB) (1.08%)
    610μs
    1 x beforeRenderComponent com_content (100.65KB) (0.81%)
    455μs
    1 x afterRenderRawModule mod_articles_category (Banco de Circuitos) (79.43KB) (0.67%)
    379μs
    1 x beforeRenderModule mod_finder (Busca_inteligente) (6.39KB) (0.45%)
    255μs
    1 x afterLoad (85.86KB) (0.37%)
    211μs
    1 x Before Access::preloadComponents (all components) (33.5KB) (0.37%)
    211μs
    1 x beforeRenderRawModule mod_finder (Busca_inteligente) (5.9KB) (0.19%)
    110μs
    1 x afterRenderModule mod_articles_category (Banco de Circuitos) (5.39KB) (0.13%)
    75μs
    1 x afterRenderModule mod_finder (Busca_inteligente) (4.75KB) (0.11%)
    62μs
    1 x afterDispatch (2.25KB) (0.09%)
    48μs
    1 x After Access::getAssetRules (id:289 name:com_content.article.9963) (7.38KB) (0.07%)
    39μs
    1 x Before Access::preloadPermissions (com_content) (1.57KB) (0.01%)
    8μs
21 statements were executed, 5 of which were duplicates, 16 unique18.36ms1.63MB
  • SELECT @@SESSION.sql_mode;33μs968B/libraries/src/Session/MetadataManager.php:184Copy
  • SELECT `session_id` FROM `incbmx_session` WHERE `session_id` = :session_id LIMIT 182μs1.3KBParams/libraries/src/Session/MetadataManager.php:187Copy
  • INSERT INTO `incbmx_session` (`session_id`,`guest`,`time`,`userid`,`username`,`client_id`) VALUES (:session_id, :guest, :time, :user_id, :username, :client_id)220μs944BParams/libraries/src/Session/MetadataManager.php:260Copy
  • SELECT `id`,`rules` FROM `incbmx_viewlevels`59μs656B/libraries/src/Access/Access.php:955Copy
  • SELECT `b`.`id` FROM `incbmx_usergroups` AS `a` LEFT JOIN `incbmx_usergroups` AS `b` ON `b`.`lft` <= `a`.`lft` AND `b`.`rgt` >= `a`.`rgt` WHERE `a`.`id` = :guest90μs1.64KBParams/libraries/src/Access/Access.php:868Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`318μs20.2KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `incbmx_assets` WHERE `name` IN (:preparedArray1,:preparedArray2,:preparedArray3,:preparedArray4,:preparedArray5,:preparedArray6,:preparedArray7,:preparedArray8,:preparedArray9,:preparedArray10,:preparedArray11,:preparedArray12,:preparedArray13,:preparedArray14,:preparedArray15,:preparedArray16,:preparedArray17,:preparedArray18,:preparedArray19,:preparedArray20,:preparedArray21,:preparedArray22,:preparedArray23,:preparedArray24,:preparedArray25,:preparedArray26,:preparedArray27,:preparedArray28,:preparedArray29,:preparedArray30,:preparedArray31,:preparedArray32,:preparedArray33,:preparedArray34,:preparedArray35,:preparedArray36,:preparedArray37,:preparedArray38,:preparedArray39)409μs7.44KBParams/libraries/src/Access/Access.php:357Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `incbmx_assets` WHERE `name` LIKE :asset OR `name` = :extension OR `parent_id` = 014.73ms1.46MBParams/libraries/src/Access/Access.php:301Copy
  • SHOW FULL COLUMNS FROM `incbmx_content`287μs2.39KB/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:587Copy
  • UPDATE `incbmx_content` SET `hits` = (`hits` + 1) WHERE `id` = '9963'146μs48B/libraries/src/Table/Table.php:1348Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `incbmx_content` AS `a` INNER JOIN `incbmx_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `incbmx_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `incbmx_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `incbmx_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `incbmx_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)203μs54.13KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`178μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `m`.`tag_id`,`t`.* FROM `incbmx_contentitem_tag_map` AS `m` INNER JOIN `incbmx_tags` AS `t` ON `m`.`tag_id` = `t`.`id` WHERE `m`.`type_alias` = :contentType AND `m`.`content_item_id` = :id AND `t`.`published` = 1 AND `t`.`access` IN (:preparedArray1,:preparedArray2)248μs4KBParams/libraries/src/Helper/TagsHelper.php:388Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`206μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT DISTINCT a.id, a.title, a.name, a.checked_out, a.checked_out_time, a.note, a.state, a.access, a.created_time, a.created_user_id, a.ordering, a.language, a.fieldparams, a.params, a.type, a.default_value, a.context, a.group_id, a.label, a.description, a.required, a.only_use_in_subform,l.title AS language_title, l.image AS language_image,uc.name AS editor,ag.title AS access_level,ua.name AS author_name,g.title AS group_title, g.access as group_access, g.state AS group_state, g.note as group_note FROM incbmx_fields AS a LEFT JOIN `incbmx_languages` AS l ON l.lang_code = a.language LEFT JOIN incbmx_users AS uc ON uc.id=a.checked_out LEFT JOIN incbmx_viewlevels AS ag ON ag.id = a.access LEFT JOIN incbmx_users AS ua ON ua.id = a.created_user_id LEFT JOIN incbmx_fields_groups AS g ON g.id = a.group_id LEFT JOIN `incbmx_fields_categories` AS fc ON fc.field_id = a.id WHERE ( (`a`.`context` = :context AND (`fc`.`category_id` IS NULL OR `fc`.`category_id` IN (:preparedArray1,:preparedArray2,:preparedArray3)) AND `a`.`access` IN (:preparedArray4,:preparedArray5)) AND (`a`.`group_id` = 0 OR `g`.`access` IN (:preparedArray6,:preparedArray7)) AND `a`.`state` = :state) AND (`a`.`group_id` = 0 OR `g`.`state` = :gstate) AND `a`.`only_use_in_subform` = :only_use_in_subform ORDER BY a.ordering ASC412μs4.81KBParams/libraries/src/MVC/Model/BaseDatabaseModel.php:164Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`235μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `name`,`element` FROM `incbmx_extensions` WHERE `type` = 'plugin' AND `folder` = 'finder' AND `enabled` = 1120μs1.89KB/administrator/components/com_finder/src/Helper/LanguageHelper.php:135Copy
  • SELECT `title` FROM `incbmx_finder_taxonomy` WHERE `parent_id` = 1 AND `state` = 1 AND `access` IN (1,5)95μs648B/administrator/components/com_finder/src/Indexer/Taxonomy.php:325Copy
  • SELECT * FROM `incbmx_schemaorg` WHERE `itemId` = :itemId AND `context` = :context80μs1.55KBParams/plugins/system/schemaorg/src/Extension/Schemaorg.php:403Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `incbmx_content` AS `a` INNER JOIN `incbmx_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `incbmx_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `incbmx_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `incbmx_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `incbmx_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)152μs54.17KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT SUM(CASE WHEN `a`.`next_execution` <= :now THEN 1 ELSE 0 END) AS due_count,SUM(CASE WHEN `a`.`locked` IS NULL THEN 0 ELSE 1 END) AS locked_count FROM `incbmx_scheduler_tasks` AS `a` WHERE `a`.`state` = 161μs1.37KBParams/administrator/components/com_scheduler/src/Model/TasksModel.php:465Copy