السبت، 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));
        }
      }
    }
   }
}




الجمعة، 6 يوليو 2018

كيفية التحكم في مكيف الهواء في المنزل مع Arduino ، حتى عن بعد

حقا اردوينو يسمح لك أن تفعل أشياء كثيرة تتعلق بالإنترنت من الأشياء ، لديها فقط القليل من "الرغبة والحدس لإنشاء أي نوع من المشروع.
في هذه المشاركة سوف نرى كيف للتحكم عن بعد مكيف الهواء الخاص بك في المنزل ، من خلال Arduino ، وهو متصل بالإنترنت.

المتطلبات

  2  Arduino Mega Arduino Uno
جهاز استقبال الأشعة تحت الحمراء TSOP1738
 دايود ضوئي
 330 أوم المقاوم
 بعض الكابلات المرنة

الخطوة 1: كيف يعمل النظام؟

كما يعلم الكثيرون ، فإن آلية تنظيم الإعدادات المختلفة بين المستخدم   تكون عبر جهاز تحكم عن بعد ، والذي يعتمد على إرسال إشارات الأشعة تحت الحمراء. للتحقيق في وظيفة هذه الإشارات
من الواضح أن كود مكيف الهواء ، يختلف باختلاف الموديل ووفقًا للجهة المصنعة. لهذا السبب ، كمرحلة أولى من العمل ، يجب عليك تنفيذ الإجراء الذي يسمى الهندسة العكسية ، وهو الحصول على الرموز الخاصة بجهازك ، باستخدام جهاز الاستشعار TSOP1738
بمجرد الحصول على الرموز الخاصة بمكيف الهواء الخاص بك ، سنكمل "العمل" تقريبًا. تحتاج إلى استخدام برنامج صغير يبسط وضع رمز لإدراج في اردوينو ، ويمكنك إرسال مختلف الترميزات. يمكن للمستخدم ضبط هذه الرموز من خلال صفحة ويب بسيطة ، مع أو بدون حماية.
كما قرأتها في "متطلبات الأجهزة" ، كتبت أنك بحاجة إلى اثنين من Arduino ، والسبب الرئيسي هو أن تسلسل البتات التي يتم إرسالها إلى مكيفات الهواء أكبر من أن يتم احتواؤها في جهاز واحد ، والتي من بين أشياء أخرى يجب أيضًا الاهتمام بجزء أوامر الإدارة التي سيتم إرسالها عبر الإنترنت.
في الممارسة العملية ، سيكون هناك جهاز سيهتم بجزء ويب خادم والآخر لإرسال إشارات الأشعة تحت الحمراء. السبب الآخر الذي دفعني للقيام بهذا المشروع مع جهاز


الخطوة 2: كيفية إعداد البيانات المختلفة


كما ذكر في الصفوف السابقة ، يجب عليك الحصول على ترميزات جهاز التحكم عن بعد الخاص بنا لإعادة إرسالها إلى Arduino. للقيام بذلك ، سنستخدم مكتبة Arduino iRemote ، ولا سيما هذا الكود:

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
//  decode_results *results = (decode_results *)v
void dump(decode_results *results) {
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) {
    Serial.print("Unknown encoding: ");
  }
    else if (results->decode_type == NEC) {
    Serial.print("Decoded NEC: ");
  }
  else if (results->decode_type == SONY) {
    Serial.print("Decoded SONY: ");
  }
  else if (results->decode_type == RC5) {
    Serial.print("Decoded RC5: ");
  }
  else if (results->decode_type == RC6) {
    Serial.print("Decoded RC6: ");
  }
  else if (results->decode_type == SAMSUNG) {
    Serial.print("Decoded SAMSUNG: ");
  }
  else if (results->decode_type == JVC) {
    Serial.print("Decoded JVC: ");
  }
  else if (results->decode_type == PANASONIC) {
    Serial.print("Decoded Panasonic: ");
  }
  Serial.print(results->value, HEX);
  Serial.print("(");
  Serial.print(results->bits, DEC);
  Serial.println(" bits)");
  Serial.print("#define Something_DEC ");
  Serial.println(results->value, DEC);
  Serial.print("#define Something_HEX ");
  Serial.println(results->value, HEX);
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): ");
  for (int i = 0; i < count; i++) {
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    }
    else {
      Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(" ");
  }
  Serial.println("");
}

void loop() {
  if (irrecv.decode(&results)) {
    dump(&results);
    irrecv.resume(); // Receive the next value
  }
}
بعد تحميل الرمز على Arduino ، يجب أن نضغط على الأزرار الموجودة على جهاز التحكم عن بعد وننسخ في مكان ما النتائج التي يظهرها المسلسل.
في حالتي ، حصلت على التسلسل التالي من الترميزات:
Accensione 20 C° Caldo
Raw (150): -5320 3000 -3000 3000 -4400 550 -1600 600 -550 550 -1650 550 -550 550 -550 550 -1650 550 -550 550 -1650 500 -550 550 -1650 550 -550 550 -500 600 -500 600 -550 550 -550 550 -1650 500 -550 550 -600 500 -1700 500 -550 550 -550 550 -550 550 -600 500 -550 550 -550 550 -550 550 -550 550 -1650 550 -1650 550 -1650 500 -1650 550 -1650 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -1650 550 -500 550 -550 550 -1700 500 -1650 550 -550 550 -500 600 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 500 -1700 500 -550 550 -550 550 -550 550 -550 550 -550 550 -600 500 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -500 550 -1700 500 -550 550 -550 550 -550 550 -1650 550

Spegnimento
Raw (150): -3276 3100 -2900 2950 -4400 700 -1500 700 -400 700 -1500 700 -400 650 -450 550 -1650 550 -550 650 -1500 600 -500 600 -1600 600 -500 600 -500 600 -450 650 -450 600 -550 550 -550 550 -550 550 -600 500 -1600 600 -500 600 -500 600 -550 550 -500 600 -500 600 -550 550 -550 550 -1600 600 -500 600 -500 600 -500 550 -1650 550 -1600 600 -500 600 -500 600 -550 550 -550 550 -1600 600 -1600 550 -550 550 -550 550 -1650 550 -1600 600 -550 550 -500 600 -500 600 -550 550 -550 550 -500 600 -500 600 -1600 600 -1600 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -500 600 -550 550 -550 550 -500 600 -500 600 -500 600 -1600 600 -500 600 -1600 550 -550 550 -1600 600 -550 550 -550 550

Accensione 23 C° Freddo 2 FAN
Raw (150): -16044 3050 -3000 3000 -4400 550 -1600 600 -550 550 -1650 550 -550 550 -550 550 -1650 550 -500 600 -1600 550 -550 550 -1650 550 -1650 550 -1650 550 -550 550 -550 550 -500 600 -1600 550 -550 550 -550 550 -1650 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -500 600 -1650 500 -550 550 -600 500 -1700 500 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -1650 550 -550 550 -500 550 -1650 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -550 550 -550 550 -550 550 -550 550 -500 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -1600 600 -550 550

Accensione 20 C° Caldo e Swing
Raw (150): 18566 3000 -3000 3000 -4400 550 -1650 550 -500 600 -1600 600 -500 600 -500 600 -1600 550 -550 550 -1650 550 -500 600 -1600 600 -550 550 -550 550 -550 550 -1600 600 -500 600 -500 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -550 550 -1600 550 -550 550 -600 500 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -1650 550 -550 550 -550 550 -1600 550 -1650 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -1650 550 -550 550 -550 550 -550 550 -550 500 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -1650 550 -1650 500 -1650 550 -550 550 -1700 500

Accensione 23 C° Freddo 2 FAN e Swing
Raw (150): 2084 2950 -3050 2950 -4400 550 -1600 600 -550 550 -1650 550 -550 550 -550 550 -1600 600 -500 600 -1600 550 -500 600 -1650 550 -1650 550 -1600 600 -500 600 -1600 600 -500 600 -500 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -500 600 -550 550 -500 600 -1650 550 -550 550 -1600 600 -500 600 -1600 550 -1600 600 -500 600 -500 600 -550 550 -500 600 -1650 550 -1600 600 -500 600 -500 550 -1650 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -500 600 -500 600 -500 600 -500 600 -500 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -1650 550 -1600 600 -1600 550 -550 600 -500 550 -550 550 -550 550

الخطوة 3: إرسال أمر الأشعة تحت الحمراء إلى A / C



باستخدام التعليمة البرمجية التالية ، ستتمكن من إرسال أمر IR إلى A / C عبر Arduino:


#include "IRremote.h"

IRsend irsend;

void setup()
{
  Serial.begin(9600);
}

int khz=38; //NB Change this default value as neccessary to the correct modulation frequency
// ON and 2O C° with 1 FAN heat
unsigned heat[] = {3000,3000,3000,4400,550,1600,600,550,550,1650,550,550,550,550,550,1650,550,550,550,1650,500,550,550,1650,550,550,550,500,600,500,600,550,550,550,550,1650,500,550,550,600,500,1700,500,550,550,550,550,550,550,600,500,550,550,550,550,550,550,550,550,1650,550,1650,550,1650,500,1650,550,1650,550,550,550,550,550,550,550,550,550,1650,550,1650,550,500,550,550,550,1700,500,1650,550,550,550,500,600,550,550,550,550,550,550,550,550,550,550,1650,500,1700,500,550,550,550,550,550,550,550,550,550,550,600,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,500,550,1700,500,550,550,550,550,550,550,1650,550};
// OFF the A/C
unsigned OFF[] = {3100,2900,2950,4400,700,1500,700,400,700,1500,700,400,650,450,550,1650,550,550,650,1500,600,500,600,1600,600,500,600,500,600,450,650,450,600,550,550,550,550,550,550,600,500,1600,600,500,600,500,600,550,550,500,600,500,600,550,550,550,550,1600,600,500,600,500,600,500,550,1650,550,1600,600,500,600,500,600,550,550,550,550,1600,600,1600,550,550,550,550,550,1650,550,1600,600,550,550,500,600,500,600,550,550,550,550,500,600,500,600,1600,600,1600,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,500,600,550,550,550,550,500,600,500,600,500,600,1600,600,500,600,1600,550,550,550,1600,600,550,550,550,550};
// ON and 23° with 2 FAN cold
unsigned cold[] = {3050,3000,3000,4400,550,1600,600,550,550,1650,550,550,550,550,550,1650,550,500,600,1600,550,550,550,1650,550,1650,550,1650,550,550,550,550,550,500,600,1600,550,550,550,550,550,1650,550,550,550,550,550,550,550,550,550,550,550,550,550,500,600,1650,500,550,550,600,500,1700,500,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,1650,550,550,550,500,550,1650,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,550,550,550,550,550,550,550,550,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,1600,600,550,550};
// ON and 20 C° with 1 FAN heat and SWING
unsigned heat_with_swing[] = {3000,3000,3000,4400,550,1650,550,500,600,1600,600,500,600,500,600,1600,550,550,550,1650,550,500,600,1600,600,550,550,550,550,550,550,1600,600,500,600,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,550,550,1600,550,550,550,600,500,550,550,550,550,550,550,550,550,550,550,1650,550,1650,550,550,550,550,550,1600,550,1650,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,1650,550,550,550,550,550,550,550,550,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,1650,550,1650,500,1650,550,550,550,1700,500};
// ON and 23° with 2 FAN cold and SWING
unsigned cold_with_sqwing[] = {2950,3050,2950,4400,550,1600,600,550,550,1650,550,550,550,550,550,1600,600,500,600,1600,550,500,600,1650,550,1650,550,1600,600,500,600,1600,600,500,600,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,500,600,550,550,500,600,1650,550,550,550,1600,600,500,600,1600,550,1600,600,500,600,500,600,550,550,500,600,1650,550,1600,600,500,600,500,550,1650,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,500,600,500,600,500,600,500,600,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,1650,550,1600,600,1600,550,550,600,500,550,550,550,550,550};

void loop() {

irsend.sendRaw(heat, sizeof(heat)/sizeof(int), khz);
delay(10000);
irsend.sendRaw(OFF, sizeof(OFF)/sizeof(int),khz);
delay(10000);
}

إذا خرجنا لتشغيل مكيف الهواء في المنزل ، فنحن على الطريق الصحيح لإكمال المشروع!
كما ذكر سابقا ، من الضروري استخدام اثنين من اردوينو ، واحد يدير خادم الويب ، والآخر الذي يعالج الاتصالات مع مكيف الهواء.
لتوصيل اثنين من اردوينو بطريقة صحيحة ، ينبغي الحرص على الصورة أدناه.
من الضروري على الجهاز المتصل بـ Ethernet Shield تحميل البرنامج الذي يحمل اسم AC_Webpage_Controller.ino ، بينما يقوم nell'Arduino بإرسال أوامر الأشعة تحت الحمراء ، فيجب تحميل البرنامج الذي يحمل اسم AC_Sender_Code.ino من هنا 


الآن بعد أن أكملنا عملية التحميل ، علينا فقط القيام ببعض الأعمال لتحسين المشروع ، الأكثر فائدة ، هو إتاحته من خلال خادم ويب بعيد. للقيام بذلك ، يجب علينا "فتح الأبواب" لجهاز التوجيه الخاص بنا لتوجيه الطلبات التي تتم خارج شبكتنا المحلية بشكل صحيح.
تجدر الإشارة إلى أنه في نسخة من التعليمات البرمجية على Github ذكرت ، لا يوجد كلمة مرور الأمان المستوى ، لتبسيط بت 'المشروع. ومع ذلك ، مع بعض التعديلات على الشفرة AC_Webpage_Controller.ino ، يمكنك أيضًا تنفيذ هذه الميزة.

الخطوة 4: إعادة توجيه الميناء ، لوضع Arduino و A / C على WEB
تشغيل إعادة توجيه المنفذ ، يختلف من موجه إلى موجه ، ولكن بشكل عام ، يمكنك المتابعة كما يلي:

• تحديد عنوان IP لخادم الويب اردوينو
• تحديد عنوان IP للبوابة
• افتح المتصفح واكتب عنوان IP الخاص بالموجّه وأدخل بيانات الاعتماد
• اﻓﺗﺢ ﻗﺳم إﻋﺎدة ﺗوﺟﯾﮫ اﻟﻣﻧﻔذ وأدﺧل اﻟﺑﯾﺎﻧﺎت ﻣﺛل ﻣﻧﻔذ IP ﮐﻣﺎ ھو Arduino و 80.

الآن يمكننا أيضًا الوصول إلى خارج شبكتنا المحلية ، ببساطة عن طريق فتح صفحة ويب مع عنوان IP العام لاتصال ADSL (لاسترداد هذه القيمة ، اكتب ببساطة على Google.com "my ip").

الآن يمكننا أخيرًا اختبار مشروعنا!

الخطوة 5: تنزيل تطبيق Android!





إذا كنت لا ترغب في استخدام صفحة الويب ، فيمكنك تنزيل التطبيق على Android!


يمكنك القيام بذلك عن طريق كتابة RemoteAC من متجر Play ، أو استخدام هذا الرابط:  هنــــــــــــــــــا
تذكر أنه بمجرد فتح التطبيق تحتاج إلى ضبط IP من اردوينو في تفضيلات!