الثلاثاء، 3 مارس 2020

How to Use Arduino + VL53L0X to Build a Liquid Level Sensing Device- كيفية بناء جهاز استشعار مستوى السائل بأستخدام اردوينو

في هذه المقالة ، تعلم بناء مستشعر قادر على اكتشاف مستوى السائل في أي وعاء يحتويه
سوف تتعلم كيفية إنشاء جهاز استشعار مستوى السائل  بدون تلامس باستخدام Arduino وشاشة I2C OLED ووحدة استشعار VL53L0X.

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



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

في هذا المشروع ، سوف نستخدم طريقة ثالثة: وحدة استشعار تعتمد على الليزر بدون تلامس تستخدم شريحة استشعار VL53L0X.

ما هو VL53L0X؟
تستخدم وحدة استشعار VL53L0X تقنية تحديد المسافة من وقت الطيران (ToF). إنها ترتد أشعة الليزر IR غير المرئية من أي سطح وتقيس الوقت الذي يستغرقه الضوء للوصول إلى الكاشف.

Liquid_Level_Arduino_VL53L0Xim_RW_MP_image9.jpg

و VL53L0X

يأتي الطراز VL53L0X في لوحة جانبية صغيرة مع منظم مدمج وجهاز قادر على I2C.

تشمل المواصفات الأخرى:
الوزن: 0.5 غرام
العمل الجهد: بين 2.6 V إلى 5.5 V
الاستهلاك الحالي: 10 مللي أمبير ، يمكن أن تصل إلى ذروة الحالية 40 مللي أمبير.
أبعاد الحجم والعرض: 0.5 ″ × 0.7 ″ × 0.085 ″ (13 ملم × 18 ملم × 2 ملم)
التواصل مع ميكروكنترولر (I²C): قراءة مسافة 16 بت (بالمليمترات)
نطاق هذا المستشعر: يصل إلى 2 متر (6.6 قدم)

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

الأجهزة المطلوبة
اردوينو UNO
شاشة OLED i2c
لوح الربط
أسلاك العبور
وحدة استشعار VL53L0X

Liquid_Level_Arduino_VL53L0Xim_RW_MP_image3.jpg

البرامج المطلوبة
اردوينو بيئة تطوير متكاملة
مكتبة VL53L0X.
SSD1306
الأسلاك الأجهزة
قم بتوصيل الجهاز كما هو موضح أدناه في المخطط 

Liquid_Level_Arduino_VL53L0Xim_RW_MP_image7.png

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

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

Liquid_Level_Arduino_VL53L0Xim_RW_MP_image2.jpg

بعد تغيير القيمة أعلاه في رسم Arduino الثاني ، قم بتحميل الكود. الآن سوف تبدأ اردوينو عرض مستوى السائل كنسبة مئوية. على سبيل المثال ، إذا كانت حاوية الزجاجة / السائل فارغة تمامًا ، فسوف تعرض 100٪ فارغة على شاشة OLED. إذا كان نصف ممتلئ ، فسيتم عرض 50٪ فارغة وهكذا.

إذا تجاوزت القيمة 100٪ ، فقم بمعايرة الإنشاء مرة أخرى للحصول على نتيجة دقيقة.

كود البرمجة

        Calibration Sketch
#include <Wire.h>
#include <VL53L0X.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <MedianFilter.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

VL53L0X sensor;

MedianFilter test(10, 0);

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

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  sensor.init();
  sensor.setTimeout(500);

#if defined LONG_RANGE
  // lower the return signal rate limit (default is 0.25 MCPS)
  sensor.setSignalRateLimit(0.1);
  // increase laser pulse periods (defaults are 14 and 10 PCLKs)
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
#endif

#if defined HIGH_SPEED
  sensor.setMeasurementTimingBudget(20000);
#elif defined HIGH_ACCURACY
  // increase timing budget to 200 ms
  sensor.setMeasurementTimingBudget(200000);
#endif

  // Clear the buffer.
  display.clearDisplay();
  display.setRotation(2);
  display.display();

  
  display.setTextColor(WHITE);
  
  
}
void displayDistance( int val){
  display.clearDisplay();
  display.setTextSize(4);
  display.setCursor(0,0);
  display.print(val);

  display.setTextSize(2);
  display.setCursor(0,30);
  display.print("mm");
  display.display();
  delay(100);
}
void loop()
{
  int o,r = sensor.readRangeSingleMillimeters();
  test.in( r );
  o = test.out();
  Serial.print(o);
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }

  Serial.println();

  displayDistance( o );
  
}


Project Sketch 
#include <Wire.h>
#include <VL53L0X.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <MedianFilter.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
int total=245; //Enter your Empty bottle value in Milimeter over here 
float per;
VL53L0X sensor;

MedianFilter test(10, 0);

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
*/
void setup()
{
  Serial.begin(9600);
  Wire.begin();

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  sensor.init();
  sensor.setTimeout(500);

#if defined LONG_RANGE
  // lower the return signal rate limit (default is 0.25 MCPS)
  sensor.setSignalRateLimit(0.1);
  // increase laser pulse periods (defaults are 14 and 10 PCLKs)
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
#endif

#if defined HIGH_SPEED
  // reduce timing budget to 20 ms (default is about 33 ms)
  sensor.setMeasurementTimingBudget(20000);
#elif defined HIGH_ACCURACY
  // increase timing budget to 200 ms
  sensor.setMeasurementTimingBudget(200000);
#endif

  // Clear the buffer.
  display.clearDisplay();
  display.setRotation(2);
  display.display();
  display.setTextColor(WHITE);
  
}
void displayDistance( float val){
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(0,0);
  display.print(val);

  display.setTextSize(2);
  display.setCursor(38,17);
  display.print("% Empty");
  display.display();
  delay(100);
}
void loop()
{
  float o,r = sensor.readRangeSingleMillimeters();
  test.in( r );
  o = test.out();

  if(o<50)
  {
  display.clearDisplay();
  display.setTextSize(1);
  display.setCursor(0,0);
  display.print("Full");
   display.display();
  Serial.println("Full");
  delay(100);
    
    }
   int t= total;
   
   per=(o/t)*100;

  displayDistance( per );

  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
  Serial.print("value of : sensor");
  Serial.println(o);
  Serial.println();
  Serial.print(per);
  Serial.println("%");  
   
   return;
  
}




كشف تسرب الغاز بأستخدام اردوينو -LPG Gas Leakage Detector using Arduino

هنا نقوم بتصميم إنذار للكشف عن غاز البترول المسال من Arduino والذي سيكشف عن التسرب  .

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

اردوينو اونو
LPG gas sensore
Bc 757 ترانسستور
شاشة 16x2
بطارية 9فولت

عن المشروع 

وحدة استشعار غاز البترول المسال

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

عمل المشروع

يتم استخدام وحدة استشعار غاز البترول المسال للكشف عن غاز البترول المسال. عندما يتم استشعار تسرب غاز البترول المسال (LPG) ، سوف يعطي نبضة عالية على دبوس DO ويقوم Arduino باستمرار بقراءة DO.

عندما يتلقى Arduino نبضة عالية من وحدة استشعار LPG Gas ، فإنه يعرض رسالة "LPG Gas Leakage Alert" على شاشة LCD مقاس 16 × 2 ويحفز الجرس الذي يصدر صوتًا جديدًا حتى لا تتعرف وحدة كاشف الغاز على الغاز في البيئة.

عندما يحصل اردوينو على نبض منخفض من وحدة الكشف عن غاز البترول المسال ، ستقوم شاشة LCD بعرض رسالة التنبيه "لا تسرب غاز البترول المسال".

تقوم Arduino بإدارة العملية الكاملة لهذا النظام مثل قراءة إخراج وحدة استشعار LPG Gas ، وإرسال رسالة إلى شاشة LCD وتحفيز الجرس. يمكننا ضبط حساسية وحدة المستشعر هذه بواسطة مقياس الجهد الموجود في ثناياه عوامل.



 كود البرمجة

        #include <LiquidCrystal.h>
LiquidCrystal lcd(3, 2, 4, 5, 6, 7);

#define lpg_sensor 18
#define buzzer 13

void setup() 
{
  pinMode(lpg_sensor, INPUT);
  pinMode(buzzer, OUTPUT);
  lcd.begin(16, 2);
  lcd.print("LPG Gas Detector");
  lcd.setCursor(0,1);
  lcd.print("Circuit Digest");
  delay(2000);
}

void loop() 
{
  if(digitalRead(lpg_sensor))
  {
    digitalWrite(buzzer, HIGH);
    lcd.clear();
    lcd.print("LPG Gas Leakage");
    lcd.setCursor(0, 1);
    lcd.print("     Alert     ");
    delay(400);
    digitalWrite(buzzer, LOW);
    delay(500);
  }
  
  else 
  {
    digitalWrite(buzzer, LOW);
    lcd.clear();
    lcd.print("  No LPG Gas ");
    lcd.setCursor(0,1);
    lcd.print("   Leakage   ");
    delay(1000);
  }

الجمعة، 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(",");