i have project lux sensor to move horisontal blind using motor dc and using PID
this my sketch
#include <Wire.h>
#include <BH1750.h>
#include <LiquidCrystal.h>
float error_lux, last1_error, last2_error, P, I, D, Kp = 1.89, Ki = 0, Kd = 0, mv, move, kcptn ;
LiquidCrystal lcd (8, 9, 10, 11, 12, 13);
const int pwm = 3 ; //initializing pin 2 as pwm
const int in_1 = 5;
const int in_2 = 6;
unsigned long time;
unsigned char move1 = 0;
float setpoint = 140; //setpoint lux
BH1750 lightMeter;
void setup() {
Serial.begin(9600);
lightMeter.begin();
lcd.begin(16, 2);
pinMode(pwm, OUTPUT) ;
pinMode(in_1, OUTPUT) ;
pinMode(in_2, OUTPUT) ;
}
void open (void)
{
digitalWrite(in_1, LOW ) ;
digitalWrite(in_2, HIGH) ;
analogWrite(pwm, ????????) ;
}
void close (void)
{
digitalWrite(in_1, HIGH ) ;
digitalWrite(in_2, LOW) ;
analogWrite(pwm, ?????????) ;
}
void stop (void) {
digitalWrite(in_1, LOW) ;
digitalWrite(in_2, LOW) ;
analogWrite(pwm, 0) ;
}
void loop() {
uint16_t lux = lightMeter.readLightLevel();
error_lux = setpoint - lux;
P = Kp * error_lux ;
I = (Ki * (error_lux + last1_error)) / 2;
D = (Kd * (error_lux - 2 * last1_error + last2_error)) ;
mv = P + I + D;
move = move1 + mv;
last2_error = last1_error;
last1_error = error_lux ;
if (move <= 5 && move >= -5 )
{
digitalWrite(in_1, LOW) ;
digitalWrite(in_2, LOW) ;
analogWrite(pwm, 0) ;
}
else if (move > 5)
{
open();
}
if (move < -5)
{
close();
}
time = millis();
delay(000);
Serial.print (time);
Serial.print("\t");
Serial.println(lux);
//Serial.print("\t");
//Serial.println(mv);
}
my motor dc minimum speed is 25
its biderectional when 0 its stop
can someone help me to convert output PID to analog.write my motor dc
thankyouuu