ผมเขียนโคด ควบคุมความเร็วมอเตอร์(IBT-2)ผมใช้คู่กับโมดูลนาฬิกา DS3231 ควบคุมการทำงานคับ
เริ่มติดปัญหา บรรทัด if(Start==1) จากบรรทัดล่างสุดขึ้นมา 12บรรทัดคับ
#include "Wire.h"
#include "SPI.h" // not used here, but needed to prevent a RTClib compile error
#include "RTClib.h"
#include "Adafruit_GFX.h"
#include "Adafruit_SH1106.h"
#include <LiquidCrystal_I2C.h>
DateTime Time;
RTC_DS3231 RTC;
LiquidCrystal_I2C lcd(0x27,20,4);
int Bfor=0;
int Bfor1=0;
int cnt=0;
int cnt1=0;
int tmleft; //set timeleft 45 minute
int tmset=0;
int swup =-1;
boolean show =0;
int cancel =32;
boolean enterT=0;
boolean enterT1=0;
boolean enterBfor=0;
boolean enterBfor1=0;
int trig=0;
boolean Start=0;
boolean Start1=0;
int hr=0;
int mn=0;
int sc=0;
int dy=0;
int mt=0;
int yr=0;
//กำหนดเวลา//
int NOM1 = 0;
int NOM4 = HIGH;
int NOM6 = LOW;
int NOM7 = HIGH;
unsigned long NOM3 =0;
unsigned long NOM5 =0;
unsigned long NOM8 =0;
unsigned long NOM9 =0;
int buttonState = 0 ;
int buttonState1 = 0 ;
int buttonState2 = 0 ;
int buttonState3 = 0 ;
int buttonState4 = 0 ;
int SENSOR_PIN = A0;
int doo =0;
//===Pindef===
const int LEDsw1=38;
const int LEDsw2=39;
int up=8;
int down=9;
int enter=11;
int enter1=13;
int currentButtonState = LOW; // ค่าสถานะปัจจุบนของปุ่ม
int previousButtonState = LOW; // ค่าสถานะของปุ่มกดครั้งที่แล้ว
bool isLedOn = false;
int currentButtonState1 = LOW; // ค่าสถานะปัจจุบนของปุ่ม
int previousButtonState1 = LOW; // ค่าสถานะของปุ่มกดครั้งที่แล้ว
bool isLedOn1 = false;
int minut =0;
int timing =0;
//===motor==
int Mt1=30;
int Mt11=31;
int Mt2=42;
int Mt22=43;
int Mt1sw=11;
int Mt2sw=13 ;
int Mt1up=34;
int Mt2up=35;
int Mt1down=36;
int Mt2down=37;
void setup () {
Serial.begin(9600);
Wire.begin();
RTC.begin();
RTC.adjust(DateTime(__DATE__, __TIME__));
pinMode(LEDsw1,OUTPUT);
pinMode(LEDsw2,OUTPUT);
pinMode(up,INPUT);
pinMode(down,INPUT);
pinMode(enter,INPUT);
pinMode(enter1,INPUT);
pinMode(Mt1sw,INPUT);
pinMode(Mt2sw,INPUT);
pinMode(Mt1,OUTPUT);
pinMode(Mt11,OUTPUT);
pinMode(Mt2,OUTPUT);
pinMode(Mt22,OUTPUT);
pinMode(Mt1up,INPUT);
pinMode(Mt2up,INPUT);
pinMode(Mt1down,INPUT);
pinMode(Mt2down,INPUT);
Serial.begin(9600);
minut = SENSOR_PIN/3.1 ;
timing = (minut*60)/330;
}
void loop () {
int sensorValue = analogRead(SENSOR_PIN);
if(digitalRead(up)==HIGH)
tmset++;
if(digitalRead(down)==HIGH)
tmset--;
if(digitalRead(Mt1sw)==HIGH)
swup++;
if(digitalRead(cancel)==HIGH)
swup--;
if((swup))
{
swup <1;
}
if((tmset<0)||(tmleft<0))
{
tmset=0;
tmleft=0;
}
enterT=digitalRead(enter);
if((enterT==1)&&
enterBfor==0))
{
trig=sc;
Start=!Start;
}
enterT1=digitalRead(enter1);
if((enterT1==1)&&
enterBfor1==0))
{
trig=sc;
Start1=!Start1;
}
DateTime now = RTC.now();
hr=now.hour();
mn=now.minute();
sc=now.second();
Time = RTC.now();
lcd.begin();
lcd.home();
lcd.setCursor(0,1);
lcd.print("time");
lcd.print('=');
lcd.print(Time.hour());
lcd.print(':');
lcd.print(Time.minute());
lcd.print(':');
lcd.print(Time.second());
lcd.setCursor(0,0);
lcd.print("Tset:");
print2digits(tmset);
lcd.print("|Tleft:");
print2digits(tmleft);
Serial.print("volum");
Serial.print(sensorValue);
Serial.print("motor");
Serial.print(((33000/((sensorValue/3.1)*10))));
if((sc==trig)&&
Bfor==sc-1)&&
Start==1)) // this function for trig counter after 1 minute
{
cnt++;
}
if((tmleft>=0)||(Start==1))
{
tmleft=tmset-cnt;
if(tmleft==0)
{
Start=0;
tmleft=0;
cnt=0;
}
}
Bfor=sc;
enterBfor=enterT;
if((sc==trig)&&
Bfor1==sc-1)&&
Start1==1)) // this function for trig counter after 1 minute
{
cnt1++;
}
if((tmleft>=0)||(Start1==1))
{
tmleft=tmset-cnt1;
if(tmleft==0)
{
Start1=0;
tmleft=0;
cnt1=0;
}
}
Bfor1=sc;
enterBfor1=enterT1;
if(Start==1){
while(1){
int sensorValue = analogRead(SENSOR_PIN);
if (sensorValue < 512)
{
// reverse rotation
int reversePWM = -(sensorValue - 511) / 2;
analogWrite(Mt1, 0);
analogWrite(Mt11, reversePWM);
}
else{
// forward rotation
int forwardPWM = (sensorValue - 512) / 2;
analogWrite(Mt1, forwardPWM);
analogWrite(Mt11, 0);}
}
คราวๆประมานนี้คับ แต่ประสบปัญหา โมดูลเวลามันหยุดคับ มันไม่เดินต่อ พอผมเอา while ออกเวลานับแต่ควบคุมความเร็วมอเตอร์ไม่ได้คับพอบิดน้อยไม่หมุนพอบิดสุดก็เริ่มทำงานเคยลองเอาโคดนาฬิกามาใส่ในwhile ก็เจอปัญหาเดิมๆคับนาฬิกาเดินแต่ควบคุมไม่ได้หรือเป็นเพราะมอเตอร์ผมเลือกรอบน้อยไปคับ ผมใช้มอเตอร์เกียร 12vdc 300RPM
ช่วยแก้ไขโคดหน่อยคับ
เริ่มติดปัญหา บรรทัด if(Start==1) จากบรรทัดล่างสุดขึ้นมา 12บรรทัดคับ
#include "Wire.h"
#include "SPI.h" // not used here, but needed to prevent a RTClib compile error
#include "RTClib.h"
#include "Adafruit_GFX.h"
#include "Adafruit_SH1106.h"
#include <LiquidCrystal_I2C.h>
DateTime Time;
RTC_DS3231 RTC;
LiquidCrystal_I2C lcd(0x27,20,4);
int Bfor=0;
int Bfor1=0;
int cnt=0;
int cnt1=0;
int tmleft; //set timeleft 45 minute
int tmset=0;
int swup =-1;
boolean show =0;
int cancel =32;
boolean enterT=0;
boolean enterT1=0;
boolean enterBfor=0;
boolean enterBfor1=0;
int trig=0;
boolean Start=0;
boolean Start1=0;
int hr=0;
int mn=0;
int sc=0;
int dy=0;
int mt=0;
int yr=0;
//กำหนดเวลา//
int NOM1 = 0;
int NOM4 = HIGH;
int NOM6 = LOW;
int NOM7 = HIGH;
unsigned long NOM3 =0;
unsigned long NOM5 =0;
unsigned long NOM8 =0;
unsigned long NOM9 =0;
int buttonState = 0 ;
int buttonState1 = 0 ;
int buttonState2 = 0 ;
int buttonState3 = 0 ;
int buttonState4 = 0 ;
int SENSOR_PIN = A0;
int doo =0;
//===Pindef===
const int LEDsw1=38;
const int LEDsw2=39;
int up=8;
int down=9;
int enter=11;
int enter1=13;
int currentButtonState = LOW; // ค่าสถานะปัจจุบนของปุ่ม
int previousButtonState = LOW; // ค่าสถานะของปุ่มกดครั้งที่แล้ว
bool isLedOn = false;
int currentButtonState1 = LOW; // ค่าสถานะปัจจุบนของปุ่ม
int previousButtonState1 = LOW; // ค่าสถานะของปุ่มกดครั้งที่แล้ว
bool isLedOn1 = false;
int minut =0;
int timing =0;
//===motor==
int Mt1=30;
int Mt11=31;
int Mt2=42;
int Mt22=43;
int Mt1sw=11;
int Mt2sw=13 ;
int Mt1up=34;
int Mt2up=35;
int Mt1down=36;
int Mt2down=37;
void setup () {
Serial.begin(9600);
Wire.begin();
RTC.begin();
RTC.adjust(DateTime(__DATE__, __TIME__));
pinMode(LEDsw1,OUTPUT);
pinMode(LEDsw2,OUTPUT);
pinMode(up,INPUT);
pinMode(down,INPUT);
pinMode(enter,INPUT);
pinMode(enter1,INPUT);
pinMode(Mt1sw,INPUT);
pinMode(Mt2sw,INPUT);
pinMode(Mt1,OUTPUT);
pinMode(Mt11,OUTPUT);
pinMode(Mt2,OUTPUT);
pinMode(Mt22,OUTPUT);
pinMode(Mt1up,INPUT);
pinMode(Mt2up,INPUT);
pinMode(Mt1down,INPUT);
pinMode(Mt2down,INPUT);
Serial.begin(9600);
minut = SENSOR_PIN/3.1 ;
timing = (minut*60)/330;
}
void loop () {
int sensorValue = analogRead(SENSOR_PIN);
if(digitalRead(up)==HIGH)
tmset++;
if(digitalRead(down)==HIGH)
tmset--;
if(digitalRead(Mt1sw)==HIGH)
swup++;
if(digitalRead(cancel)==HIGH)
swup--;
if((swup))
{
swup <1;
}
if((tmset<0)||(tmleft<0))
{
tmset=0;
tmleft=0;
}
enterT=digitalRead(enter);
if((enterT==1)&&enterBfor==0))
{
trig=sc;
Start=!Start;
}
enterT1=digitalRead(enter1);
if((enterT1==1)&&enterBfor1==0))
{
trig=sc;
Start1=!Start1;
}
DateTime now = RTC.now();
hr=now.hour();
mn=now.minute();
sc=now.second();
Time = RTC.now();
lcd.begin();
lcd.home();
lcd.setCursor(0,1);
lcd.print("time");
lcd.print('=');
lcd.print(Time.hour());
lcd.print(':');
lcd.print(Time.minute());
lcd.print(':');
lcd.print(Time.second());
lcd.setCursor(0,0);
lcd.print("Tset:");
print2digits(tmset);
lcd.print("|Tleft:");
print2digits(tmleft);
Serial.print("volum");
Serial.print(sensorValue);
Serial.print("motor");
Serial.print(((33000/((sensorValue/3.1)*10))));
if((sc==trig)&&Bfor==sc-1)&&Start==1)) // this function for trig counter after 1 minute
{
cnt++;
}
if((tmleft>=0)||(Start==1))
{
tmleft=tmset-cnt;
if(tmleft==0)
{
Start=0;
tmleft=0;
cnt=0;
}
}
Bfor=sc;
enterBfor=enterT;
if((sc==trig)&&Bfor1==sc-1)&&Start1==1)) // this function for trig counter after 1 minute
{
cnt1++;
}
if((tmleft>=0)||(Start1==1))
{
tmleft=tmset-cnt1;
if(tmleft==0)
{
Start1=0;
tmleft=0;
cnt1=0;
}
}
Bfor1=sc;
enterBfor1=enterT1;
if(Start==1){
while(1){
int sensorValue = analogRead(SENSOR_PIN);
if (sensorValue < 512)
{
// reverse rotation
int reversePWM = -(sensorValue - 511) / 2;
analogWrite(Mt1, 0);
analogWrite(Mt11, reversePWM);
}
else{
// forward rotation
int forwardPWM = (sensorValue - 512) / 2;
analogWrite(Mt1, forwardPWM);
analogWrite(Mt11, 0);}
}
คราวๆประมานนี้คับ แต่ประสบปัญหา โมดูลเวลามันหยุดคับ มันไม่เดินต่อ พอผมเอา while ออกเวลานับแต่ควบคุมความเร็วมอเตอร์ไม่ได้คับพอบิดน้อยไม่หมุนพอบิดสุดก็เริ่มทำงานเคยลองเอาโคดนาฬิกามาใส่ในwhile ก็เจอปัญหาเดิมๆคับนาฬิกาเดินแต่ควบคุมไม่ได้หรือเป็นเพราะมอเตอร์ผมเลือกรอบน้อยไปคับ ผมใช้มอเตอร์เกียร 12vdc 300RPM