الجمعة، 3 يوليو 2020

اردوينو للعد التنازلي قابل للتعديل


Adjustable Countdown Timer


الأشياء المستخدمة في هذا المشروع

4-digit 7-segment display
بوش بتن- مفتاح الضغط
صافرة كهربائية - بزر

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


قضيت بعض الوقت في كتابة رمز يجعل من السهل استخدام وتعديل المؤقت ، بحيث يمكن استخدامه عمليًا.

يمكن أيضًا استخدام الرمز المتضمن في مشاريع أخرى مع عرض مكون من 4 أرقام مكون من 7 أجزاء. على وجه الخصوص ، لديه الوظيفة التي تعرض رقم معين (0-9999) لفاصل زمني معين. ربما تكون هذه الوظيفة موجودة في بعض المكتبات ، لكن البحث السريع لم يكشف عنها. نظرًا لأن برمجة هذا العرض صعبة بعض الشيء (حيث يمكنك إظهار رقم واحد فقط في كل مرة) ، فإن هذه الوظيفة مفيدة حقًا.

التعريفات


كود الترميز
#include <math.h>

int digit_pin[] = {6, 9, 10, 11}; // PWM Display digit pins from left to right

int speakerPin = 15;

#define DIGIT_ON  LOW
#define DIGIT_OFF  HIGH

int segA = 2; 
int segB = 3; 
int segC = 4; 
int segD = 5; 
int segE = A0; //pin 6 is used bij display 1 for its pwm function
int segF = 7; 
int segG = 8; 
//int segPD = ; 


int button1=13;
int button2=12;
int button3=16;
int button4=17;

int countdown_time = 60;

struct struct_digits {
    int digit[4];
  };


void setup() {                
  pinMode(segA, OUTPUT);
  pinMode(segB, OUTPUT);
  pinMode(segC, OUTPUT);
  pinMode(segD, OUTPUT);
  pinMode(segE, OUTPUT);
  pinMode(segF, OUTPUT);
  pinMode(segG, OUTPUT);

  for (int i=0; i<4; i++) {
    pinMode(digit_pin[i], OUTPUT);
  }

  pinMode(speakerPin, OUTPUT);

  pinMode(button1,INPUT_PULLUP);
  pinMode(button2,INPUT_PULLUP);
  pinMode(button3,INPUT_PULLUP);
  pinMode(button4,INPUT_PULLUP);
}


void playTone(int tone, int duration) {
  for (long k = 0; k < duration * 1000L; k += tone * 2) {  
    digitalWrite(speakerPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(speakerPin, LOW);
    delayMicroseconds(tone);
  }
}


void lightNumber(int numberToDisplay) {

#define SEGMENT_ON  HIGH
#define SEGMENT_OFF LOW

  switch (numberToDisplay){

  case 0:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_ON);
    digitalWrite(segF, SEGMENT_ON);
    digitalWrite(segG, SEGMENT_OFF);
    break;

  case 1:
    digitalWrite(segA, SEGMENT_OFF);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_OFF);
    digitalWrite(segE, SEGMENT_OFF);
    digitalWrite(segF, SEGMENT_OFF);
    digitalWrite(segG, SEGMENT_OFF);
    break;

  case 2:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_OFF);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_ON);
    digitalWrite(segF, SEGMENT_OFF);
    digitalWrite(segG, SEGMENT_ON);
    break;

  case 3:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_OFF);
    digitalWrite(segF, SEGMENT_OFF);
    digitalWrite(segG, SEGMENT_ON);
    break;

  case 4:
    digitalWrite(segA, SEGMENT_OFF);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_OFF);
    digitalWrite(segE, SEGMENT_OFF);
    digitalWrite(segF, SEGMENT_ON);
    digitalWrite(segG, SEGMENT_ON);
    break;

  case 5:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_OFF);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_OFF);
    digitalWrite(segF, SEGMENT_ON);
    digitalWrite(segG, SEGMENT_ON);
    break;

  case 6:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_OFF);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_ON);
    digitalWrite(segF, SEGMENT_ON);
    digitalWrite(segG, SEGMENT_ON);
    break;

  case 7:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_OFF);
    digitalWrite(segE, SEGMENT_OFF);
    digitalWrite(segF, SEGMENT_OFF);
    digitalWrite(segG, SEGMENT_OFF);
    break;

  case 8:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_ON);
    digitalWrite(segF, SEGMENT_ON);
    digitalWrite(segG, SEGMENT_ON);
    break;

  case 9:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_OFF);
    digitalWrite(segF, SEGMENT_ON);
    digitalWrite(segG, SEGMENT_ON);
    break;

  case 10:
    digitalWrite(segA, SEGMENT_OFF);
    digitalWrite(segB, SEGMENT_OFF);
    digitalWrite(segC, SEGMENT_OFF);
    digitalWrite(segD, SEGMENT_OFF);
    digitalWrite(segE, SEGMENT_OFF);
    digitalWrite(segF, SEGMENT_OFF);
    digitalWrite(segG, SEGMENT_OFF);
    break;  
  }
 
}



void SwitchDigit(int digit) {
  for (int i=0; i<4; i++) {
    if (i == digit) {
      digitalWrite(digit_pin[i], DIGIT_ON);
    } else {
      digitalWrite(digit_pin[i], DIGIT_OFF);
    }
  }
}


struct struct_digits IntToDigits(int n){
  struct struct_digits dig;
  int zeros=0;
  int d;
  for (int i=0; i<4; i++) {
    d=n/pow(10,3-i);
    zeros += d;
    n = n - d*pow(10,3-i);
    if (zeros!=0 || i==3) {
      dig.digit[i]=d;
    } else {
      dig.digit[i]=10;
    }
  }
  return dig;
}

void PrintNumber(int n, int time) {
  struct struct_digits dig;

  dig = IntToDigits(n);
  
  for (int i=0; i<= time/20; i++) {
    if (digitalRead(button2)==LOW) {
      return;
    }
    for (int j=0; j<4; j++) {
      SwitchDigit(j);
      lightNumber(dig.digit[j]);
      delay(5);
    }
  }
}


bool Countdown(int n, int del){
  for (int q=n; q>0; q--){
    PrintNumber(q,del);
    if (digitalRead(button2)==LOW) {
      return false;
    }
  }
  PrintNumber(0,0);
  playTone(1519,1000);
  return true;
}



void reset() {
  int m, zeros, d, pressed3 = 0, pressed4 = 0;
  m=countdown_time;
  struct struct_digits dig;

  dig = IntToDigits(countdown_time);
  
  while (digitalRead(button1)==HIGH) {
    for (int j=0; j<4; j++) {
      SwitchDigit(j);
      lightNumber(dig.digit[j]);
      delay(5);
    }
    if (digitalRead(button3)==LOW) { 
      if (pressed3 == 0 || pressed3 > 30) {
        if (countdown_time > 0) {
          countdown_time -= 1 ;
        }
        dig = IntToDigits(countdown_time);
      } 
      pressed3 += 1;
    }
    else if (digitalRead(button4)==LOW) { 
      if (pressed4 == 0 || pressed4 > 30) {
        if (countdown_time <9999) {
          countdown_time += 1 ;
        }
        dig = IntToDigits(countdown_time);
      } 
      pressed4 += 1;
    }
    if (digitalRead(button3)==HIGH) {
      pressed3=0;
    }
    if (digitalRead(button4)==HIGH) {
      pressed4=0;
    }
  }
}

void loop(){
  reset();
  while (!Countdown(countdown_time,962)) {
    reset();
  }
  while (digitalRead(button2)==1){};
}










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

ربط محرك سيرفو مع Arduino Uno

Servo Motor Interface with Arduino Uno

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

اردوينو نانو
سيرفو موتور
اسلاك الربط

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

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

في هذه المقالة أستخدم محرك سيرفو واحد فقط. الرمز مخصص لمؤازرة واحدة فقط. بالنسبة للعديد من الماكينات ، قد يتغير الرمز. إذا فهمت هذا الرمز ، فستتمكن من التحكم في عدة أجهزة.
Arduino IDE هي أداة رائعة لتطوير الكود وتحميل الكود على Arduino Board.

الخطوة 1

إذا كنت تعرف بالفعل تثبيت Arduino IDE أو لديك Arduino IDE ، يرجى تخطي هذه الخطوة.

قم بتنزيل برنامج Arduino IDE 

بعد تثبيت Arduino IDE افتحه.

الخطوة 2

نحتاج في هذا المشروع إلى استخدام مكتبة باسم "Servo.h". هذه مكتبة مدمجة مع Arduino IDE.

هناك طريقتان لتضمين مكتبة

انتقل إلى Sketch> تضمين مكتبة> Servo

أو

ما عليك سوى كتابة # تتضمن <Servo.h>

# تتضمن <Servo.h>
الخطوه 3

بعد ذلك نحتاج إلى تعريف متغير نوع عدد صحيح. الآن أستخدم المتغير المسمى "pos". يمكن لهذا المتغير الاحتفاظ بقيم صحيحة فقط.

الخطوة - 4

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

 Myservo.
الخطوة - 5

يتكون كل برنامج Arduino من وظيفة "void setup ()" و "void loop ()". عند تشغيل Arduino ، ستعمل الوظائف / العبارات في "void setup ()" أولاً وستعمل مرة واحدة. بعد ذلك ، ستعمل الوظائف / العبارات في حلقة فارغة () مثل الحلقة.

نحن بحاجة إلى تعيين دبوس إشارة محرك سيرفو إلى Arduino pin في "إعداد الفراغ ()". في الصوت الواضح ، نعلن هنا عن دبوس Arduino للتحكم في محرك سيرفو. هنا نستخدم Digital Pin 3 من Arduino للتحكم في محرك سيرفو.

هنا نستخدم الكلمة المرفقة (). الصيغة هي "variable_name.attach (pin_number)". الرمز يبدو ،

Myservo.attach (3) ؛
الخطوة - 6

دعونا مناقشة حول بيان التحكم المؤازرة. الكلمة الأساسية هي "write ()". والصيغة هي "variable_name.write (pos)". يمكننا إما استخدام متغير أو رقم يقع بين 0 و 360 في وظيفة الكتابة.

Myservo.write (pos) ؛
الخطوة - 7

الآن نحن بحاجة إلى تعيين وظيفة حلقة. هنا نستخدم حلقة "for ()" للتحكم في محرك سيرفو. في حلقة () ، اضبط القيمة الدنيا هي 0. أي. (.pos = 0) والقيمة القصوى هي 180. أي. (pos <= 180). ثم قم بنسخ نقاط البيع أي (pos ++). ثم نفذ وظيفة الكتابة (الوظيفة في الخطوة 6) في الحلقة من أجل. ثم أضف وظيفة تأخير. تساعد وظيفة التأخير هذه في انتظار 15 مللي ثانية حتى تصل المؤازرة إلى الوضع.

for (pos = 0؛ pos <= 180؛ pos ++) {
Myservo.write (pos) ؛
تأخير (15) ؛
}}
الخطوة - 8

ثم قم بإضافة وظيفة تأخير أخرى بعد حلقة for (). وظيفة التأخير هذه تنتظر وقتًا مناظرًا (والذي يتم تضمينه في وظيفة التأخير) بعد أعلاه للحلقة.

تأخير (1000) ؛
الخطوة - 9

الآن نحن بحاجة إلى تعيين وظيفة حلقة أخرى. هنا نستخدم حلقة "for ()" للتحكم في محرك سيرفو. في حلقة () ، اضبط الحد الأدنى للقيمة 180. أي. (.pos = 180) والقيمة القصوى هي 0. أي. (pos> = 0). ثم قلل من نقاط البيع أي (pos-). ثم نفذ وظيفة الكتابة (الوظيفة في الخطوة 6) في الحلقة من أجل. ثم أضف وظيفة تأخير. تساعد وظيفة التأخير هذه في انتظار 15 مللي ثانية حتى تصل المؤازرة إلى الوضع.

for (pos = 180؛ pos> = 0؛ pos -) {
Myservo.write (pos) ؛
تأخير (15) ؛
}}
الخطوة - 10

ثم قم بإضافة وظيفة تأخير أخرى بعد حلقة for (). وظيفة التأخير هذه تنتظر وقتًا مناظرًا (والذي يتم تضمينه في وظيفة التأخير) بعد أعلاه للحلقة.

تأخير (1000) ؛
اكتمال الرمز. الكود الكامل موجود في جزء البرنامج.

اكتب الرمز بالكامل وتحقق مرة أخرى من الأخطاء. ثم قم بتحميل (زر السهم في الأعلى) الرمز إلى Arduino Board.

من فضلك لا تنسخ والصق الرمز الخاص بي. اصنع خاصتك. "لا تكن AMUL BABY !!!!!"
هنا أنا أستخدم أجهزة SG90 الدقيقة. يمكن أن تعمل لوحة Arduino Uno على محرك سيرفو بدون مصدر طاقة إضافي. ولكن عند استخدام محرك سيرفو أكثر أو نوع آخر من محرك سيرفو ، أوصي بشدة بإمداد طاقة إضافي.

كود البرمجة

#include<Servo.h>
Servo Myservo;
int pos;
void setup()
{
Myservo.attach(3);
}

void loop()
{
  
  
for(pos=0;pos<=180;pos++){
Myservo.write(pos);
delay(15);
}
  delay(1000);
  
  for(pos=180;pos>=0;pos--){
Myservo.write(pos);
delay(15);
}
  delay(1000);
  
}


Stunning borwo elzing 1axsyivikv