Problema con VS code + platformIO

este codigo corre en IDE arduino y otros en VS Code sin problema es lo que uso para configurar los rtc3231, sin esta linea

#include <Arduino.h>

que es la que agrega platformIO en vs code, ahora instalo VS Code + PlatformIO y la libreria RTCLIB.h, y este codigo da error al llamar a la funcion print_time();

#include <Arduino.h> // ESTO LO AGREGA PLATFORMIO!!
int ano = 2021; // 0-2099
int mes = 01; // 0-12
int dia = 30; // 0-31
int hora= 11; // 0-23
int min = 52; // 0-59
int seg = 00; // 0-59
// ===========================

#include <Wire.h> // Comunicacion I2C 
#include "RTClib.h" // libreria ADAFRUIT para DS3231 

RTC_DS3231 RTC; // creamos el objeto RTC

String dia_semana[]={"Domingo","Lunes","Martes","Miercoles","Jueves","Viernes","Sabado"};
String newdate = "";


void setup() {

 Serial.begin(9600);
// Wire.begin(); // Inicia Wire sólo si no se hace dentro de la librería 
// supone que se usa Wire para comunicar con otros dispositivos, no sólo con el DS3231

 if (!RTC.begin()) {
 
 Serial.println("No se encuentra RTC");
 while (1);

 }else{

 Serial.println("########################################"); 
 Serial.println("Puesta en hora del modulo RTC DS3231");
 Serial.print("Fecha actual: ");
 print_time(); // imprime hora actual del RTC
 Serial.println("########################################"); 
 Serial.println(""); 
 Serial.println("Pulsa ENTER para actualizar a"); 
 newdate = "Fecha Nueva-> "
 + String(dia) + "/"
 + String(mes) + "/"
 + String(ano) + " Hora-> "
 + String(hora)+ ":"
 + String(min) + ":"
 + String(seg);
 Serial.println(newdate);
 
 Serial.println("======================================"); 
 }
}

void loop () {

 if(Serial.available()) {
 int inputByte = Serial.read(); // lee byte entrante
 
 if (inputByte==13) { // caracter fin de linea
 RTC.adjust(DateTime(ano, mes, dia, hora, min, seg));
 Serial.print("Nueva Fecha actualizada: ");
 print_time(); // imprime hora actual del RTC 
 }
 }
}

void print_time() {
 
 DateTime ahora = RTC.now(); // captura valores del tiempo
 Serial.print(ahora.day(), DEC);
 Serial.print('/');
 Serial.print(ahora.month(), DEC);
 Serial.print('/');
 Serial.print(ahora.year(), DEC);

 Serial.print(" (");
 Serial.print(dia_semana[ahora.dayOfTheWeek()]);
 Serial.print(") ");

 if (ahora.hour() <10) Serial.print (0); 
 Serial.print(ahora.hour(), DEC);
 Serial.print(':');
 if (ahora.minute() <10) Serial.print (0); 
 Serial.print(ahora.minute(), DEC);
 Serial.print(':');
 if (ahora.second() <10) Serial.print (0); 
 Serial.print(ahora.second(), DEC);
 Serial.println();
 
}

este es el error que devuelve

> Executing task in folder librerias: C:\Users\NOAR\.platformio\penv\Scripts\pio.exe run <

Processing uno (platform: atmelavr; board: uno; framework: arduino)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/atmelavr/uno.html
PLATFORM: Atmel AVR (2.2.0) > Arduino Uno
HARDWARE: ATMEGA328P 16MHz, 2KB RAM, 31.50KB Flash
DEBUG: Current (simavr) On-board (simavr)
PACKAGES:
 - framework-arduino-avr 5.0.0
 - toolchain-atmelavr 1.50400.190710 (5.4.0)
LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 17 compatible libraries
Scanning dependencies...
Dependency Graph
|-- <RTClib> 1.2.1
|   |-- <Wire> 1.0
|-- <Wire> 1.0
Building in release mode
Compiling .pio\build\uno\src\main.cpp.o
src\main.cpp: In function 'void setup()':
src\main.cpp:36:13: error: 'print_time' was not declared in this scope
  print_time(); // imprime hora actual del RTC
             ^
src\main.cpp: In function 'void loop()':
src\main.cpp:62:13: error: 'print_time' was not declared in this scope
  print_time(); // imprime hora actual del RTC 
             ^
*** [.pio\build\uno\src\main.cpp.o] Error 1
============================================================================================= [FAILED] Took 1.50 seconds =============================================================================================
El proceso del terminal "C:\Users\NOAR\.platformio\penv\Scripts\pio.exe 'run'" finalizó con el código de salida 1.

Las tareas reutilizarán el terminal, presione cualquier tecla para cerrarlo.

Me auto contesto, C requiere que las funciones se declaren hacia adelante para que el compilador las compile y vincule.
deberia haber puesto asi

#include <Arduino.h> // esto lo agrega platformIO

void print_time(); //esto es lo que falta antes del void setup() y void loop()

ahora si
void setup(){
print_time(); // en mi codigo
...
}

void loop(){

....
}

void print_time(){

.....

]

Con el IDE nos acostumbramos a definir funciones y rutinas luego del loop() pero eso no es lo habitual en los demas compiladores C.
PlatformIO recupera la forma tradicional de un compilador.
Las funciones y rutinas deben ponerse antes del setup loop o de lo contrario, deben definirse sin el procedimiento como lo has hecho.

Te consulto surbyte, entonces creo la funcion antes del void setup(), y no cometo el error de crearla dos veces como muestro en #1 entes del setup y la cree de nuevo despues del loop?

A ver, no la creas dos veces, ese es un error de interpretación de tu parte.
En cualquier C, se deben definir funciones y rutinas sea como si fueran variables antes del setup() y loop() de hecho te dije no existe setup() ni loop() eso es exclusividad y una novedad del Arduino solo para hacer mas fácil las cosas.
Pero en un C dispones de un void main() o sea una rutina principal y luego de definir todo usas un loop con una función tan simple como while(1) {// aqui escribes todo el loop}

PlatformIO quedó como un mix, tolera el formato setup() loop() pero se mantiene como un compilador C. De hecho no es casual que debas comenzar todo con un

#include <Aduino.h>

Asi que resumiendo que debes hacer.
Supongamos que tienes una rutina print_time() pues haces lo que indicaste en #1 o simplemente haces esto

#include <Arduino.h> // esto lo agrega platformIO

void print_time(){
.....
}

void setup(){
// lo que va en el setup

}
void loop(){
// lo que corresponde al loop
}

De echo, es el espíritu inicial de los archivos .h y .cpp, puesto que puedes incluir los .h sin leer los .cpp para declarar funciones y objetos sin declarar sus contenidos, para por ejemplo, evitar referencias circulares.

La máxima siempre es, primero declaras, luego usas, en Arduino no sé por qué lo hacen de esa otra manera.

En C, C++, Python, BAL, ABAL, Fortran, etc, siempre primero declaras, luego usas.

Un ejemplo:

#include <Arduino.h>
#include "includes.h"
#include "setup.h"
#include "loop.h"

void setup() {
    _setup_();
};

void loop() {
    _loop_();
};
  • Primero el Arduino, obvio
  • Ahora la declaración de includes, todos separados, para facilitar la lectura
  • El setup es tan grande que complica la lectura, se separa en una función setup() que tiene su include
  • igual con el loop

¿Beneficio?

se lee rápidamente la entrada y se busca poco a poco lo que se precisa.

Contenido del include.h

/* ----------------------------------------------------------------------------
    Includes de librerías y funciones propias necesarias para la solución
    HelioIris

    Autor:    Tony Diana
    Versión:  20.11
    Licencia: (CC BY-NC-SA 4.0)
   ---------------------------------------------------------------------------
*/

#ifndef MIS_INCLUDES
#define MIS_INCLUDES


// --- Librerías del sistema
#include <Arduino.h>


// --- Librerías de terceros


/*--Macros para el precompilador. Puesto que sólo son macros, se incluirán,
    haya DEBUG asociado o no, puesto que no generarán ningún problema ni
    conflicto de compilado ni aumenta el consumo de memoria.
*/
#include "Debug/Debug_Macros.h"


// --- Librerías propias genéricas
#include "../TD/FTD_Redondear.h"


// --- Librerías genéricas de la solución
#include "DEF.h"                // --- Definiciones globales
#include "DCL.h"                // --- Declaración de constantes y globales


// --- Fotometría
#include "../EV_EXP_LUX/EV.h"   // --- Manejador teórico de f/, T/V e ISO
#include "../EV_EXP_LUX/EXP.h"  // --- Manejador de la exposición
#include "../EV_EXP_LUX/LUX.h"  // --- Manejador de luxes


// --- Hardware
#include "../Display/TD_Touch.h"
#include "../Sensores/Sensores.h"


#endif

Por grande que sea el programa, se va viendo segmento a segmento, separado, en librería especializada, ese es el espíritu de todo menos Arduino, por eso Platormio lo resuelve de esa ortodoxa manera

Yo creo que lo hicieron para hacer mas fáciles las cosas para los novatos en programación.
el setup y el loop fueron por eso
La no necesidad de declarar rutinas y/o funciones debe haber tenido la misma motivación.
Recuerdo cuando usaba DEVIOT y SublimeText que se podia interrupmir el paso previo en el que un archivo .ino se convertia en otro .cpp y ahi se veía la estructura mencionada.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.