الجمعة، 1 نوفمبر 2019

اردوينو تحكم الستائر العمودي

وحدة التحكم للستائر الرأسية والتي ستغلقها عند الغسق وتفتحها عند الفجر. لديها أيضا التكامل اليكسا وتجاوز دليل


المواد المطلوبة

Espressif Wemos D1 Mini
GWS Sail Winch Servo S125 6 turn
Rotary Encoder with Push-Button



ما هذا؟
هذا تصميم لوحدة التحكم في الستائر الرأسية بتكامل Alexa وتجاوز يدوي في شكل جهاز تشفير دوار. والقصد من ذلك هو إغلاق الستائر تلقائيا في الليل وفتحها خلال النهار.
يتم تشغيل الوحدة من مصدر التيار الكهربائي 5 فولت USB (> = 2A مستحسن)
تم تصميم الآلية الميكانيكية لسحب سلسلة الكرة على مجموعة من الستائر الرأسية (ملاحظة: لا "ترسم" الستائر من جانب إلى جانب - إنها تتحكم فقط في الوضع الرأسي).

تم اختيار المؤازرة الرقمية ذات الونش 6 أدوار (GWS S125 6TD) للمحرك الرئيسي لتشغيل السلسلة. تم اختيار هذا بناءً على مقدار الحركة المطلوبة لتدوير الستائر بالكامل (من 0 إلى 180 درجة) لأن المؤازرة المعيارية لن يكون لها ما يكفي من الدوران لعملية تعمية كاملة دون أي شكل من أشكال التروس.

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

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


كانت الطباعة أحادية القطعة جيدة ولكن يمكن تحسينها عن طريق تقسيم القرص إلى جزأين (لتجنب المتراكبات) وطباعتها بشكل منفصل. يمكن بعد ذلك لصق نصفيهما معًا بعد ذلك.

Drive Pulley (3D print design)



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

تم تثبيت العلبة على إطار النافذة باستخدام Velcro للسماح بوضع وإزالة سهلة.

تمت إضافة أداة تشفير دوارة لتوفير التحكم اليدوي في الستائر (بناءً على طلب زوجتي!).

أيضا ، تم تضمين LDR (المقاوم تعتمد على الضوء) أيضا لاستشعار مستوى الضوء. يمكن استخدام هذا لإغلاق الستائر تلقائيًا عندما يتجاوز ضوء الشمس مستوى معين.

ملاحظة: إذا قمت بتطبيق LDR ، فتأكد من وضعه على الجانب المناسب من العلبة (أي لمواجهة النافذة). سيعتمد هذا على أي جانب (يسار أو يمين) من النافذة التي تعمل فيها السلسلة العمياء! أيضا قد تحتاج إلى تغيير رمز لعكس اتجاه المؤازرة. ينطبق التحذير نفسه على تركيب المشفر.

يستخدم المشروع Arduino WEMOS D1 Mini كوحدة التحكم الرئيسية. يوفر هذا واجهة WiFi وهو صغير بما يكفي ليناسب العلبة ولكنه يوفر دبابيس I / O كافية.

Components fitted inside enclosure


Hooking the chain before attaching the enclosure base

Controller in position on the window frame


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

الرمز

يتصل الكود بشبكة WiFi ثم يقوم بتعيين الوقت الحالي لليوم والتاريخ من الإنترنت عبر مكالمة NTP (بروتوكول وقت الشبكة). هذا ضروري من أجل حساب أوقات الفجر / الغسق وفتح / إغلاق الستائر في الأوقات المطلوبة. قد تكون هناك حاجة للتغييرات بناءً على وضعك على الأرض وأي وفورات في ضوء النهار.

يدعم الرمز برمجة OTA بحيث لا يلزم إزالة الوحدة في كل مرة لتنزيل أي تحديثات رمز.
يدعم الإصدار الأولي من التعليمات البرمجية نشر / استجابة MQTT بحيث يمكن التحكم في الستائر عن طريق مساعد المنزل (يمكن ضبط شريط تمرير على الشاشة الرئيسية لضبط الزاوية العمياء). قدم LDR أيضًا قراءات إلى MQTT حتى تتمكن الأجهزة الأخرى من اتخاذ قرارات بناءً على القراءات. ومع ذلك ، فقد قمت بإزالة جميع واجهة MQTT بعد فشل خادم Raspberry Pi MQTT (بطاقة ذاكرة الفلاش) التي تسببت في تعطل الرمز لأنه يتعذر عليه الاتصال. يمكن إعادة تقديم هذا إذا لزم الأمر عن طريق تحسين التحكم حول إجراءات الاتصال. لم أفعل هذا لأنني وجدت أنه ليس من الضروري حقًا إذا كانت الوحدة مستقلة.
تميل المؤازرة إلى الحكم قليلاً عند محاولة الحفاظ على موقعها. قد يكون هذا مزعجًا بعض الشيء ، لذا يتم فصل محرك PWM (في الرمز) بعد أن يكون لدى الماكينة ما يكفي من الوقت للوصول إلى موقعها لمنع هذه الحركة البسيطة الطفيفة.

تم تكامل Alexa باستخدام مكتبة fauxmoESP الممتازة الخاصة بـ Xose Perez وكذلك فتح / إغلاق الستائر تلقائيًا في الوقت الصحيح من اليوم ، ويمكن فتحها / إغلاقها عبر أوامر صوت Alexa.

تم تضمين أداة التشفير الدوارة للسماح بالتحكم اليدوي في الستائر لأي زاوية مطلوبة. ستعود وحدة التحكم إلى الوضع التلقائي عند التغيير المبرمج التالي. سيؤدي الضغط على زر المشفر إلى إعادة وحدة التحكم في الوحدة إلى الوضع التلقائي على الفور وستنتقل الستائر إلى الموضع التلقائي الحالي. يتم التعامل مع تغييرات التشفير الروتاري عن طريق مقاطعة الدبوس عبر مكتبة ESPRotary 
تم تضمين أداة التشفير الدوارة للسماح بالتحكم اليدوي في الستائر لأي زاوية مطلوبة. ستعود وحدة التحكم إلى الوضع التلقائي عند التغيير المبرمج التالي. سيؤدي الضغط على زر المشفر إلى إعادة وحدة التحكم في الوحدة إلى الوضع التلقائي على الفور وستنتقل الستائر إلى الموضع التلقائي الحالي. يتم التعامل مع تغييرات التشفير الروتاري عن طريق مقاطعة الدبوس عبر مكتبة ESPRotary 

تم معالجة أوقات الغروب / شروق الشمس وما إلى ذلك بناءً على مكتبة TimeLord.

يشتمل الرمز أيضًا على خادم ويب حتى يمكن طلب الحالة الحالية لوحدة التحكم من مستعرض ويب. تتكون الحالة من إعداد التاريخ / الوقت الحالي ، وقوة إشارة WiFi ، سواء كانت BST نشطة أم لا ، وغروب الشمس المتوقع ، وشروق الشمس ، والفجر ، وأوقات الغسق ، وقراءة LDR ، والموضع الأعمى الحالي (بالدرجات) وموضع أداة التشفير الحالية (درجات)

أجزاء ومرفقات مخصصة





الأربعاء، 18 سبتمبر 2019

التحكم بسيرفو موتور بواسطة ريموت كونترول مع الاردوينو -Servo Motor Control with Remote

المواد المطلوبة

اردوينو اونو او جينون
سرفو موتور
مستقبلة ir

حول هذا المشروع

من خلال مشروع Arduino البسيط هذا ، يمكنك التحكم في الماكينة باستخدام جهاز التحكم عن بُعد. كل ما تحتاجه هو لوحة Arduino Uno (أو ما شابه) ، ومحرك سرفو  وجهاز تحكم عن بعد في التلفزيون وجهاز استقبال IR (TS0P1738) وقطعة صغيرة من الورق المقوى.

هيا بنا نبدأ!

أول ما نحتاج إلى القيام به مع اردوينو هو تنزيل مكتبة الأشعة تحت الحمراء.

قم بتنزيل مكتبة IR من الرابط أدناه وتثبيتها:
هنــــــــــــــــــــــــــا

إذا كنت لا تعرف كيفية تثبيت مكتبة ، اتبع الرابط أدناه:
التعليمات

تحتاج أولاً إلى توصيل الأجزاء وفقًا لمخطط الدائرة المعطى:



يمكنك الخروج من TSOP1738 أدناه:



استخدم الكود التالي لفك تشفير IR remote:

/*The IR sensor's pins are attached to Arduino as so:Pin 1 to Vout (pin 11 on Arduino)Pin 2 to GNDPin 3 to Vcc (+5v from Arduino)*/#include <IRremote.h>int IRpin = 11;IRrecv irrecv(IRpin);decode_results results;void setup(){Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver}void loop() { if (irrecv.decode(&results))    {     Serial.println(results.value, DEC); // Print the Serial 'results.value'     irrecv.resume();   // Receive the next value   }}



افتح Arduino IDE ورفع الكود

فتح سيريال مونيتر على برنامج الاردوينو
في جهاز التحكم عن بعد في المستشعر واضغط على كل الازرار
تستطيع أن ترى أرقام مختلفة لكل زر
النظر في أي اثنين من الأزرار ، وتدوين القيم فك الشفرة. في حالتي لقد اخترت زر الطاقة وزر الوضع.

حصلت على القيم التالية:

زر الطاقة = 33441975
زر الوضع = 33446055
سنستخدم هاتين القيمتين للتحكم في دوران محرك سيرفو. ستحتاج إلى إضافة هذه القيمتين في البرنامج الذي يتم تقديمه في الخطوة التالية:

الدائرة النهائية!


كود برمجة الاردوينو

#include <IRremote.h>
#include <Servo.h>
int IRpin = 11;  // pin for the IR sensor
IRrecv irrecv(IRpin);
decode_results results;
Servo myservo;
void setup()
{
 Serial.begin(9600);
 irrecv.enableIRIn(); // Start the receiver
 myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}
void loop() 
{
 if (irrecv.decode(&results)) 
   {
     irrecv.resume();   // Receive the next value
   }
  if (results.value == 33441975)  // change according to your IR remote button number
    {
      myservo.write(0);
      delay(15);
    }
    if (results.value == 33446055)  // change according  to your IR remote button number
    {
      myservo.write(30);
    delay(15);

الاثنين، 6 مايو 2019

عرض في ورقة Excel باستخدام RFID-RC522

RFID-RC522 مع Arduino UNO وحفظ المعلومات حول البطاقات في ملف Excel.

المواد المستخدمة

اردوينو اونو او جينون

R fid tags

يعتمد هذا المشروع على حضور RFID ، وقد استعملت هنا Arudino uno كوحدة تحكم. ويمكن استخدام هذا لضمان وصول جميع الموظفين في الشركة في الوقت المناسب يوميًا وحفظ ملف Excel حيث يتم تخزين الأسماء وكل رقم فريد عند تخزين جميع الموظفين لقد حضروا


الربط
يتم الاتصال وفقا للرسم البياني معين.

الآن فتح Arudino IDE ، وتشمل ملفات المكتبة

include <SPI.h>

include <MFRC522.h>

#include <TimeLib.h>

بعد ذلك open-> مثال -> MFRC522 -> rfid قراءة البيانات الشخصية

بعد تشغيل الشفرة أعلاه ، افتح الشاشة التسلسلية وإظهار العلامة rfid للقارئ ، ثم يوفر معرف كل العلامات.




في المرفقات التي حمّلتها الكود المصدري ، أضف معرّف البطاقة إليه.

قم بتشغيل الكود وافتح الشاشة التسلسلية

سيتم الكشف عن معرف البطاقة ، ثم إغلاق الشاشة التسلسلية

انتقل إلى PLX-DAQ (الحصول على البيانات لـ excel) ، قم بتوصيل منفذ COMB ، والآن قم بإظهار علامة RFID ، سيتم طباعة تفاصيل الموظفين.


كود البرمجة

#include <SPI.h>
#include <MFRC522.h>
#include <TimeLib.h>

#define SS_PIN 10 
#define RST_PIN 9

MFRC522 mfrc522(SS_PIN, RST_PIN); 
String card_ID=""; 

//Add as many cards you want 
String Name1="89 48 C9 2F";
String Name2="12122112947";
String Name3="15353114169";
String Name4="13937143185";
String Name5="79 DD 81 2F";
String Name6="89 48 C9 2F";

int NumbCard[6];
int j=0;  
int statu[6];
int s=0;  

int const RedLed=6;
int const GreenLed=5;
int const Buzzer=8;

String Log;
String Name;
long Number;
int n ;
int ID=1;
void setup() {
  setTime(20,0,0,3,30,2019);
  Serial.begin(9600);
  SPI.begin();  
  mfrc522.PCD_Init(); 
  
  Serial.println("CLEARSHEET");                
  Serial.println("LABEL,ID,Date,Name,Number,Card ID,Time IN,Time OUT");
  pinMode(RedLed,OUTPUT);
  pinMode(GreenLed,OUTPUT);
  pinMode(Buzzer,OUTPUT);
  setTime(20,0,0,3,30,2019);
  

  delay(200);
   }
   
void loop() {
  
   if ( ! mfrc522.PICC_IsNewCardPresent()) {
  return;
 }
 
 if ( ! mfrc522.PICC_ReadCardSerial()) {
  return;
 }

 for (byte i = 0; i < mfrc522.uid.size; i++) {
     card_ID += mfrc522.uid.uidByte[i];
 }
 
 Serial.println(card_ID);
 
       if(card_ID==Name1){
       Name="First employee";
       Number="79 DD 81 2F";
       j=0;
       s=0;
      }
      else if(card_ID==Name2){
       Name="Second employee";
       Number=789101;
       j=1;
       s=1;
      }
      else if(card_ID==Name3){
       Name="Third employee";
       Number=789101;
       j=2;
       s=2;
      }
      else if(card_ID==Name4){
       Name="Fourth employee";
       Number=789101;
       j=3;
       s=3;
      }
      else if(card_ID==Name5){
       Name="Fiveth employee";
       Number=789101;
       j=4;
       s=4;
      }
      else if(card_ID==Name6){
       Name="Sixth employee";
       Number=789101;
       j=5;
       s=5;
      }
      else{
          digitalWrite(GreenLed,LOW);
          digitalWrite(RedLed,HIGH);
          goto cont;
     }

      if(NumbCard[j] == 1 && statu[s] == 0){
      statu[s]=1;
    
      Serial.print("DATA,");
      Serial.print(ID);
      Serial.print(",");
      Serial.print("DATE");
      Serial.print(",");
      Serial.print(Name);
      Serial.print(",");
      Serial.print(Number); 
      Serial.print(",");
      Serial.print(card_ID); 
      Serial.print(",");
      Serial.print("");
      Serial.print(",");
      Serial.println("TIME");
      ID=ID+1;
      digitalWrite(GreenLed,HIGH);
      digitalWrite(RedLed,LOW);
      digitalWrite(Buzzer,HIGH);
      delay(30);
      digitalWrite(Buzzer,LOW);
      }
      else if(NumbCard[j] == 0){
      NumbCard[j] = 1;
      
      n++;
    
      Serial.print("DATA,");
      Serial.print(ID);
      Serial.print(",");
      Serial.print("DATE");
      Serial.print(",");
      Serial.print(Name);
      Serial.print(",");
      Serial.print(Number); 
      Serial.print(",");
      Serial.print(card_ID); 
      Serial.print(",");
      Serial.print("TIME");
      Serial.print(",");
      Serial.println("");
      digitalWrite(GreenLed,HIGH);
      digitalWrite(RedLed,LOW);
      digitalWrite(Buzzer,HIGH);
      delay(30);
      digitalWrite(Buzzer,LOW);
      ID=ID+1;
      }
      else if(statu[s] == 1){
     
      }
      delay(1000);
     
cont:
delay(2000);
digitalWrite(GreenLed,LOW);
digitalWrite(RedLed,LOW);
card_ID="";

}
    void printTime() {
  Serial.print(hour());
  Serial.print(":");
  Serial.print(minute());
  Serial.print(":");
  Serial.print(second());
  Serial.print(",");