Secador de Filamento — Arduino Uno simulation

Proyecto de secador de filamento con Arduino Uno, sensores de temperatura, relés y pantalla.

An interactive Arduino Uno circuit simulation you can run free in your browser on Velxio, by axeldissnewcool.

Components

Sketch code

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

// ============================================================
// PINES
// ============================================================

#define DHTPIN 2
#define DHTTYPE DHT11

#define BTN_UP    4
#define BTN_OK    5
#define BTN_DOWN  6
#define BTN_BACK  7

#define RELAY_HEATER 8
#define RELAY_FANS   9

#define NTC_PIN A0

// OLED: I2C HARDWARE
// SDA = A4
// SCL = A5
#define OLED_ADDR 0x3C

// LCD: I2C SOFTWARE
// SDA = A3
// SCL = A2
#define LCD_SDA A3
#define LCD_SCL A2
#define LCD_ADDR 0x27


// ============================================================
// OLED
// ============================================================

#define OLED_WIDTH 128
#define OLED_HEIGHT 64

Adafruit_SSD1306 oled(
  OLED_WIDTH,
  OLED_HEIGHT,
  &Wire,
  -1
);


// ============================================================
// DHT11
// ============================================================

DHT dht(DHTPIN, DHTTYPE);


// ============================================================
// VARIABLES
// ============================================================

float temperatura = 0.0;
float humedad = 0.0;

float temperaturaObjetivo = 40.0;

bool sistemaActivo = false;
bool calentadoresON = false;
bool ventiladoresON = false;

int ntcValor = 0;

bool oledOK = false;


// ============================================================
// TIEMPOS
// ============================================================

unsigned long ultimoDHT = 0;
unsigned long ultimoOLED = 0;
unsigned long ultimoLCD = 0;
unsigned long ultimoControl = 0;

const unsigned long DHT_INTERVAL = 2000;
const unsigned long OLED_INTERVAL = 250;
const unsigned long LCD_INTERVAL = 500;
const unsigned long CONTROL_INTERVAL = 200;


// ============================================================
// BOTONES
// ============================================================

struct Boton {

  byte pin;

  bool lecturaAnterior;
  bool estadoEstable;

  unsigned long ultimoCambio;
};


Boton up = {
  BTN_UP,
  HIGH,
  HIGH,
  0
};

Boton ok = {
  BTN_OK,
  HIGH,
  HIGH,
  0
};

Boton down = {
  BTN_DOWN,
  HIGH,
  HIGH,
  0
};

Boton back = {
  BTN_BACK,
  HIGH,
  HIGH,
  0
};


bool botonNuevo(Boton &b) {

  bool lectura = digitalRead(b.pin);

  unsigned long ahora = millis();

  if (lectura != b.lecturaAnterior) {

    b.ultimoCambio = ahora;

    b.lecturaAnterior = lectura;
  }

  if ((ahora - b.ultimoCambio) >= 35) {

    if (lectura != b.estadoEstable) {

      b.estadoEstable = lectura;

      if (b.estadoEstable == LOW) {

        return true;
      }
    }
  }

  return false;
}


// ============================================================
// LCD SOFTWARE I2C
// ============================================================

void softDelay() {

  delayMicroseconds(4);
}


void softStart() {

  pinMode(LCD_SDA, OUTPUT);
  pinMode(LCD_SCL, OUTPUT);

  digitalWrite(LCD_SDA, HIGH);
  digitalWrite(LCD_SCL, HIGH)