Solucionado Protección calentador solar a maquina de estados

Buenas tardes, la función de este código es proteger a un calentador solar, de exceso de temperatura, y evitar que tire agua o se dañe, al llegar a cierta temperatura (ebullición) los tubos de vidrio, dejan de ser expuestos al sol, y cuando la temperatura se normaliza, los tubos son expuestos a la radiación solar nuevamente. Lo que deseo es que código actual funcione en maquina de estados para darle seguridad y robustez al sistema.
Saludos.


#include "max6675.h"
#include<Wire.h>
const byte thermoDO  = 6;
const byte thermoCS  = 5;
const byte thermoCLK = 4;
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);


int PUL = 9; //Pin para la señal de pulso
int DIR = 10; //define Direction pin
int EN = 11; //define Enable Pin

const byte vccPin     = 3;
const byte gndPin     = 2;
float temp;


void setup() {
  Serial.begin(9600);
  pinMode(vccPin, OUTPUT);
  digitalWrite(vccPin, HIGH);
  pinMode(gndPin, OUTPUT);
  digitalWrite(gndPin, LOW);

  pinMode (PUL, OUTPUT);
  pinMode (DIR, OUTPUT);
  pinMode (EN, OUTPUT);
  digitalWrite(EN, HIGH);

}

void loop() {
  delay(800);
  if (temp = thermocouple.readCelsius());
  Serial.print("C = ");
  Serial.println(thermocouple.readCelsius());

  if ( temp < 30.00) {
    digitalWrite(DIR, LOW);
    for (int i = 0; i < 66.6; i++) //Forward 1600 steps
    {
      digitalWrite(PUL, HIGH);
      delayMicroseconds(650);
      digitalWrite(PUL, LOW);
      delayMicroseconds(650);

    }
    delay(800);
    if (temp = thermocouple.readCelsius());
    Serial.print("C = ");
    Serial.println(thermocouple.readCelsius());
    if ( temp > 27.00); {
      digitalWrite(DIR, HIGH);

      for (int i = 0; i < 66.6; i++) //Backward 1600 steps
      {

        digitalWrite(PUL, HIGH);
        delayMicroseconds(650);
        digitalWrite(PUL, LOW);
        delayMicroseconds(650);
      }
    }
  }
}

Tu código necesita algo de trabajo.

Aquí (líneas #34 y #49) no necesitas un if

Es suficiente con

temp = thermocouple.readCelsius();

Debes evitar el uso de "números mágicos" dentro del código. En términos generales, el 1 y el 0 son las únicas literales numéricas que deben aparecer. Cosas como "30.00", "66.6" (debería ser 62.5?), etc. deben declararse como constantes nombradas para mejor claridad del código y para evitar errores cuando sea necesario modificarlas.

const float maxTemp=30.00; 

Y siempre es mejor evitar el uso de delay().


Ahora, veamos la lógica actual. Debes encontrar una forma de simular la operación del programa sin que sea necesario variar la temperatura real. Con un potenciómetro, por ejemplo, o con una "simple" modificación de temp.

Imagina que la temperatura es de 28ºC.

Como temp es menor que 30, entramos al primer if. El motor se mueve "1600 pasos" y hay un breve tiempo de "espera" de menos de un segundo para tomar la temperatura otra vez. Como la temperatura va a ser mayor que 27ºC (sigue siendo 28ºC después de un par de segundos), inmediatamente regresamos el motor a donde estaba. Y regresamos al principio de loop() e inmediatamente repetimos lo anterior. Pobre motor.


Una máquina de estados puede ayudarles a tí y a tu motor, pero al menos en mi caso, no hay suficiente información acerca de lo que se desea hacer. La temperatura de ebullición (al nivel del mar) es de 100ºC. Pero no conozco el significado de

Tal vez esto sirva para iniciar la discusión:

Aquí la propuesta es tener dos temperaturas de trabajo para crear una histéresis y no matar el motor. Los valores de las temperaturas pueden ser otros, siempre y cuando minTemp < maxTemp

¿Es algo así lo que tienes en mente?

Buenas tardes, mancera si la idea es que nunca alcance a hervir (ebullición) agua, dentro del calentador, cosa que sucede cuando no se gasta agua caliente, la temperatura máxima es de 90° grados celsius y la temperatura normal es de 70° grados lo ideal es un sistema PID (cosa muy complicada) que lo mantenga a 80°grados, la idea de una histérisis entre 80° y 90° grados me parece excelente, el código ahora esta entre 27° y 30 ° para banco de pruebas.
saludos.

La temperatura oscilaría entre dos valores. Los valores pueden modificarse en en el código

Sería un sistema de primer orden, no necesitamos PID. Ni siquiera P. Basta con ON/OFF (Panel Abierto, Panel Cerrado).


Para evitar la ebullición tendremos que confiar en que la temperatura va a dejar de subir cuando se cierre el panel (y se impida el paso de la luz solar).

Puedes probar con este código:

[code]
//https://forum.arduino.cc/t/proteccion-calentador-solar-a-maquina-de-estados/985016

#include "max6675.h"
#include<Wire.h>
const byte thermoDO  = 6;
const byte thermoCS  = 5;
const byte thermoCLK = 4;
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);


int PUL = 9; //Pin para la señal de pulso
int DIR = 10; //define Direction pin
int EN = 11; //define Enable Pin

const byte vccPin     = 3;
const byte gndPin     = 2;
float temp;

// definicion de los estados posibles
enum ESTADOS = {
  CERRADO, // enfriando
  ABIERTO  // calentando
} estado;

// temperaturas de control
// en la práctica la temperatura puede ser menor a minTemp durante la noche 
// o en días lluviosos, etc.
// se espera que la temperatura baje espontáneamente al cerrar el panel
// (sin consumo de agua caliente o algún otro agente externo)

const int minTemp = 27.00; // 70ºC
const int maxTemp = 30.00; // 90ºC

void setup() {
  Serial.begin(9600);
  pinMode(vccPin, OUTPUT);
  digitalWrite(vccPin, HIGH);
  pinMode(gndPin, OUTPUT);
  digitalWrite(gndPin, LOW);

  pinMode (PUL, OUTPUT);
  pinMode (DIR, OUTPUT);
  pinMode (EN, OUTPUT);
  digitalWrite(EN, HIGH);

  // estado inicial
  estado = CERRADO;
}


void loop() {

  temp = thermocouple.readCelsius();

  switch (estado) {
    case CERRADO:
      // ya se enfrió lo suficiente?
      if (temp < minTemp) {
        abrirPanel(); // y dejar que el agua se caliente
        estado = ABIERTO;
      }
      break;
    case ABIERTO {
        // está demasiado caliente?
        if (temp > maxTemp) {
          cerrarPanel(); // y dejar que el agua se enfríe
          estado = CERRADO;
        }
        break;
      }
  }

}

void abrirPanel() {
  for (int i = 0; i < 66.6; i++) //Forward 1600 steps
  {
    digitalWrite(PUL, HIGH);
    delayMicroseconds(650);
    digitalWrite(PUL, LOW);
    delayMicroseconds(650);
  }
}

void cerrarPanel() {

// **************************
// *** ¿debería ser 62.5? ***
// **************************
  for (int i = 0; i < 66.6; i++) //Backward 1600 steps
  {
    digitalWrite(PUL, HIGH);
    delayMicroseconds(650);
    digitalWrite(PUL, LOW);
    delayMicroseconds(650);
  }
}

[/code]

si panel abierto panel cerrado, con sensores de limite máximo, uno en abierto otro en cerrado y si que oscile entre dos temperaturas.

Solo se necesita un sensor de temperatura. El programa controla que la temperatura oscile entre minTemp y maxTemp (70º y 80º por ejemplo) moviendo el panel el cual a su vez controla si el calentador está expuesto a la radiación solar o no. Si no hay suficiente radiación solar la temperatura puede ser menor a minTemp.

si la temperatura puede bajar mucho, si se usa agua en la tarde, toda la noche se mantiene fría, hasta el día siguiente que la radiación solar aumenta la temperatura

Estudia el código que puse y pruébalo, debe estar cerca de lo que buscas

Hola me da error

Arduino:1.8.19 (Windows 10), Tarjeta:"Arduino Uno"





















E:\arduino-1.8.19\arduino-builder -dump-prefs -logger=machine -hardware E:\arduino-1.8.19\hardware -tools E:\arduino-1.8.19\tools-builder -tools E:\arduino-1.8.19\hardware\tools\avr -built-in-libraries E:\arduino-1.8.19\libraries -libraries E:\arduino-1.8.19\portable\sketchbook\libraries -fqbn=arduino:avr:uno -vid-pid=1A86_7523 -ide-version=10819 -build-path C:\Users\philipov\AppData\Local\Temp\arduino_build_346529 -warnings=none -build-cache C:\Users\philipov\AppData\Local\Temp\arduino_cache_919598 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avrdude.path=E:\arduino-1.8.19\hardware\tools\avr -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=E:\arduino-1.8.19\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=E:\arduino-1.8.19\hardware\tools\avr -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=E:\arduino-1.8.19\hardware\tools\avr -prefs=runtime.tools.arduinoOTA.path=E:\arduino-1.8.19\hardware\tools\avr -prefs=runtime.tools.arduinoOTA-1.3.0.path=E:\arduino-1.8.19\hardware\tools\avr -verbose E:\arduino-1.8.19\portable\sketchbook\control_solar_machine_estate\control_solar_machine_estate.ino

E:\arduino-1.8.19\arduino-builder -compile -logger=machine -hardware E:\arduino-1.8.19\hardware -tools E:\arduino-1.8.19\tools-builder -tools E:\arduino-1.8.19\hardware\tools\avr -built-in-libraries E:\arduino-1.8.19\libraries -libraries E:\arduino-1.8.19\portable\sketchbook\libraries -fqbn=arduino:avr:uno -vid-pid=1A86_7523 -ide-version=10819 -build-path C:\Users\philipov\AppData\Local\Temp\arduino_build_346529 -warnings=none -build-cache C:\Users\philipov\AppData\Local\Temp\arduino_cache_919598 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avrdude.path=E:\arduino-1.8.19\hardware\tools\avr -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=E:\arduino-1.8.19\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=E:\arduino-1.8.19\hardware\tools\avr -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=E:\arduino-1.8.19\hardware\tools\avr -prefs=runtime.tools.arduinoOTA.path=E:\arduino-1.8.19\hardware\tools\avr -prefs=runtime.tools.arduinoOTA-1.3.0.path=E:\arduino-1.8.19\hardware\tools\avr -verbose E:\arduino-1.8.19\portable\sketchbook\control_solar_machine_estate\control_solar_machine_estate.ino

Using board 'uno' from platform in folder: E:\arduino-1.8.19\hardware\arduino\avr

Using core 'arduino' from platform in folder: E:\arduino-1.8.19\hardware\arduino\avr

Detecting libraries used...

"E:\\arduino-1.8.19\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10819 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\cores\\arduino" "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\variants\\standard" "C:\\Users\\philipov\\AppData\\Local\\Temp\\arduino_build_346529\\sketch\\control_solar_machine_estate.ino.cpp" -o nul

Alternatives for max6675.h: [MAX6675-library-master@1.1.0]

ResolveLibrary(max6675.h)

  -> candidates: [MAX6675-library-master@1.1.0]

"E:\\arduino-1.8.19\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10819 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\cores\\arduino" "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\variants\\standard" "-IE:\\arduino-1.8.19\\portable\\sketchbook\\libraries\\MAX6675-library-master" "C:\\Users\\philipov\\AppData\\Local\\Temp\\arduino_build_346529\\sketch\\control_solar_machine_estate.ino.cpp" -o nul

Alternatives for Wire.h: [Wire@1.0]

ResolveLibrary(Wire.h)

  -> candidates: [Wire@1.0]

"E:\\arduino-1.8.19\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10819 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\cores\\arduino" "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\variants\\standard" "-IE:\\arduino-1.8.19\\portable\\sketchbook\\libraries\\MAX6675-library-master" "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\libraries\\Wire\\src" "C:\\Users\\philipov\\AppData\\Local\\Temp\\arduino_build_346529\\sketch\\control_solar_machine_estate.ino.cpp" -o nul

"E:\\arduino-1.8.19\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10819 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\cores\\arduino" "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\variants\\standard" "-IE:\\arduino-1.8.19\\portable\\sketchbook\\libraries\\MAX6675-library-master" "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\libraries\\Wire\\src" "E:\\arduino-1.8.19\\portable\\sketchbook\\libraries\\MAX6675-library-master\\max6675.cpp" -o nul

"E:\\arduino-1.8.19\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10819 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\cores\\arduino" "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\variants\\standard" "-IE:\\arduino-1.8.19\\portable\\sketchbook\\libraries\\MAX6675-library-master" "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\libraries\\Wire\\src" "E:\\arduino-1.8.19\\hardware\\arduino\\avr\\libraries\\Wire\\src\\Wire.cpp" -o nul

"E:\\arduino-1.8.19\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10819 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\cores\\arduino" "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\variants\\standard" "-IE:\\arduino-1.8.19\\portable\\sketchbook\\libraries\\MAX6675-library-master" "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\libraries\\Wire\\src" "E:\\arduino-1.8.19\\hardware\\arduino\\avr\\libraries\\Wire\\src\\utility\\twi.c" -o nul

Generating function prototypes...

"E:\\arduino-1.8.19\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10819 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\cores\\arduino" "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\variants\\standard" "-IE:\\arduino-1.8.19\\portable\\sketchbook\\libraries\\MAX6675-library-master" "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\libraries\\Wire\\src" "C:\\Users\\philipov\\AppData\\Local\\Temp\\arduino_build_346529\\sketch\\control_solar_machine_estate.ino.cpp" -o "C:\\Users\\philipov\\AppData\\Local\\Temp\\arduino_build_346529\\preproc\\ctags_target_for_gcc_minus_e.cpp"

"E:\\arduino-1.8.19\\tools-builder\\ctags\\5.8-arduino11/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "C:\\Users\\philipov\\AppData\\Local\\Temp\\arduino_build_346529\\preproc\\ctags_target_for_gcc_minus_e.cpp"

Compilando programa...

"E:\\arduino-1.8.19\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10819 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\cores\\arduino" "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\variants\\standard" "-IE:\\arduino-1.8.19\\portable\\sketchbook\\libraries\\MAX6675-library-master" "-IE:\\arduino-1.8.19\\hardware\\arduino\\avr\\libraries\\Wire\\src" "C:\\Users\\philipov\\AppData\\Local\\Temp\\arduino_build_346529\\sketch\\control_solar_machine_estate.ino.cpp" -o "C:\\Users\\philipov\\AppData\\Local\\Temp\\arduino_build_346529\\sketch\\control_solar_machine_estate.ino.cpp.o"

control_solar_machine_estate:21:6: error: use of enum 'ESTADOS' without previous declaration

 enum ESTADOS = {

      ^~~~~~~

control_solar_machine_estate:21:14: error: expected unqualified-id before '=' token

 enum ESTADOS = {

              ^

control_solar_machine_estate:24:3: error: 'estado' does not name a type

 } estado;

   ^~~~~~

E:\arduino-1.8.19\portable\sketchbook\control_solar_machine_estate\control_solar_machine_estate.ino: In function 'void setup()':

control_solar_machine_estate:48:3: error: 'estado' was not declared in this scope

   estado = CERRADO;

   ^~~~~~

control_solar_machine_estate:48:12: error: 'CERRADO' was not declared in this scope

   estado = CERRADO;

            ^~~~~~~

E:\arduino-1.8.19\portable\sketchbook\control_solar_machine_estate\control_solar_machine_estate.ino: In function 'void loop()':

control_solar_machine_estate:56:11: error: 'estado' was not declared in this scope

   switch (estado) {

           ^~~~~~

control_solar_machine_estate:57:10: error: 'CERRADO' was not declared in this scope

     case CERRADO:

          ^~~~~~~

control_solar_machine_estate:61:18: error: 'ABIERTO' was not declared in this scope

         estado = ABIERTO;

                  ^~~~~~~

control_solar_machine_estate:64:10: error: 'ABIERTO' was not declared in this scope

     case ABIERTO {

          ^~~~~~~

control_solar_machine_estate:64:18: error: expected ':' before '{' token

     case ABIERTO {

                  ^

Usando librería MAX6675-library-master con versión 1.1.0 en la carpeta: E:\arduino-1.8.19\portable\sketchbook\libraries\MAX6675-library-master 

Usando librería Wire con versión 1.0 en la carpeta: E:\arduino-1.8.19\hardware\arduino\avr\libraries\Wire 

exit status 1

use of enum 'ESTADOS' without previous declaration

 or paste code here

pensé que seria la falta de una coma en el renglón 23 se la puse pero siguió dando error

cambia esto a

enum  {
  CERRADO, // enfriando
  ABIERTO  // calentando
} estado;

y esto por
case ABIERTO: {

Hola, ya copilo lo cargo, hago pruebas y le comunico como funciona.
Saludos.

Hola mancera1979, disculpe la tardanza, ya estoy haciendo pruebas y no funciona como debería, regrese al codigo original y tampoco, en ambos casos gira el motor en sentido horario no importa la temperatura en el código, en el que usted creo se congela la información en el monitor Serial (temperatura), intente agregar un intervalo 2500 mili segundos, entre lecturas pero no me funciono, lee cada mili segundo eso puede hacer que se congele la lectura, la falla es mía el código que subí tiene falla no se en que momento lo dañe, hace unos días algo hice que lo descompuse no recuerdo si le quite un else o unas llaves ({}) cuando baja lo hace bien gira en sentido anti horario pero cuando sube gira 10000 pasos anti horario y otros 10000 pasos horarios.
Saludos.

Este código de @mancera compila.
Tanto abrirl como cerrarPanel hacen lo mismo, debes cambiar dirección.
Pero es algo que tranquilamente podrias haber observado.
Reemplaza abrirPanel y cerrarPanelpor este código

void abrirPanel() {
    digitalWrite(DIR, LOW);
    for (int i = 0; i < 66.6; i++) { //Forward 1600 steps
        digitalWrite(PUL, HIGH);
        delayMicroseconds(650);
        digitalWrite(PUL, LOW);
        delayMicroseconds(650);
  }
}

void cerrarPanel() {

    digitalWrite(DIR, LOW);
    for (int i = 0; i < 66.6; i++) { //Backward 1600 steps
        digitalWrite(PUL, HIGH);
        delayMicroseconds(650);
        digitalWrite(PUL, LOW);
        delayMicroseconds(650);
    }
}

Moderador:
Por favor, lee las Normas del foro y evita hacer doble posteos. SI abres un hilo no lo haces en otro sitio por ninguna razón.
Esta es la primera y ultima advertencia por este tema.


hola,esto es lo que e intentado para dar un intervalo entre lecturas renglón 15 y renglón 20


//https://forum.arduino.cc/t/proteccion-calentador-solar-a-maquina-de-estados/985016

#include "max6675.h"
#include<Wire.h>
const byte thermoDO  = 6;
const byte thermoCS  = 5;
const byte thermoCLK = 4;
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);


int PUL = 9; //Pin para la señal de pulso
int DIR = 10; //define Direction pin
int EN = 11; //define Enable Pin
const unsigned long INTERVALO_ENTRE_LECTURAS = 2500UL;
int ESTADOS;
const byte vccPin     = 3;
const byte gndPin     = 2;
float temp;
unsigned long instanteAnteriorTemperatura = 0;
// definicion de los estados posibles
enum   {
  CERRADO, // enfriando
  ABIERTO  // calentando
} estado;

// temperaturas de control
// en la práctica la temperatura puede ser menor a minTemp durante la noche 
// o en días lluviosos, etc.
// se espera que la temperatura baje espontáneamente al cerrar el panel
// (sin consumo de agua caliente o algún otro agente externo)

const int minTemp = 40.00; // 70ºC
const int maxTemp = 50.00; // 90ºC

void setup() {
  Serial.begin(9600);
  pinMode(vccPin, OUTPUT);
  digitalWrite(vccPin, HIGH);
  pinMode(gndPin, OUTPUT);
  digitalWrite(gndPin, LOW);

  pinMode (PUL, OUTPUT);
  pinMode (DIR, OUTPUT);
  pinMode (EN, OUTPUT);
  digitalWrite(EN, HIGH);

  // estado inicial
  estado = CERRADO;
}


void loop() {
 Serial.print("C = ");
  Serial.println(thermocouple.readCelsius());
  //temp = thermocouple.readCelsius();

  switch (estado) {
    case CERRADO:
      // ya se enfrió lo suficiente?
      if (temp < minTemp) {
        abrirPanel(); // y dejar que el agua se caliente
        estado = ABIERTO;
      }
      break;
    case ABIERTO: {
        // está demasiado caliente?
        if (temp > maxTemp) {
          cerrarPanel(); // y dejar que el agua se enfríe
          estado = CERRADO;
        }
        break;
      }
  }

}

void abrirPanel() {
  Serial.print("C = ");
  Serial.println(thermocouple.readCelsius());
  for (int i = 0; i < 10000.0; i++) //Forward 1600 steps
  {
    digitalWrite(PUL, HIGH);
    delayMicroseconds(300);
    digitalWrite(PUL, LOW);
    delayMicroseconds(300);
  }
}

void cerrarPanel() {

// **************************
// *** ¿debería ser 62.5? ***
// **************************
Serial.print("C = ");
  Serial.println(thermocouple.readCelsius());
  for (int i = 0; i < 10000.0; i++) //Backward 1600 steps
  {
    digitalWrite(PUL, HIGH);
    delayMicroseconds(300);
    digitalWrite(PUL, LOW);
    delayMicroseconds(300);
  }
} or paste code here
for (int i = 0; i < 66.6; i++) { 

¿ 66.6 ? :flushed:

Eso equivale a

for (int i = 0; i < 67; i++) { 

porque la variable i es entera.

Repites el mismo error conceptual en

for (int i = 0; i < 10000.0; i++) { 

comparando un int con un float que va a ser truncado a entero.
Lo correcto es

for (int i = 0; i < 10000; i++) {

En el código de #5 y siguientes, olvidaron definir el estado del pin DIR, por eso no cambia el sentido de giro.

Prueba asi

void abrirPanel() {
  digitalWrite(DIR, LOW);
  for (int i = 0; i < 67; i++) //Forward 1600 steps
  {
    digitalWrite(PUL, HIGH);
    delayMicroseconds(650);
    digitalWrite(PUL, LOW);
    delayMicroseconds(650);
  }
}

void cerrarPanel() {

// **************************
// *** ¿debería ser 62.5? ***
// **************************
  digitalWrite(DIR, HIGH);
  for (int i = 0; i < 67; i++) //Backward 1600 steps
  {
    digitalWrite(PUL, HIGH);
    delayMicroseconds(650);
    digitalWrite(PUL, LOW);
    delayMicroseconds(650);
  }
}

Verifica si DIR tiene los valores correctos o están invertidos.

Saludos

PD: Ahora veo que @Surbyte lo había hecho correctamente, no sé como no vi esas 2 líneas. Voy a tener que cambiar los anteojos... :wink:

hola Surbyte, una disculpa por mi error lo postie en el foro en ingles, sin querer y pense que lo habían eliminado y lo subi al foro en español y se duplico el posteo le prometo que no vuelve a ocurrir
gracias.

Hola ahora no gira en ninguna dirección, ya corregí DIR cerrar panel HIGH en abrir panel LOW