Go Down

Topic: Lazo de control de iluminación (LCD-BH1750-MOSFET-PWM) (Read 592 times) previous topic - next topic

Facu59

Buenas, estoy realizando un trabajo en el que necesito setear con un potenciómetro un valor de lux requerido y que el arduino, mediante una salida PWM, actúe sobre una pastilla LED.
A su vez, ambos valores deben aparecer en pantalla (el seteo y la lectura instantánea).
Lo fui desarrollando por pasos, es decir, primero solo el sensor y que salga por pantalla, luego regular la salida con el pote y así.
Todo me funcionaba bien, hasta que incluí la librería PID con las configuraciones pertinentes y no logro que regule nada!!!!!


Para el circuito utilizo:

Arduino UNO
LCD 16x2 I2C
BH1750 (luxómetro) I2C
Pote B10K
MOSFET IRF830
Optoacoplador 4N35



Y aquí va el código

Code: [Select]

#include <PID_v1.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <BH1750.h>

double Seteo, Entrada, Salida;
double Kp=0.5, Ki=5, Kd=0;
PID myPID(&Entrada, &Salida, &Seteo, Kp, Ki, Kd, DIRECT);
int WindowSize = 500;
unsigned long windowStartTime;
  
const int potePin = A0;                                    // selecciono la entrada para el potenciómetro
int Seteo;                                                 // variable que almacena el valor raw (0 a 1023)
const int analogOutPin = 9;                                // selecciono el pin de salida PWM


BH1750 luxometro(0x23);

LiquidCrystal_I2C lcd(0x27,16,2);
 

void setup(){

  
  windowStartTime = millis();                               // Comienzo del conteo al tiempo que lleva corriendo el programa
  myPID.SetOutputLimits(0, WindowSize);                     // Digo al PID que oscile entre 0 y el tamaño de ventana completo
  myPID.SetMode(AUTOMATIC);                                 // Activo el PID
                
  Wire.begin();                                             // Initialize the I2C bus (BH1750 library doesn't do this automatically)
                                                            // On esp8266 you can select SCL and SDA pins using Wire.begin(D4, D3);
  lcd.backlight();                                          // Iniciamos el fondo retroiluminado
  lcd.init();                                               // Iniciamos la pantalla
  lcd.clear();                                              // Limpiamos la pantalla
  luxometro.begin(BH1750::CONTINUOUS_HIGH_RES_MODE);        // Iniciamos el sensor y lo configuramos
  
  
}

void loop() {
  
  uint16_t Entrada = luxometro.readLightLevel();             // Se lee el valor sensado por el luximetro
  int pot = analogRead(potePin);                             // Se lee el valor del potenciómetro
  myPID.Compute();                                           // El PID calcula
  analogWrite( 9, Salida);                                   // Actúa el PWM con la salida calculada
  
  lcd.setCursor(0,0);
  lcd.print("Nivel= ");
  lcd.print(Entrada);
  lcd.println(" lux");
  lcd.setCursor(0,1);
  lcd.print("Seteo= ");
  lcd.print(Seteo);
  lcd.print(" lux");
  delay(500);

}


El esquemático esta adjunto.
Espero que alguno pueda darme una mano.
Saludos!!!

tauro0221

Hi,
Es importante saber como lo tienes alambrado?

surbyte

Es que si usas la librería PID no puedes de ningún modo usar

Code: [Select]
delay(500);

Comienza quitando esa linea y ver si al menos funciona.

Facu59

tauro0221, gracais por responder...aun no tengo dibujado por completo el esquematico, en breve lo subo.


surbyte, gracias por responder....he quitado esa linea ya, pero sigue sin regular el PID. Creo tener un problema con el tipo de datos que toma al leer el potenciometro y el loxometro, lo que hace imposible el calculo para el PID. El problema es que no se como manejar esos datos.

_jose_

Has definido la variable Seteo dos veces ,como double y como int unas lineas mas abajo,aunque no se si puede afectar .

Facu59

Hi,
Es importante saber como lo tienes alambrado?
Adjunte el esquemático para que se vea
Algunos detalles:
                       - El sensor no me figuraba en el programa.
                       - El LED realmente es una pastilla de unos 50W creo, que funciona a 30 V.
                       - El LCD en realidad tiene un módulo I2C al igual que el sensor y con este protocolo lo uso.

surbyte


Facu59

Hecho!, Gracias.

Go Up