Codigo generado por ia me da error

Hola, soy un auténtico pez con el código Arduino, más allá de cortar y pegar y entender más o menos lo que está pasando, no entiendo más. Como tengo muchas ideas y poco conocimiento, me quise hacer un calentador para intentar soldar los filamentos de la impresora 3d, hice un dispositivo para este fin.foto del proyecto


Editado por moderador para no perder la imagen con el tiempo
el problema es que al generar el codigo con gpt me da un problema, aqui el codigo generado.

#include <Wire.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define OLED_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET, OLED_ADDRESS);

#define MAX6675_CS   10
#define MAX6675_SO   12
#define MAX6675_SCK  13
#define HEATER_PIN     3
#define FAN_PIN        4
#define BUTTON_PIN     5

#define TARGET_TEMP 86.0
#define COOL_DOWN_TEMP 85
#define STABILITY_TIME 90//000 // 90 seconds in milliseconds


enum State {
  IDLE,
  HEATING,
  STABILIZING,
  COOLING
};

State state = IDLE;
unsigned long stabilityStartTime;

void setup() {
  pinMode(HEATER_PIN, OUTPUT);
  pinMode(FAN_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT); // Configurar botón como entrada sin resistencia de pull-up
  
  digitalWrite(HEATER_PIN, HIGH); // Heater off
  digitalWrite(FAN_PIN, HIGH); // Fan off

  display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDRESS);
  display.clearDisplay();
  display.setTextColor(WHITE);
}

void loop() {
  double temp = readThermocouple();

  // Imprimir la temperatura en tamaño 2
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(0, 0);
  //display.print("Temp:");
  display.print(temp);
  display.println(" C");

  // Imprimir el estado de la resistencia y el ventilador en tamaño 1
  display.setTextSize(1);
  display.setCursor(0, 18);
  display.print("Heater: ");
  display.print(digitalRead(HEATER_PIN) == HIGH ? "OFF" : "ON");
  display.print(" Fan: ");
  display.println(digitalRead(FAN_PIN) == HIGH ? "OFF" : "ON");

  // Imprimir el estado actual en la línea 3
  display.setCursor(0, 30);
  switch (state) {
    case IDLE:
      display.print("IDLE");
      break;
    case HEATING:
      display.print("HEATING");
      break;
    case STABILIZING:
      display.print("STABILIZING");
      break;
    case COOLING:
      display.print("COOLING");
      break;
  }

  // Si el botón se presiona y el estado no es IDLE, cambia al estado COOLING
  if (digitalRead(BUTTON_PIN) == HIGH && state != IDLE) {
    state = COOLING;
    digitalWrite(HEATER_PIN, HIGH); // Heater off
    digitalWrite(FAN_PIN, LOW); // Fan on
  }

  switch (state) {
    case IDLE:
     digitalWrite(HEATER_PIN, HIGH); // Heater off
        digitalWrite(FAN_PIN, HIGH); // Fan off
      if (digitalRead(BUTTON_PIN) == HIGH) {
        state = HEATING;
        digitalWrite(HEATER_PIN, LOW); // Heater on
      }
      break;
    case HEATING:
      if (temp >= TARGET_TEMP) {
        state = STABILIZING;
        stabilityStartTime = millis(); // Inicializar stabilityStartTime
      }
      break;
    case STABILIZING:
      if (temp >= TARGET_TEMP) {
        digitalWrite(HEATER_PIN, HIGH); // Heater off
      } else if (temp < TARGET_TEMP) {
        digitalWrite(HEATER_PIN, LOW); // Heater on
      }
      //Imprimir la cuenta regresiva en la línea 4
     display.setCursor(0, 45);
      //int remainingTime = (STABILITY_TIME - (millis() - stabilityStartTime)) / 1000; // ESTA LINEA CAUSA EL ERROR
      display.print("Countdown: ");
      //display.print(remainingTime); // Convertir milisegundos a segundos
      display.println(" s");
      if (millis() - stabilityStartTime >= STABILITY_TIME) {
        state = COOLING;
        digitalWrite(HEATER_PIN, HIGH); // Heater off
        digitalWrite(FAN_PIN, LOW); // Fan on
      }
      break;
   case COOLING:
  if (temp <= COOL_DOWN_TEMP) {
    state = IDLE; // Cambiar al estado IDLE
  }
  break;
  }

  display.display();
}

double readThermocouple() {
  uint16_t v;
  pinMode(MAX6675_CS, OUTPUT);
  pinMode(MAX6675_SO, INPUT);
  pinMode(MAX6675_SCK, OUTPUT);

  digitalWrite(MAX6675_CS, LOW);
  delay(1);

  v = shiftIn(MAX6675_SO, MAX6675_SCK, MSBFIRST);
  v <<= 8;
  v |= shiftIn(MAX6675_SO, MAX6675_SCK, MSBFIRST);

  digitalWrite(MAX6675_CS, HIGH);
  if (v & 0x4) {
    return NAN;
  }

  v >>= 3;

  return v * 0.25;
}

el problema es que al acabar cooling no vuelve al estado idle, se queda clavado en cooling, he analizado el código y al comentar la línea int remainingTime = (STABILITY_TIME - (millis() - stabilityStartTime)) / 1000; el problema desaparece, el caso, ya por cabezón, es que no sé por qué esto me da error, ya que solo se trata de una cuenta atrás. Ningún gpt me ha averiguado porque pasa esto.
Disculpen de mi pregunta absurda y el problema tan pequeño, pero estoy haciendo otro proyecto mucho más grande al que le estoy dedicando muchísimas horas y me da miedo a después de invertir más de 100 horas en electronica y diseño 3d no sea capaz de generar el código con IA, como digo, se muy poco de programación.
Gracias.

Como la mayoría, recurre a las IA y luego viene aquí a que una IH haga funcionar lo que la IA hizo mal.
Las IA todavía no están listas para generar códigos confiables, traen más problemas que soluciones y tu problema es prueba de ello.
Lo que me sorprende es que valores tu trabajo (100 hs según cuentas invertidos en otro proyecto) pero no el de los desarrolladores de código.
Al menos ahora sabes que las IA te van a hacer perder tiempo. :wink:

Saludos

1 Like

En absoluto he dejado en algún momento de no valorar el trabajo de un desarrollador de código, al contrario, para mi sois profundamente admirables e insustituibles, una ia no creo que en la vida pueda desarrollar un código como pueda hacerlo un desarrollador, simplemente por la imaginación y el conocer el desarrollo del proyecto.
Pero @MaximoEsfuerzo, creo que lo estas sacando de contexto o que no me has entendido o simplemente tienes inquina a la ia y los que la utilizamos.
Entiéndeme que para alguien que no tiene ni idea de desarrollo, tiene un trabajo de 10 horas diarias, 3 hijos con todo ello conlleva, poder invertir 100 horas en un proyecto es una barbaridad, que mencione eso, no es en absoluto un menosprecio a nade, no se como se puede entender así. Simplemente he expresado, que si programando una tontería tengo estos problemas, no quiero saber que me pasara cuando haga algo más serio.
Soy técnico frigorista como oficio, no te llegas a imaginar la gente que me llama porque se la han liado llamando a su cuñado, se a que te refieres, pero al igual que mis clientes piensan que su cuñado puede llegar a igualar mi trabajo, creo que tu sobreentiendes que yo pueda creer eso de una ia y un desarrollador, en absoluto. Solo que al igual que mi cliente no puede costear la reparación, por eso llamó a su cuñado aún sabiendo que no es lo mismo ni de lejos y que probablemente algo acabe roto. Yo acudo a la ia ya que no me queda otra alternativa, te aseguro que ya me gustaría a mi contactar con alguien y que me ayude a hacer un código, o que podamos hacer un proyecto juntos. Obviamente que sí, pocas cosas me harían más feliz que eso. Pero, nadie de forma altruista se va a meter a hacer el proyecto de otro, al igual que yo (con algunas excepciones) no arregló las cosas de manera altruista a mis clientes. Simplemente soy un aficionado que quiere hacer un proyecto en su casa y para hacer código no me queda otra alternativa.
Disculpa la parrafada, tengo muchas más cosas que decir pero no quiero aburrirte, solo que para mí sois seres superiores y muy admirables. Por texto, no puedo expresarlo bien.
Solo que de verdad, entiendo a qué te refieres. Jamás despreciaría vuestro esfuerzo, exactamente es lo contrario.
Gracias.

1 Like

Y estas seguro que se da la situación del condicional? Lo has verificado.
Coloca un serial.print que diga "Termine COOLING".
Y haz lo mismo en los demas estados.

porque mira IDLE que hace

    case IDLE:
     digitalWrite(HEATER_PIN, HIGH); // Heater off
        digitalWrite(FAN_PIN, HIGH); // Fan off
      if (digitalRead(BUTTON_PIN) == HIGH) {
        state = HEATING;
        digitalWrite(HEATER_PIN, LOW); // Heater on
      }
      break;

Supongamos que si termina COOLING y pasas a IDLE pero en cuanto llega a IDLE pone HEATER en HIGH, pone el FAN en HIGH o sea lo apaga.
y acá viene.. si el boton BUTTON_PIN esta en HIGH simplemente pasas a HEATING calentar.

Y me das la razón cuando dices que ademas de CALENTAR ya pasa a STABILIZING y se cumple lo que tu dices.
Entonces no hay razon para que se queden en IDLE.. debes reveer ese estado o chequea el boton que lanza al siguiente paso.
Si es un Switch estas mas que comprometido... porque siempre lo hará.

Hola
Disculpame, pero no estoy en casa para poder hacer las pruebas. Gracais por tu respuesta.
Testando el código, imagene que tenía que ser algo con la cuenta regresiva, y comenté dos líneas.

int remainingTime = (STABILITY_TIME - (millis() - stabilityStartTime)) / 1000; // ESTA LINEA CAUSA EL ERROR
      display.print("Countdown: ");

   display.print(remainingTime); // Convertir milisegundos a segundos

Gracias :blush::blush:

Editado x Moderador
Aunque sea 1 sola línea de código siempre usar etiquetas.
Si comento esto, el dispositivo funciona correctamente y vuelde a idle,asinqueda todo apagadony si pulso el boton inicia el ciclo de nuevo.

Respondiendo en video :slight_smile:
Video en youtube

Esto esta mal.

int remainingTime = (STABILITY_TIME - (millis() - stabilityStartTime)) / 1000;  

STABILITY_TIME es 90 segundos

(millis() - stabilityStartTime) son milisegundos
Le restas a 90 los segundos diferencia *1000 o sea.. supongamos
(90 - 89000) / 1000
eso estas haciendo.

Debiera ser asi

int remainingTime = STABILITY_TIME - ((millis() - stabilityStartTime) / 1000);  

Gracias por tu respuesta :blush:, el código anterior calculaba bien el tiempo en segundos, 9 segundos, ahora con la modificación me aparece 9000, aun así, no me pasa al estado idle.
No tengo ni idea de por qué sucede esto, pero, he estado leyendo por Google y por lo que intuyo, (sin tener ni idea) es porque la el proceso queda abierto y saturando la memoria, he observado que al finalizar y cambiar el estado el número por unos milisegundos aparece en negativo hasta cambiar de pantalla. Estoy convencido de que lo que digo es absurdo, pero. ¿Es posible?

Muchas gracias por su atención, te estoy muy agradecido. :smiling_face: :smiling_face: :smiling_face:

respuesta en video.

gracias

Tu código tiene varios errores que intento determinar.
El primer error es que en varios lugares imprimes información en la pantalla. Ahora tal como la presentas luce bien pero en realidad se esconden estados en los que las cosas cambian pero no las ves.
Eso te lo indicaré mas tarde
El principal error es este

#define TARGET_TEMP 86.0
#define COOL_DOWN_TEMP 85
#define STABILITY_TIME 90/

y debe ser

#define TARGET_TEMP           86.0
#define COOL_DOWN_TEMP 85.0
#define STABILITY_TIME 90000

Aca tienes el código algo mejor.. y digo algo porque hay otras cosas que corregir

#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <LibPrintf.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define OLED_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET, OLED_ADDRESS);

#define MAX6675_CS   10
#define MAX6675_SO   12
#define MAX6675_SCK  13
#define HEATER_PIN     3
#define FAN_PIN        4
#define BUTTON_PIN     5

#define TARGET_TEMP    86.0
#define COOL_DOWN_TEMP 85.0
#define STABILITY_TIME 10000
char *sStates[] = {"IDLE", "HEATING", "STABILIZING", "COOLING"};

enum State {
  IDLE,
  HEATING,
  STABILIZING,
  COOLING
};

State state = IDLE;
State stateAnt = state; 
unsigned long stabilityStartTime;
int remainingTime, remainingTimeAnt;
int estadoBoton, estadoBotonAnt;

void setup() {
  pinMode(HEATER_PIN, OUTPUT);
  pinMode(FAN_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT); // Configurar botón como entrada sin resistencia de pull-up

  digitalWrite(HEATER_PIN, HIGH); // Heater off
  digitalWrite(FAN_PIN, HIGH); // Fan off

  display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDRESS);
  display.clearDisplay();
  display.setTextColor(WHITE);
  Serial.begin(9600);
}

void loop() {
  char buffer[35];

  double temp = (float) map(analogRead(A0), 0, 1023, 700, 950) / 10;
  estadoBoton = digitalRead(BUTTON_PIN);
  // Imprimir la temperatura en tamaño 2
  display.clearDisplay();
  //display.fillScreen(0);
  display.setTextSize(2);
  display.setCursor(15, 0);

  sprintf(buffer, "%2.1f%cC", temp, (char)247);
  display.print(buffer);
  // display.print(temp);
  // display.print((char)247); // degree symbol
  // display.println("C");

  // Imprimir el estado de la resistencia y el ventilador en tamaño 1
  display.setTextSize(1);
  display.setCursor(0, 20);
  sprintf(buffer, "Heater %3s Fan: %3s", digitalRead(HEATER_PIN) == HIGH ? "OFF" : " ON", digitalRead(FAN_PIN) == HIGH ? "OFF" : " ON");
  display.print(buffer);

  sprintf(buffer, "%-11s", sStates[state]);
  if (state != stateAnt) {  
    Serial.println(buffer);
  }
  display.setCursor(0, 30);
  display.print(buffer);
  stateAnt = state;
  if (state == STABILIZING) {
    sprintf(buffer, "Countdown %2d s", remainingTime);
    if (remainingTime>= 0) {         
       Serial.println(buffer);
    }
    display.setCursor(0, 40);
    display.print(buffer);  
    remainingTimeAnt = remainingTime;
  }

  switch (state) {
    case IDLE:
      digitalWrite(HEATER_PIN, HIGH); // Heater off
      digitalWrite(FAN_PIN, HIGH); // Fan off
      if (digitalRead(BUTTON_PIN) == HIGH) {
        state = HEATING;
        digitalWrite(HEATER_PIN, LOW); // Heater on
      }
      break;
    case HEATING:
      if (temp >= TARGET_TEMP) {
        state = STABILIZING;
        stabilityStartTime = millis(); // Inicializar stabilityStartTime
      }
      if (estadoBoton && !estadoBotonAnt ) {
        state = COOLING;
        digitalWrite(HEATER_PIN, HIGH); // Heater off
        digitalWrite(FAN_PIN, LOW); // Fan on
      }      
      break;
    case STABILIZING:
      if (temp >= TARGET_TEMP) {
        digitalWrite(HEATER_PIN, HIGH); // Heater off
      } else if (temp < TARGET_TEMP) {
        digitalWrite(HEATER_PIN, LOW); // Heater on
      }
      //Imprimir la cuenta regresiva en la línea 4
      remainingTime = (STABILITY_TIME - (millis() - stabilityStartTime)) / 1000; // ESTA LINEA CAUSA EL ERROR

      if (millis() - stabilityStartTime >= STABILITY_TIME ||  (estadoBoton && !estadoBotonAnt )) {
        state = COOLING;
        digitalWrite(HEATER_PIN, HIGH); // Heater off
        digitalWrite(FAN_PIN, LOW); // Fan on
      }
      break;
    case COOLING:
      if (temp <= COOL_DOWN_TEMP) {
        state = IDLE; // Cambiar al estado IDLE
      }
      break;
  }
  estadoBotonAnt = estadoBoton;
  display.display();
}

double readThermocouple() {
  uint16_t v;
  pinMode(MAX6675_CS, OUTPUT);
  pinMode(MAX6675_SO, INPUT);
  pinMode(MAX6675_SCK, OUTPUT);

  digitalWrite(MAX6675_CS, LOW);
  delay(1);

  v = shiftIn(MAX6675_SO, MAX6675_SCK, MSBFIRST);
  v <<= 8;
  v |= shiftIn(MAX6675_SO, MAX6675_SCK, MSBFIRST);

  digitalWrite(MAX6675_CS, HIGH);
  if (v & 0x4) {
    return NAN;
  }

  v >>= 3;

  return v * 0.25;
}

La cuenta regresiva se prende y apaga por el

display.clearDisplay(); 

del comienzo del loop. Mejora eso.

EDITO: voy mejorando el código.
Varias modificaciones he hecho.
No logro sacar el parpadeo de countdown

EDITO 23: bueno descubrí mi propio error. Al poner algo que solo mostrara cambios justamente cuando no los habia mostraba una linea vacía.
Ahora ya quedó visiblemente bien.

1 Like

Gracias por todo, he visto el código muy modificado, casi no entiendo como funciona :sweat_smile:, los menús funcionan a las mil maravillas, y el Countdown se ve fantástico sin el parpadeo. Me ha encantado la como queda escrita la temperatura (°C), se ve muy perfecto.
Solo tiene un problema, la lectura de la termocupla se queda en bucle en 70, 72 C con sus decimales, por suerte tengo un termómetro externo por seguridad, llego a los 360C y la pantalla mostraba ese bucle de 70,71, es como una especie de bucle, ya que me está pareciendo que los números se repiten constantemente, aunque no siempre es igual, ya que, si cambio de estado o reinicio, los números cambian y hace bucle, pero siempre entre 70, 72C, la lectura tanto de encendido, donde coge el bucle, no ha sido nunca de 70, por ello, creo que está leyendo otra cosa.

Mañana por fuerza mayor tengo que ir a salamanca, por ello, no podre hacer pruebas hasta el miércoles. :pensive:

millones de agradecimientos por el gran esfuerzo. Un gran abrazo :smiling_face: :smiling_face: :smiling_face:

Al compilar tu código inicial, descomentando las dos líneas que hacen que falle tu código, mi compilador me da unos avisos:

En la función ‘void loop()’:
aviso: salto a la etiqueta case [-fpermissive]
  case COOLING:
       ^
nota:   crosses initialization of ‘int remainingTime’
      int remainingTime = (STABILITY_TIME - (millis() - stabilityStartTime)) / 1000; // ESTA LINEA CAUSA EL ERROR
          ^    
aviso: el valor de enumeración ‘COOLING’ no se maneja en un switch [-Wswitch]
     switch (state) {
            ^

Como sólo son avisos, continúa compilando hasta el final. Pero los "avisos" están ahí.

Avisa que el switch no maneja como es debido la opción COOLING, debido a la declaración int remainingTime directamente en el "cuerpo" del switch. Si quieren saber más, busquen en Internet.

La solución es sencilla, no declarar variables "directamente" en el switch, sino antes del switch o en el interior de un bloque dentro del case y así se restringe el ámbito de la variable a ese bloque.

Para la solución con el bloque dentro del case basta con añadir una llave de inicio de bloque antes de declarar la variable y otra de final de bloque después de usarla:

    case STABILIZING:
      if (temp >= TARGET_TEMP) {
        digitalWrite(HEATER_PIN, HIGH); // Heater off
      } else if (temp < TARGET_TEMP) {
        digitalWrite(HEATER_PIN, LOW); // Heater on
      }
      //Imprimir la cuenta regresiva en la línea 4
      display.setCursor(0, 45);
      {  // <--- Inicio del bloque para restringir el ámbito de la variable dentro del switch
        int remainingTime = (STABILITY_TIME - (millis() - stabilityStartTime)) / 1000; // ESTA LINEA CAUSA EL ERROR
        display.print("Countdown: ");
        display.print(remainingTime); // Convertir milisegundos a segundos
      }  // <--- Final del bloque para restringir el ámbito de la variable dentro del switch
      display.println(" s");
      if (millis() - stabilityStartTime >= STABILITY_TIME) {
        state = COOLING;
        digitalWrite(HEATER_PIN, HIGH); // Heater off
        digitalWrite(FAN_PIN, LOW); // Fan on
      }
      break;

Les aconsejo tener activo los mensajes del compilador y fijarse si aparece algún aviso. Puede ser que en algunos casos se encuentren avisos del código de las librerías que usas y que no han hecho ustedes. Con esos no pueden hacer nada. Pero sí que deberían de procurar que no apareciera ningún aviso en el código que hacen ustedes. Por experiencia ya les digo que si aparece un aviso o warning, el programa termina haciendo "cosas raras" tarde o temprano.

No pensaba contestarte , por no secuestrar el hilo, pero como haces una defensa de IA no creo que te moleste.
Partes de una presunción equivocada: la finalidad del foro y la gente que ayuda. El foro no esta para hacer funcionar código, la finalidad es el aprendizaje . Este aprendizaje es en ambos sentidos, el que contesta suele aprender de las repuestas de otros usuarios ( a veces autenticas discusiones).
Cuando alguien postea un código generado por IA ya hace una declaración publica, la intención de que le arreglen el código , con poca intención de profundizar en el problema .
Pones el ejemplo del traductor de google ¿Pero que pasaría si entraras a un foro de traductores con una carta de 10 paginas en ingles, que generaste con el traductor de google, y pidieras que te la corrijan, por que no tienes tiempo de aprender ingles y solo te interesa el resultado? Cuando alguien del foro te mandara a reclamar a Google o que pagaras, no tendría sentido la defensa del traductor de google como herramienta. Lo que estarían criticando es el uso que pretendes del foro. Esa fue la critica que te hizo MaximoEsfuerzo, critica que comparto.
Saludos

Hola.
Tienes toda la razón y comparto lo que dices, he sido hace años moderador de foro (modificación de filmware para el motorola v3x y V3) y he ayudado mucho el foros sobre xbox 360.
Yo, antes de hablar por aquí, he buscado mucha información y he intentado buscar la manera de por que no funciona y como solicionarlo, este mismo proyecto ya tiene muchos meses que lo he hecho y llevo encasquillado con el problema mucho tiempo. Este es como el cuarto código que hago. Siempre aprendo y tomo apuntes, los códigos que genera la ia nunca funconan. Soy yo con ayuda de la ia que va modificando y añadiendo, me apoyo a ella para poder hacerlo.
Por eso mismo siempre soy sincero y digo que es generado por ia, de un tutorial etc, por repeto al foto y a ustedes, siempre digo la verdad en todo, que soy un ignorante y que medios utilizo. Siempre aprendo e intento mejorar.

Gracias por tu reflexión :blush:

No se como explicarlo pero la IA falla cuando le pides que a algo que ya hizo le de una vuelta de tuerca. Ahi mete la pata terriblemente, en lugar de mejorar lo empeora. No digo siempre pero casi siempre.
Tal vez la primer respuesta es la ayuda que buscabas. Estabas como una hoja en blanco y la IA te da un buen arranque. De ahi en adelante.. no le pidas cambios porque no contextualiza aún como debe.

Yo acá hago un paréntesis. Tampoco quiero ayudarla a que aprenda. No me interesa. Hay millones de personas que no lo saben pero somos conejillos de indias y le estamos enseñando y no quiero ser parte.

Una vez que tienes algo, debes estudiar y hacer tu curva de aprendizaje y si quieres preguntarle cuestiones parciales, pero si le envias todo el código hara barbaridades y te vas a perder porque cuando tu lo haces sabes que modificaste pero cuando lo hace otro, te lleva mucho tiempo entender que hizo.

El error que estás experimentando está relacionado con la declaración de variables en el código. El error específico se produce en la línea:

int remainingTime = (STABILITY_TIME - (millis() - stabilityStartTime)) / 1000;

El error que mencionas, "error: 'STABILITY_TIME' was not declared in this scope", indica que el compilador no puede encontrar la definición de la variable STABILITY_TIME.

Esto sugiere que STABILITY_TIME no se ha definido en el alcance (scope) actual. Al revisar tu código, parece que STABILITY_TIME está definido al comienzo del programa:

#define STABILITY_TIME 90000 // 90 seconds in milliseconds

Para solucionar este error, asegúrate de que la línea que utiliza STABILITY_TIME esté dentro de la misma función donde STABILITY_TIME se define, o bien, mueve la definición de STABILITY_TIME a un lugar donde todas las partes del código puedan acceder a él. En este caso, parece que el problema es que la línea que utiliza STABILITY_TIME está dentro de la función loop(), mientras que STABILITY_TIME se define fuera de cualquier función.

Una solución sería mover la definición de STABILITY_TIME al principio de la función loop() antes de utilizarlo, o bien, definir STABILITY_TIME como una variable global para que esté disponible en todo el código.

STABILITY_TIME es una macro no una variable.

Saludos

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