daltospro / Arduino Uno R3 Shield Max485 single qYB4

Loaded

0

0

Files

Schematic

PCB

Log InSign Up

Código Arduino Solicitud

flux

1:53

Aquí te dejo un ejemplo completo de código Arduino que cumple con tus requerimientos. El programa utiliza un botón para cambiar entre 5 modos de operación según la secuencia descrita. En cada modo se controla la velocidad (PWM) de un motor DC, se lee una temperatura (por ejemplo, usando un sensor LM35 en el pin analógico A0) y se activa/desactiva un relevador (por ejemplo, para indicar condiciones especiales en el modo 5). Además, se utiliza un display LCD I2C para mostrar el modo actual, la temperatura y la velocidad (en porcentaje).
A continuación el código y, más abajo, se detalla el esquema de conexiones de cada elemento.

Cpp


#include 
#include 

// Configuración del LCD I2C (dirección: 0x27; 16 columnas, 2 filas)
LiquidCrystal_I2C lcd(0x27, 16, 2);

// Definición de pines
const int buttonPin = 2;    // Botón para cambiar entre modos (se recomienda usar modo INPUT_PULLUP)
const int motorPin  = 9;    // Salida PWM para el motor DC
const int relayPin  = 8;    // Salida digital para el relevador
const int tempPin   = A0;   // Entrada analógica para el sensor de temperatura (ej. LM35)

// Valores PWM correspondientes a cada velocidad (33%, 66% y 100%)
const int PWM_33  = 84;     // Aproximadamente 33% de 255
const int PWM_66  = 168;    // Aproximadamente 66% de 255
const int PWM_100 = 255;    // 100%

// Variables de estado
int mode = 1;               // Modo actual (1 a 5)
bool buttonState = HIGH;
bool lastButtonState = HIGH;
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50;

// Para el modo brisa (modo 4)
unsigned long mode4StartTime = 0;
bool mode4Active = false;   // Para saber si se está ejecutando la rampa

void setup() {
  // Configuración de pines
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(motorPin, OUTPUT);
  pinMode(relayPin, OUTPUT);
  
  // Inicializa el LCD
  lcd.init();
  lcd.backlight();
  
  // Mensaje de inicio
  lcd.setCursor(0, 0);
  lcd.print("Modo: 1");
  lcd.setCursor(0, 1);
  lcd.print("Inicializando");
  
  delay(1500);
  // Inicializamos estado: apagar relevador
  digitalWrite(relayPin, LOW);
}

void loop() {
  // Lectura y control del botón con debounce para cambiar modo
  int reading = digitalRead(buttonPin);
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;
      if (buttonState == LOW) {
        // Cambia de modo al presionar el botón
        mode++;
        if (mode > 5) {
          mode = 1;
        }
        // Reiniciar variables del modo 4
        if (mode == 4) {
          mode4StartTime = millis();
          mode4Active = true;
        } else {
          mode4Active = false;
        }
      }
    }
  }
  lastButtonState = reading;

  // Lectura de la temperatura (supongamos sensor LM35: 10 mV por grado)
  int analogVal = analogRead(tempPin);
  // Voltaje en mV: (analogVal*5000)/1023, temperatura en °C=(voltaje en mV)/10
  float temperature = (analogVal * (5000.0 / 1023.0)) / 10.0;
  
  // Variable para el valor PWM actual
  int pwmValue = 0;
  
  // Variable para porcentaje de velocidad
  int percent = 0;
  
  // Según el modo, calculamos la acción del motor y del relevador.
  switch (mode) {
    case 1:
      // Modo 1: Motor al 33%
      pwmValue = PWM_33;
      digitalWrite(relayPin, LOW);
      break;
  
    case 2:
      // Modo 2: Motor al 66%
      pwmValue = PWM_66;
      digitalWrite(relayPin, LOW);
      break;
  
    case 3:
      // Modo 3: Motor al 100%
      pwmValue = PWM_100;
      digitalWrite(relayPin, LOW);
      break;
  
    case 4:
      // Modo brisa: Rampa de 33% a 100% en 4 segundos
      {
        unsigned long elapsed = millis() - mode4StartTime;
        if (elapsed >= 4000) {
          pwmValue = PWM_100;
          mode4Active = false; // Fin de la rampa, se mantiene en 100%
        } else {
          // Interpolación lineal
          float ratio = elapsed / 4000.0;
          pwmValue = PWM_33 + (int)((PWM_100 - PWM_33) * ratio);
        }
        digitalWrite(relayPin, LOW);
      }
      break;
  
    case 5:
      // Modo 5: Control por temperatura, con relevador.
      // Si la temperatura es menor a 30°C, motor al 33%, y si es mayor o igual, motor al 100%
      if (temperature < 30.0) {
        pwmValue = PWM_33;
        digitalWrite(relayPin, LOW);
      } else {
        pwmValue = PWM_100;
        digitalWrite(relayPin, HIGH); // Activa el relevador
      }
      break;
      
    default:
      pwmValue = 0;
      digitalWrite(relayPin, LOW);
      break;
  }

  // Actualización de salida PWM (motor DC)
  analogWrite(motorPin, pwmValue);
  
  // Calcular el porcentaje de velocidad
  percent = (pwmValue * 100) / 255;
  
  // Actualización del display LCD
  lcd.clear();
  lcd.setCursor(0, 0);
  // Mostrar el modo y su descripción breve
  switch (mode) {
    case 1:
      lcd.print("Modo 1: 33%");
      break;
    case 2:
      lcd.print("Modo 2: 66%");
      break;
    case 3:
      lcd.print("Modo 3: 100%");
      break;
    case 4:
      lcd.print("Modo Brisa");
      break;
    case 5:
      lcd.print("Modo Temp");
      break;
  }
  
  lcd.setCursor(0, 1);
  lcd.print("T:");
  lcd.print(temperature, 1);
  lcd.print("C V:");
  lcd.print(percent);
  lcd.print("%");
  
  delay(200);  // Pequeño retardo para estabilidad del display
}

/*
Conexiones sugeridas:
--------------------------------------------
1. Sensor de temperatura (ej. LM35):
   - Salida del LM35: Conectar a A0.
   - Vcc del LM35: 5V.
   - GND del LM35: GND.

2. Motor DC (vía controlador PWM o MOSFET):
   - Control PWM: Conectar la entrada de control al pin 9.
   - Alimentación del motor: Fuente de 5V o según especificación.
   - Conectar la tierra (GND) en común.

3. Relevador:
   - Bobina del relevador: Conectar a la salida digital del pin 8 (se recomienda utilizar un transistor y diodo flyback según el circuito del relevador).
   - Los contactos del relevador se conectan según la aplicación (por ejemplo, para encender una carga adicional).

4. Botón:
   - Un terminal del botón al pin 2.
   - El otro terminal del botón a GND.
   - Se utiliza el resistor pull-up interno (INPUT_PULLUP) por lo que no requiere resistor adicional.

5. LCD I2C:
   - SDA: Conectar al pin A4 (para Arduino Uno).
   - SCL: Conectar al pin A5 (para Arduino Uno).
   - Vcc y GND según la alimentación (5V y GND).
   
Asegúrate de que todas las conexiones compartan una tierra común.
--------------------------------------------
*/

Explicación del código:
  • Modos 1 a 3: Al presionar el botón se cambia secuencialmente el modo de operación:
    • Modo 1: Motor al 33% (valor PWM ≈ 84).
    • Modo 2: Motor al 66% (valor PWM ≈ 168).
    • Modo 3: Motor al 100% (valor PWM = 255).
  • Modo 4 (Modo Brisa): Inicia una rampa lineal que incrementa el PWM desde 33% hasta 100% durante 4 segundos.
  • Modo 5 (Control por Temperatura): Se lee la temperatura. Si es inferior a 30 °C, el motor se mantiene al 33% y el relevador se apaga; por encima de 30 °C, el motor corre a 100% y se activa el relevador.
  • Display LCD: Se muestran el modo activo, la temperatura medida (con 1 decimal) y el porcentaje de velocidad (calculado a partir del valor PWM).
  • Conexiones: Se incluyen comentarios al final del sketch que describen cómo realizar las conexiones de cada componente.
Este ejemplo es un punto de partida y puedes ajustarlo según las características específicas de tu hardware. ¡Espero que te sea útil!
399 days
daltospro

daltospro

que librerias incluiste en el codigo anterior?
399 days

flux

0:18

El código incluye las siguientes librerías:
  • Wire.h: Para la comunicación I2C.
  • LiquidCrystal_I2C.h: Para controlar el display LCD a través del bus I2C.
Confirmar librerías incluidas
Revisión de librerías adicionales
Verificar completitud del código
399 days

​
Sign up to send

To get started, talk to Flux or create a New Document.

Reviews

Documents

    Documents are markdown text files which describe project goals, capture details, or even simulation outputs.

    Assets

    step

    Arduino UNO.STEP

    Arduino UNO 3D3D Model
    dxf

    Arduino UNO R3 shield - Shape.dxf

    Arduino UNO R3 shield - Shape
    Arduino_UNO_R3_Tumb.svg

    Arduino_UNO_R3_Tumb.svg

    Arduino_UNO_R3_TumbDefault

    Arduino Uno R3 Shield Max485 single qYB4

    Arduino Uno R3 Shield Max485 single qYB4 thumbnail
    Template for Arduino Uno R3 Shield. Include an official pinout so you will always know Arduino names, the alternative roles of pins, which one is SDA, or SCL, etc. On PCB you can find the 3D model of the Arduino Uno R3 itself along with the board outline on the silkscreen. #Arduino #Uno #Shield #Template #project-template #project

    Properties

    Properties describe core aspects of the project.

    Pricing & Availability

    Distributor

    Qty 1

    Controls

    Welcome 👋

    Flux helps you build PCBs faster with an AI teammate!

    Create your account to collaborate, stay updated, fork your own version, and get instant answers from our AI agent.

        Introducing AI Placement!
        AI Placement Demo

        AI-Powered Component Placement

        Let AI place your components intelligently. AI Placement analyzes your schematic and positions components for optimal routing, signal integrity, and board density.

        From Schematic to Layout in Seconds

        Skip the tedious manual placement. AI Placement generates a starting layout you can refine, saving hours of repetitive work on every new design.

        Works With Auto-Layout

        Pair AI Placement with Auto-Layout for a complete AI-driven PCB design flow — from component placement through trace routing, all with one click.

        Try it