兩軸追日系統
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
LiquidCrystal_I2C lcd(0x3F,16,2); // 若LCD 無法啟用,請將0X3F 改為0X27
unsigned long x0,x1,x2,x3;
int a1,a2,b1,b2;
int limit=50;
int t=50;
int n=100;
Servo servox,servoy;
void dispLcd(){
lcd.setCursor(0,0);
lcd.print(x1);
lcd.print(" ");
lcd.setCursor(6,0);
lcd.print("(");
lcd.print(a2);
lcd.print(")");
lcd.print(" ");
lcd.setCursor(12,0);
lcd.print(x2);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(x0);
lcd.print(" ");
lcd.setCursor(6,1);
lcd.print("(");
lcd.print(b2);
lcd.print(")");
lcd.setCursor(12,1);
lcd.print(x3);
lcd.print(" ");
}
void detect(){
for(int i=0 ; i<n ;i++){
x0 += analogRead(A0);
x1 += analogRead(A1);
x2 += analogRead(A2);
x3 += analogRead(A3);
}
x0=x0/n;
x1=x1/n;
x2=x2/n;
x3=x3/n;
dispLcd();
}
void work(){
//////////////////////////////////////////
detect();
while(x0+x1>x2+x3+limit){
if(b2>=90){
a2=a1+1;
if(a2>180){a2=180;}
}else{
a2=a1-1;
if(a2<0){
a2=0;
}}
if(a2==180)break;
if(a2==0)break;
servox.write(a2);
Serial.print("x=");
Serial.println(a2);
a1=a2;
delay(t);
detect();
}
/////////////////////////////////////////
detect();
while(x2+x3>x0+x1+limit){
if(b2>=90){
a2=a1-1;
if(a2<0){
a2=0;
}}else{
a2=a1+1;
if(a2>180){
a2=180;
}}
if(a2==180)break;
if(a2==0)break;
servox.write(a2);
Serial.print("x=");
Serial.println(a2);
a1=a2;
delay(t);
detect();
}
/////////////////////////////////////////////////
detect();
while(x1+x2>x0+x3+limit){
b2=b1+1;
if(b2>180){
b2=180;
}
if(b2==180)break;
if(b2==0)break;
servoy.write(b2);
Serial.print("y=");
Serial.println(b2);
b1=b2;
delay(t);
detect();
}
//////////////////////////////////////////////////
detect();
while(x0+x3>x1+x2+limit){
b2=b1-1;
if(b2<0){
b2=0;
}
if(b2==180)break;
if(b2==0)break;
servoy.write(b2);
Serial.print("y=");
Serial.println(b2);
b1=b2;
delay(t);
detect();
}
}
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.clear();
servox.attach(8);
servoy.attach(11);
servox.write(90);
servoy.write(90);
a1=90;
b1=90;
a2=90;
b2=90;
}
void loop() {
work();
}
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
LiquidCrystal_I2C lcd(0x3F,16,2); // 若LCD 無法啟用,請將0X3F 改為0X27
unsigned long x0,x1,x2,x3;
int a1,a2,b1,b2,a3,a4;
int limit=50;
int t=1;
int n=100;
int mode;
Servo servox,servoy;
void debug(){
Serial.print(x0+x1);
Serial.print(",");
Serial.print(x2+x3);
Serial.print(",");
Serial.println(a2);
}
void dispLcd(){
lcd.setCursor(0,0);
lcd.print(x1);
lcd.print(" ");
lcd.setCursor(6,0);
lcd.print("(");
lcd.print(a2);
lcd.print(")");
lcd.print(" ");
lcd.setCursor(12,0);
lcd.print(x2);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(x0);
lcd.print(" ");
lcd.setCursor(6,1);
lcd.print("(");
lcd.print(b2);
lcd.print(")");
lcd.setCursor(12,1);
lcd.print(x3);
lcd.print(" ");
//debug();
}
void detect(){
for(int i=0 ; i<n ;i++){
x0 += analogRead(A0);
x1 += analogRead(A1);
x2 += analogRead(A2);
x3 += analogRead(A3);
}
x0=x0/n;
x1=x1/n;
x2=x2/n;
x3=x3/n;
dispLcd();
}
void work(){
//////////////////////////////////////////
detect();
while(x0+x1>x2+x3+limit&&mode==0){
if(b2>=90){
a2=a1+1;
if(a2>180){a2=180;}
}else{
a2=a1-1;
if(a2<0){
a2=0;
}}
if(a2==180)break;
if(a2==0)break;
servox.write(a2);
a1=a2;
delay(t);
detect();
}
a3=a2;
/////////////////////////////////////////
detect();
while(x2+x3>x0+x1+limit&&mode==0){
if(b2>=90){
a2=a1-1;
if(a2<0){
a2=0;
}}else{
a2=a1+1;
if(a2>180){
a2=180;
}}
if(a2==180)break;
if(a2==0)break;
servox.write(a2);
a1=a2;
delay(t);
detect();
}
a4=a2;
mode++;
servox.write((a3+a4)/2);
if(x2+x3>x0+x1+limit+100){mode=0;}
if(x0+x1>x2+x3+limit+100){mode=0;}
/////////////////////////////////////////////////
detect();
while(x1+x2>x0+x3+limit){
b2=b1+1;
if(b2>180){
b2=180;
}
if(b2==180)break;
if(b2==0)break;
servoy.write(b2);
b1=b2;
delay(t);
detect();
}
//////////////////////////////////////////////////
detect();
while(x0+x3>x1+x2+limit){
b2=b1-1;
if(b2<0){
b2=0;
}
if(b2==180)break;
if(b2==0)break;
servoy.write(b2);
b1=b2;
delay(t);
detect();
}
}
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.clear();
servox.attach(8);
servoy.attach(11);
servox.write(90);
servoy.write(90);
a1=90;
b1=90;
a2=90;
b2=90;
}
void loop() {
work();
}
#include <Stepper.h>
#include <Servo.h>
#include <Wire.h> //載入I2C介面函式庫
#include <LiquidCrystal_I2C.h> //載入I2C液晶控制函式庫
LiquidCrystal_I2C lcd(0x27,16,2); // 若LCD 無法啟用,請將0X3F 改為0X27
const int stepsPerRevolution = 1024;
Servo servo;
Stepper myStepper(stepsPerRevolution, 4, 6, 7, 5);
/*
pin腳接法
IN1=4
IN2=6
IN3=7
IN4=5
*/
int x,x1,y,y1,degX,degY;
int UL,UR,DL,DR;
int w=5; //容忍值
int mode=1;
void setup() {
lcd.init(); //LCD初始化
lcd.backlight(); //LCD 開啟背光
lcd.clear(); // LCD清除畫面
pinMode(12,INPUT);
pinMode(13,OUTPUT);
servo.attach(8);
myStepper.setSpeed(5);
lcd.setCursor(0,0); //設定LCD游標至第0行,第0列的位置
lcd.print("Stepper_X");
lcd.setCursor(0,1); //設定LCD游標至第0行,第0列的位置
lcd.print("initial...");
do{
myStepper.step(4);
x=digitalRead(12);
}while(x==1);
lcd.setCursor(0,0); //設定LCD游標至第0行,第0列的位置
lcd.print("Servo_Y");
lcd.setCursor(0,1); //設定LCD游標至第0行,第0列的位置
lcd.print("initial...");
servo.write(90);
y=90;
lcd.setCursor(0,0); //設定LCD游標至第0行,第0列的位置
lcd.print("Stepper_X");
lcd.setCursor(0,1); //設定LCD游標至第0行,第0列的位置
lcd.print("setting...");
myStepper.step(-512);
lcd.clear();
}
void LCD_Display(){
lcd.setCursor(0,0); //設定LCD游標至第0行,第0列的位置
lcd.print(UL); //LCD在現在的游標顯示變數a的值
if(UL<100){
lcd.print(" ");
}
lcd.setCursor(13,0); //設定LCD游標至第8行,第0列的位置
lcd.print(UR); //LCD在現在的游標顯示變數c的值
if(UR<100){
lcd.print(" ");
}
lcd.setCursor(0,1); //設定LCD游標至第0行,第1列的位置
lcd.print(DL); //LCD在現在的游標顯示變數b的值
if(DL<100){
lcd.print(" ");
}
lcd.setCursor(13,1); //設定LCD游標至第8行,第1列的位置
lcd.print(DR); //LCD在現在的游標顯示變數d的值
if(DR<100){
lcd.print(" ");
}}
void loop() {
while(mode==1){
DL=analogRead(A1);
DR=analogRead(A3);
UL=analogRead(A0);
UR=analogRead(A2);
if(UL>UR+w && UL>DR+w && UL>DL+w){ //左上最亮
myStepper.step(4);
}
if(DL>UR+w && DL>DR+w && DL>UL+w){ //左下最亮
myStepper.step(4);
}
if(UR>UL+w && UR>DR+w && UR>DL+w){ //右上最亮
myStepper.step(-4);
}
if(DR>UL+w && DR>DL+w && DR>UR+w){ //右下最亮
myStepper.step(-4);
}
LCD_Display();
if(abs(UL-UR)<w && UL>DL && UR>DR){
mode=2;
}
if(abs(DL-DR)<w && DL>UL && DR>UR){
mode=2;
}
}
while(mode==2){
digitalWrite(13,1);
DL=analogRead(A1);
DR=analogRead(A3);
UL=analogRead(A0);
UR=analogRead(A2);
if(UL>UR+w && UL>DR+w && UL>DL+w){ //左上最亮
y=y+1;
if(y>130){y=130; }
servo.write(y);
}
if(UR>UL+w && UR>DR+w && UR>DL+w){ //右上最亮
y=y+1;
if(y>130){y=130; }
servo.write(y);
}
if(DL>UR+w && DL>DR+w && DL>UL+w){ //左下最亮
y=y-1;
if(y<5){y=5; }
servo.write(y);
}
if(DR>UL+w && DR>DL+w && DR>UR+w){ //右下最亮
y=y-1;
if(y<5){y=5; }
servo.write(y);
}
LCD_Display();
if(abs(UL-DL)<w && UL>UR && DL>DR){
mode=1;
}
if(abs(UR-DR)<w && UR>UL && DR>DL){
mode=1;
}
}
digitalWrite(13,0);
}