الخميس، 23 أبريل 2020

عمل ساعة رقمية مع تحسس الحرارة والرطوبة باستخدام اردوينو نانو



عمل ساعة رقمية مع تحسس الحرارة والرطوبة باستخدام اردوينو نانو

Arduino Nano 7SEG clock (whitout RTC)+ temp. + humid

المكونات واللوازم

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

لقد طلبت نموذج RTC وأنا في انتظار وصوله.


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


كود البرمجة


#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <SevSeg.h>
DHT dht(A2,DHT22);
SevSeg Display; 
char text[10][6]; 
int i = 0;
unsigned long timer;

//----------------------SET OROLOGIO
const unsigned long period = 1000; //durata 1 sec.
const unsigned long led_period = 500; //durata lampeggio :
unsigned long startMillis;
unsigned long led_startMillis;
unsigned long currentMillis;
unsigned long led_currentMillis;
const int hrs_btn = A0; //set ore
const int min_btn = A1; //set minuti
const int ledPin = 13; //pin lampeggio :
int Hrs = 0;
int Min = 0;
int Sec = 0;
int Time = 0000;
int ledState = HIGH;

void setup() {
  pinMode(hrs_btn, INPUT_PULLUP);
  pinMode(min_btn, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  byte numDigits = 4;
  byte digitPins[] = {12, 10, 9, 11};
  //byte digitPins[] = {11, 9, 10, 12};
  byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8,0};
  bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
  byte hardwareConfig = COMMON_CATHODE; // See README.md for options
  bool updateWithDelays = false; // Default 'false' is Recommended
  bool leadingZeros = true; // Use 'true' if you'd like to keep the leading zeros
  bool disableDecPoint = true; // Use 'true' if your decimal point doesn't exist or isn't connected
  Display.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
  updateWithDelays, leadingZeros, disableDecPoint);
  Display.setBrightness(100);
  dht.begin();
  pinMode(ledPin, OUTPUT); // PIN 13 lampeggio :
  pinMode(A2, INPUT); // input DHT22
 }
  
  void loop() 
{    
  char mychar[ ] = "ORA";
  float hu = dht.readHumidity();
  float t = dht.readTemperature();
  float orario = Time;
   
      
      
      String e = String (mychar);           //memorizza mychar
      String f = e.substring (0,4);   //memorizza cifra a 4 digit 
      f.toCharArray(text[1],5);       //visualizza come 1 (ARRAY)
      
      
      orario=orario*10;
      String c = String (orario);        //memorizza ora
      String d = c.substring (0,4);      //memorizza cifra a 4 digit 
       d.toCharArray(text[2],5);        //visualizza come 2 (ARRAY)
      
               
      t=t*10;
      String k = String(t);             //memorizza t
      String r = k.substring (0,3)+"*"; //memorizza cifra a 3 digit + C
      r.toCharArray(text[3],5);       //visualizza come 3 (ARRAY)
      
      
      hu=hu*10;
      String A = String(hu);           //memorizza hu
      String B = A.substring(0,3)+"h"; //memorizza cifra a 3 digit
      B.toCharArray(text[4],5);        // visualizza come 4 (ARRAY)
      
       switch (i)
{
  case 1:
      digitalWrite(ledPin, LOW); //pin 13 on  Humid
       break;
   case 2:
      digitalWrite(ledPin, HIGH); //pin 13 off  ORA
       break;
   case 3:
      digitalWrite(ledPin, LOW);  //orario
      Display.setNumber(Time);
      if (digitalRead(hrs_btn) == LOW){goto X;}
        if (digitalRead(min_btn) == LOW){goto X;}
        break;
   case 4:
      digitalWrite(ledPin, LOW);  //gradi
       break;
}
     if (millis() > (timer + 6000)) //tempo di visualizzazione
     {
    switch(i);
    Display.setChars(text[i]);
    i++;
    if (i >= 5) i = 1; // (ARRAY)conta fino a 5 poi torna a 1
    timer = millis();}
    
    //--------------------------------OROLOGIO

  X:      currentMillis = millis();
  if (currentMillis - startMillis >= period)
  {
    Sec = Sec + 1;
    startMillis = currentMillis;
  }
  led_currentMillis = millis();
  if (led_currentMillis - led_startMillis >= led_period)
  {  led_startMillis = led_currentMillis;
    
    if (ledState == LOW) {   ledState = HIGH;
      
      if (digitalRead(hrs_btn) == LOW) //avanzamento ore
      {  Hrs = Hrs + 1; }
      
      if (digitalRead(min_btn) == LOW) //avanzamento min
      {  Min = Min + 1;  Sec = 0; }
    }
    else
    { ledState = LOW; }
    digitalWrite(ledPin, ledState);
  }
  if (Sec == 60)
  {
    Sec = 0;
    Min = Min + 1;
  }
  if (Min == 60)
  {
    Min = 0;
    Hrs = Hrs + 1;
  }
  if (Hrs == 24) //12/24 ore
  {
    Hrs = 0;
  }
  Time = Hrs * 100 + Min;
  
   Display.refreshDisplay();
}


Clock without rtc 529x1024 zmh10k0uq1

الثلاثاء، 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);
  }