Como podemos ver en el artículo NodeMCU - primeros pasos (MIC024S), el NodeMCU es una tarjeta de desarrollo muy interesante, tanto como proyectos para Internet de las Cosas o para proyectos "locales" (que no requieren conectividad a Internet). Por este motivo el NodeMCU es muy usado en el control de diversos periféricos, desde simples LEDs hasta motores DC. Y lo que veremos en este artículo es justamente eso, como accionar un motor DC utilizando como tarjeta de control el NodeMCU. Al comprender el contenido de este artículo, usted será capaz de hacer proyectos aún más interesantes y desafiantes.

 

Material necesario

   Para reproducir el proyecto abordado en este artículo (es decir, comprobar el accionamiento de un motor DC con el NodeMCU), necesitará:

- Una tarjeta NodeMCU

- Una fuente / cargador de celular (conector micro-USB) - tensión de 5V, con al menos 1A de corriente de salida

- Dos motores DC de 3V a 6V de tensión de operación (modelos con caja de reducción acoplada también están permitidos)

- Un cable micro-USB (para la programación de NodeMCU)

- Dos transistores BC548 (o equivalente NPN como el BC337)

- Dos pulsadores

- Dos resistores 1K / 0,25W

- Dos resistores 2K2 / 0,25W

- Dos resistencias 220R / 0,25W

- Módulo relé / Shield relé de 2 canales

 

Entradas y salidas de NodeMCU - información importante

Como hemos visto en el artículo NodeMCU - primeros pasos (MIC160), el NodeMCU tiene varias entradas y salidas disponibles para el desarrollador. Sin embargo, es muy importante tener en cuenta la siguiente información:

 

- Las entradas y salidas (GPIOs configuradas como input y / o output) del NodeMCU funcionan SOLAMENTE con tensión de 3,3V. Por lo tanto, no son tolerantes a 5V. Si se desobedeció y / o no se consideró, el NodeMCU se dañaría permanentemente.

- Una salida del NodeMCU (GPIO configurado como salida) puede tener corriente máxima drenada de 12mA. Cualquier necesidad de corriente además de ésta requiere el uso de un circuito controlador / circuito de accionamiento electrónico (escudo). Desconsiderar y / o desobedecer esta limitación puede llevar al NodeMCU a daños permanentes.

 

Diseño / demostración: accionamiento de motor DC

   El proyecto / demostración de accionamiento de motor DC que haremos aquí permitirá utilizar el NodeMCU para controlar si un motor girará o no.

   El control de los motores (por parte del usuario) se hace vía push-buttons. Es decir, el NodeMCU será responsable de estar constantemente leyendo el estado de las entradas en que los pulsadores están conectados y, al apretar uno de ellos, el NodeMCU activará el motor correspondiente.

   Es importante resaltar que, como el NodeMCU no posee capacidad de corriente para accionar un motor de forma directa, siendo restringido al procesamiento del proyecto y generación de señales de baja potencia. Por lo tanto, un circuito de controlador de motor es necesario. Este circuito será el responsable de la interfaz entre motores DC y NodeMCU, y tal técnica es ampliamente utilizada en la electrónica y automatización.

   Utilizando los conceptos de este experimento, usted será capaz de controlar varios motores DC, algo muy útil en la robótica.

 

Circuito esquemático

   Para hacer el control de los motores DC como descrito arriba, vamos a montar el circuito esquemático de la figura 1.

 

Figura 1 - circuito esquemático del proyecto / demostración de este artículo
Figura 1 - circuito esquemático del proyecto / demostración de este artículo

 

   Sin embargo, antes de montar, tenga en cuenta las siguientes observaciones:

- Al observar el circuito esquemático, usted notará que se utilizaron transistores para accionar el Shield de Relés desde el NodeMCU. Esto fue necesario porque el Shield de Relés requiere una tensión de accionamiento mayor que la tensión de salida de un GPIO del NodeMCU (el NodeMCU utiliza 3,3V, mientras que el Shield de Relés necesita 5V). Como no es una buena idea accionarlo con una tensión menor que la especificada, los transistores serán responsables de "convertir" los niveles de tensión a un nivel dentro de lo especificado.

- Como se puede observar en el circuito esquemático, se utilizó un regulador de tensión 7805. El motivo de utilizarlo es su alta popularidad y fácil disponibilidad en el mercado (gran parte de los profesionales y / o aficionados de electrónica ya utilizó este regulador). Pero recuerde: el consumo máximo que el 7805 alimentos es 1A. Si va a aprovechar este circuito para otro proyecto, asegúrese de trabajar dentro de este límite de corriente o cambiar el regulador a un compatible con lo que su proyecto necesita

 

Código fuente

El código fuente del proyecto se encuentra abajo:

// Programa: Control de motor DC con NodeMCU.

// Descripción: NodeMCU acciona los motores según el usuario

// apriete los pulsadores pulsados a las entradas D2

// y D3

//Autor: Pedro Bertoleti

 

// incluye

#include

 

// define - pines a los que están conectados los controladores de los motores

// (circuitos transistorizados + relé shield)

#define MOTOR1_SAIDA D0

#define MOTOR2_SAIDA D1

 

// define - pines que contendrán los botones para controlar

// accionamiento de los motores (control independiente de accionamiento)

#define BOTAO_PARA_ACIONAR_MOTOR1 D2

#define BOTAO_PARA_ACIONAR_MOTOR2 D3

 

// función de configuración / inicialización

void setup ()

{

  // Configura todas las entradas (conectadas a los pulsadores)

  // y salidas (conectadas a los controladores de los motores)

  pinMode (MOTOR1_SAIDA, OUTPUT);

  pinMode (MOTOR2_SAIDA, OUTPUT);

  pinMode (BOTAO_PARA_ACIONAR_MOTOR1, INPUT);

  pinMode (BOTAO_PARA_ACIONAR_MOTOR2, INPUT);

  

  // inicializaciones de los motores: es buena práctica in inicializar

  // los estados de las salidas tan pronto como sea posible. En el caso de este

  // proyecto, los motores se inicializan apagados.

  digitalWrite (MOTOR1_SAIDA, LOW);

  digitalWrite (MOTOR2_SAIDA, LOW);

}

 

// bucle principal

void bucle ()

{

    char EstadoMotor1;

char EstadoMotor2;

 

// el programa simplemente le de forma constante (vía polling) los push-

// botones y toma la decisión de accionamiento o no conforme resultado

// de la lectura efectuada.

 

// le la entrada conectada al pushbutton 1 (entrada D2) y comprueba si

// debe conectar o desconectar el motor correspondiente (controlado por

// salida D0)

EstadoMotor1 = LOW;

    if (digitalRead (BOTAO_PARA_ACIONAR_MOTOR1) == LOW)

        EstadoMotor1 = HIGH;

    

    digitalWrite (MOTOR1_SAIDA, EstadoMotor1);

 

    // le la entrada conectada al pushbutton 2 (entrada D3) y comprueba si

// debe conectar o desconectar el motor correspondiente (controlado por

// salida D1)

    EstadoMotor2 = LOW;

if (digitalRead (BOTAO_PARA_ACIONAR_MOTOR2) == LOW)

        EstadoMotor2 = HIGH;

    

    digitalWrite (MOTOR2_SAIDA, EstadoMotor2);

}

 

 

Próximos pasos - desafios

   Ahora que hemos visto cómo accionar un motor DC con el NodeMCU, que tal hacer algunos desafíos? Ver algunos abajo:

- Utilizando el siguiente artículo aquí del sitio (Cómo utilizar el sensor de temperatura y humedad relativa DHT22 con el NodeMCU (MIC162)), accione un motor DC (con una hélice acoplada a su eje) para controlar la temperatura del ambiente. Por ejemplo: si la temperatura sube más allá de un valor / límite determinado, acciona el ventilador; si se encuentra por debajo de este valor / límite, apaga el ventilador.

- Utilizando otro artículo también aquí del sitio (Monitoreo de Temperatura Ambiente y Humedad Relativa del Aire vía Internet), haga el accionamiento de los motores vía Internet. De esta forma, desde cualquier lugar del mundo que tenga conectividad a Internet usted podrá accionar sus motores!

- Si tiene un motor DC más potente que los más comunes de mercado, vuelva a calcular / cambiar el tamaño del controlador de los motores de transistor para que el NodeMCU pueda controlarlos.

 

Conclusión

   En este artículo, hemos visto cómo controlar motores DC a través de un NodeMCU, ampliando aún más las posibilidades de proyectos a ser hechos con esta placa de desarrollo.

   Este proyecto / demostración puede ser evolucionado para control de diferentes portes de motores DC, permitiendo vislumbrar aplicaciones cada vez más reales y dentro del segmento de automatización.

 

 

19.024MBMemory Usage46.93msRequest Duration
Joomla! Version5.2.3
PHP Version8.3.20
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:49 [ "USER" => "apache" "HOME" => "/usr/share/httpd" "PATH_TRANSLATED" => "redirect:/ind...
session
array:3 [ "counter" => 1 "timer" => array:3 [ "start" => 1748912259 "last" => 1748912259...
registry
array:3 [ "data" => [] "initialized" => false "separator" => "." ]
user
array:21 [ "id" => 0 "name" => null "username" => null "email" => null "password" => "***r...
  • afterLoad (85.47KB) (1.24ms)
  • afterInitialise (1.14MB) (6.06ms)
  • afterRoute (179.21KB) (1.46ms)
  • beforeRenderComponent com_content (100.98KB) (631μs)
  • Before Access::preloadComponents (all components) (33.45KB) (383μs)
  • After Access::preloadComponents (all components) (107.06KB) (463μs)
  • Before Access::preloadPermissions (com_content) (1.57KB) (11μs)
  • After Access::preloadPermissions (com_content) (16.19MB) (21.78ms)
  • Before Access::getAssetRules (id:8 name:com_content) (480.05KB) (2.06ms)
  • After Access::getAssetRules (id:8 name:com_content) (7.36KB) (31μs)
  • afterRenderComponent com_content (456.27KB) (5.34ms)
  • afterDispatch (2.25KB) (43μs)
  • beforeRenderRawModule mod_articles_category (Banco de Circuitos) (422.53KB) (1.63ms)
  • afterRenderRawModule mod_articles_category (Banco de Circuitos) (15.43KB) (308μs)
  • beforeRenderRawModule mod_finder (Busca_inteligente) (5.9KB) (102μs)
  • afterRenderRawModule mod_finder (Busca_inteligente) (63.02KB) (1.11ms)
  • beforeRenderModule mod_articles_category (Banco de Circuitos) (9.27KB) (618μs)
  • afterRenderModule mod_articles_category (Banco de Circuitos) (5.47KB) (69μs)
  • beforeRenderModule mod_finder (Busca_inteligente) (6.64KB) (199μs)
  • afterRenderModule mod_finder (Busca_inteligente) (4.44KB) (48μs)
  • afterRender (312.5KB) (3.23ms)
  • 1 x After Access::preloadPermissions (com_content) (16.19MB) (46.41%)
    21.78ms
    1 x afterInitialise (1.14MB) (12.91%)
    6.06ms
    1 x afterRenderComponent com_content (456.27KB) (11.38%)
    5.34ms
    1 x afterRender (312.5KB) (6.88%)
    3.23ms
    1 x Before Access::getAssetRules (id:8 name:com_content) (480.05KB) (4.4%)
    2.06ms
    1 x beforeRenderRawModule mod_articles_category (Banco de Circuitos) (422.53KB) (3.47%)
    1.63ms
    1 x afterRoute (179.21KB) (3.12%)
    1.46ms
    1 x afterLoad (85.47KB) (2.64%)
    1.24ms
    1 x afterRenderRawModule mod_finder (Busca_inteligente) (63.02KB) (2.37%)
    1.11ms
    1 x beforeRenderComponent com_content (100.98KB) (1.34%)
    631μs
    1 x beforeRenderModule mod_articles_category (Banco de Circuitos) (9.27KB) (1.32%)
    618μs
    1 x After Access::preloadComponents (all components) (107.06KB) (0.99%)
    463μs
    1 x Before Access::preloadComponents (all components) (33.45KB) (0.82%)
    383μs
    1 x afterRenderRawModule mod_articles_category (Banco de Circuitos) (15.43KB) (0.66%)
    308μs
    1 x beforeRenderModule mod_finder (Busca_inteligente) (6.64KB) (0.42%)
    199μs
    1 x beforeRenderRawModule mod_finder (Busca_inteligente) (5.9KB) (0.22%)
    102μs
    1 x afterRenderModule mod_articles_category (Banco de Circuitos) (5.47KB) (0.15%)
    69μs
    1 x afterRenderModule mod_finder (Busca_inteligente) (4.44KB) (0.1%)
    48μs
    1 x afterDispatch (2.25KB) (0.09%)
    43μs
    1 x After Access::getAssetRules (id:8 name:com_content) (7.36KB) (0.07%)
    31μs
    1 x Before Access::preloadPermissions (com_content) (1.57KB) (0.02%)
    11μs
23 statements were executed, 5 of which were duplicates, 18 unique11.2ms1.58MB
  • SELECT @@SESSION.sql_mode;37μs968B/libraries/src/Session/MetadataManager.php:184Copy
  • SELECT `session_id` FROM `incbmx_session` WHERE `session_id` = :session_id LIMIT 162μ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)185μs944BParams/libraries/src/Session/MetadataManager.php:260Copy
  • SELECT `id`,`rules` FROM `incbmx_viewlevels`51μ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` = :guest78μ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`243μ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)314μ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` = 07.63ms1.48MBParams/libraries/src/Access/Access.php:301Copy
  • SHOW FULL COLUMNS FROM `incbmx_assets`323μs2.02KB/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:587Copy
  • SELECT * FROM `incbmx_assets` WHERE `name` = 'com_content.article.2457'65μs912B/libraries/src/Table/Table.php:780Copy
  • SHOW FULL COLUMNS FROM `incbmx_content`268μs1.77KB/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:587Copy
  • UPDATE `incbmx_content` SET `hits` = (`hits` + 1) WHERE `id` = '2457'125μ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)139μs22.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`176μ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)227μs3.97KBParams/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`162μ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 ASC434μs6.06KBParams/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`169μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `name`,`element` FROM `incbmx_extensions` WHERE `type` = 'plugin' AND `folder` = 'finder' AND `enabled` = 1133μs656B/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)86μs648B/administrator/components/com_finder/src/Indexer/Taxonomy.php:325Copy
  • SELECT * FROM `incbmx_schemaorg` WHERE `itemId` = :itemId AND `context` = :context71μ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)148μs22.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` = 168μs1.37KBParams/administrator/components/com_scheduler/src/Model/TasksModel.php:465Copy
  • warningassets - No asset found for com_content.article.2457, falling back to com_content
  • warningassets - No asset found for com_content.article.2457, falling back to com_content
  • warningassets - No asset found for com_content.article.2457, falling back to com_content
  • warningassets - No asset found for com_content.article.2457, falling back to com_content
  • warningassets - No asset found for com_content.article.2457, falling back to com_content
  • warningassets - No asset found for com_content.article.2457, falling back to com_content
  • warningassets - No asset found for com_content.article.2457, falling back to com_content
  • warningassets - No asset found for com_content.article.2457, falling back to com_content
  • warningassets - No asset found for com_content.article.2457, falling back to com_content
  • warningassets - No asset found for com_content.article.2457, falling back to com_content