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.
