السبت، 7 يوليو 2018

متتبع حركة الشمس عن طريق اردوينو- Dual Axis Solar Tracker Panel with Auto and Manual Mode

لوحة شمسية يمكن أن تدور في محورين إما تلقائيا باستخدام أربعة مستشعرات ضوئية ، إما يدويا بمساعدة اثنين من مقاييس الجهد.

المواد المطلوبه
اردوينو اونو او اردوينو جينون
مقاومة متغيرة عدد 2
دايود ضوئي عدد 2
بوش بتن عدد 1
سيرفو موتور عدد 2
مقاومة ضوئية عدد 4
مقاومة 10 كيلو اوم عدد 5
مقاومة 221 اوم عدد 2

أردنا تنفيذ وضعين في المنتج النهائي.

الوضع اليدوي - التي تسيطر عليها اثنين من الأواني.
وضع تلقائي - يتم التحكم فيه باستخدام أربعة مستشعرات ضوئية.

من أجل تحقيق ذلك ، قمنا ببرمجة الجهاز للتغير بين الأوضاع بمساعدة زر ضغط واثنين من مؤشرات المؤشر. عندما يكون الجهاز في الوضع اليدوي ، يكون الضوء الأحمر في وضع التشغيل ويمكننا التحكم في دوران اللوح في محورين بمساعدة اثنين من مقاييس الجهد. عندما يكون الجهاز في الوضع التلقائي ، يتم تشغيل الضوء الأزرق ويتم تحديد دوران اللوحة بالضوء الذي يتم جمعه من ملفات LDR الأربعة.


كود البرمجة
#include <Servo.h>
//Initialize variables
int mode = 0;             
int buttonState = 0;      
int prevButtonState = 0;  
int topLeftLight = 0;     
int topRightLight = 0;
int bottomLeftLight = 0;
int bottomRightLight = 0;
int LeftLight = 0;
int RightLight = 0;
int TopLight = 0;
int BottomLight = 0;
//Declare two servos
Servo servo_9;
Servo servo_10;

void setup()
{
  pinMode(7, INPUT);    //Mode Button
  pinMode(12, OUTPUT);  //Led indicator for manual mode
  pinMode(11, OUTPUT);  //Led indicator for auto mode
  pinMode(A0, INPUT);   //Potentiometer for right-left movement
  pinMode(A1, INPUT);   //Potentiometer for up-down movement
  pinMode(A2, INPUT);   //Light sensor up - left
  pinMode(A3, INPUT);   //Light sensor up - right
  pinMode(A4, INPUT);   //Light sensor bottom - left
  pinMode(A5, INPUT);   //Light sensor bottom - right
  servo_9.attach(9);    //Servo motor right - left movement
  servo_10.attach(10);  //Servo motor up - down movement
}

void loop()
{
  buttonState = digitalRead(7);
  if (buttonState != prevButtonState) {
    if (buttonState == HIGH) {
      //Change mode and ligh up the correct indicator  
      if (mode == 1) {
        mode = 0;
        digitalWrite(12, HIGH);
        digitalWrite(11, LOW);
      } else {
        mode = 1;
        digitalWrite(11, HIGH);
        digitalWrite(12, LOW);
      }
    }
  }
  prevButtonState = buttonState;
  delay(50); // Wait for 50 millisecond(s)
  if (mode == 0) {
    //If mode is manual map the pot values to degrees of rotation
    servo_9.write(map(analogRead(A0), 0, 1023, 0, 180));
    servo_10.write(map(analogRead(A1), 0, 1023, 0, 180));
  } else {
    //if mode is auto map the sensor values to 0-100 ligh intensity. 
    //Every light sensor has different sensitivity and must be first tested 
    //for it's high and low values
    topLeftLight = map(analogRead(A2),50,980,0,100);
    topRightLight = map(analogRead(A3),200,990,0,100);
    bottomLeftLight = map(analogRead(A4),170,970,0,100);
    bottomRightLight = map(analogRead(A5),250,1000,0,100);
    //Calculate the average light conditions
    TopLight = ((topRightLight + topLeftLight) / 2);
    BottomLight = ((bottomRightLight + bottomLeftLight) / 2);
    LeftLight = ((topLeftLight + bottomLeftLight) / 2);
    RightLight = ((topRightLight + bottomRightLight) / 2);
    //Rotate the servos if needed
    if (abs((RightLight - LeftLight)) > 4) {    //Change position only if light difference is bigger then 4%
      if (RightLight < LeftLight) {
        if (servo_9.read() < 180) {
          servo_9.write((servo_9.read() + 1));
        }
      }
      if (RightLight > LeftLight) {
        if (servo_9.read() > 0) {
          servo_9.write((servo_9.read() - 1));
        }
      }
    }
    if (abs((TopLight - BottomLight)) > 4) {  //Change position only if light difference is bigger then 4%
      if (TopLight < BottomLight) {
        if (servo_10.read() < 180) {
          servo_10.write((servo_10.read() - 1));
        }
      }
      if (TopLight > BottomLight) {
        if (servo_10.read() > 0) {
          servo_10.write((servo_10.read() + 1));
        }
      }
    }
   }
}




ليست هناك تعليقات:

إرسال تعليق