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
#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!!!