الأربعاء، 4 مارس 2020

Arduino Voltage Reference اردوينو الجهد المرجعي

اردوينو الجهد المرجعي Arduino Voltage Reference
يوجد مرجع جهد اردوينو (1.1 فولت) مدمج في بعض ميكروكنترولر اردوينو. لدى كل من Uno و Nano واحد ، وعدد قليل من Arduinos الآخرين لديهم.
عادةً ما تقوم بإعداد Arduino ADC باستخدام مزود الطاقة المتحكم كمرجع للجهد (لأنه سهل! وهو الوضع الافتراضي لبرنامج Arduino). المشكلة في ذلك هي أن رقاقة مزود الطاقة ستحدد بعد ذلك دقة قياسك ، بمعنى أنه لن يكون لديك أدنى فكرة إذا كانت دقيقة أو مستقرة مع درجة الحرارة.

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

على سبيل المثال ، يمكن أن يعمل Arduino Uno / Nano من 1V8 إلى 5V5 واستخدام خليتين من AA يسمح بالعمل (ولكن فقط إذا قمت بضبط الساعة على 4MHz - راجع قسم ورقة البيانات 29.3 "درجات السرعة"). يمكنك استخدام مرجع الجهد الداخلي لمراقبة حالة البطارية - بدون مكونات إضافية.
تحاول هذه الصفحة أن تحدد ، بطريقة بسيطة ، ما إذا كان مرجع جهد Arduino يعتبر جيدًا أم لا.


فجوة نطاق الجهد المرجعي

نوع المرجع في ATMega328P هو نوع ذو فجوة نطاق. يستخدم هذا عنصرين ، أحدهما مع معامل درجة الحرارة السلبية والآخر مع معامل درجة حرارة موجبة يلغي تأثيرات درجة الحرارة.
بينما لا تمنحك قراءات الجهد فائقة الدقة في Arduino ، فقد صُممت الدائرة لتكون مستقرة ضد التغيرات في درجات الحرارة والجهد الكهربائي.

يستخدم هذا النوع من تخطيط الدوائر في المراجع الحديثة على سبيل المثال MAX6143. ومع ذلك ، في ATMega328 وما شابه ذلك ، فإن عملية التحكم في تخطيط الرقاقة على السيليكون لم يتم تعريفها جيدًا ولا تستخدم التشذيب بالليزر ، وبالتالي فإن الدقة الأولية السيئة لمرجع جهد Arduino (± 9٪).

يمكنك معرفة كيفية التخلص من هذا الإزاحة لاحقًا في هذه الصفحة.

ملاحظة: إذا كنت تستخدم مرجعًا خارجيًا ، فسيكون قياس ADC أكثر دقة نظرًا لأنك تتحكم في مواصفات الشريحة.
ومع ذلك ، تذكر أن ADC الداخلي في Arduino ليس دقيقًا على أي حال (انظر ورقة بيانات ATMega328: الدقة المطلقة 2LSB (بما في ذلك INL و DNL وأخطاء التقدير والكسب والإزاحة).

تحذير: لا تستخدم مطلقًا مرجعًا للجهد الخارجي وتمكّن في الوقت نفسه المرجع الداخلي - هناك شيء سينكسر!
يستخدم لمرجع الجهد اردوينو
يمكن استخدام مرجع الجهد اردوينو في واحدة من خمس طرق مختلفة:
للكشف عن اللون البني (انظر ورقة البيانات لتمكين).
كقيمة القياس في ADC (تغذية في أحد المدخلات).
كمرجع لقياسات ADC.
كمدخل إلى المقارنة.
قياس درجة الحرارة (يجب أن تستخدم ADC المرجع الداخلي).

براون خارج الكشف

يتيح الكشف عن اللون البني للمعالج تحديد متى انخفض جهد التيار الكهربائي عن عتبة ولكن لم يذهب إلى الصفر تمامًا. يستخدم هذا للإشارة إلى المعالج أن الذاكرة قد تكون مكتوبة بشكل سيء. إنه يوفر طبقة إضافية من الموثوقية لتطبيق ما.
مدخلات إلى ADC
من شأن قياس المرجع عند إدخال ADC أن يتيح معايرة مصدر مرجعي مختلف ، على سبيل المثال العرض (انظر هنا) أو كمقارنة خام مع مدخلات ADC الأخرى (إلا إذا كنت تقوم بمعايرة المرجع أولاً كما هو موضح في هذه الصفحة - وفي هذه الحالة يمكن أن تكون دقيقة للغاية (~ 1٪)).
مرجع ADC
باستخدام مرجع الجهد اردوينو كما كنت تتوقع أن تستخدم!
نصيحة: استخدام مرجع 1V1 يعني أن ADC 10 بت له قيمة LSB ~ 1mV (1.074mV / LSB).
المدخلات المقارنة
باستخدام مرجع الجهد يسمح المقارنة الخام أي يمكنك فقط مقارنة أي جهد الدخل إلى 1V1. نقطة واحدة مثيرة للاهتمام هي أن أي من مدخلات ADC يمكن مقارنتها من قبل المقارنة - وهذا دون استخدام أي مكونات خارجية أخرى. انظر القسم 23.2 من ورقة البيانات المسمى "المدخلات المقارنة التناظرية المضاعفة".

يمكنك طرح السؤال "لماذا تهتم باستخدام المقارنة عندما يمكنك بسهولة حساب النتيجة باستخدام ADC؟" الجواب هو السرعة.

يمكن للمقارن مقارنة فولتين خلال 100 ثانية من النانوثانية في حين أن ADC هو نوع تقريبي متعاقب ويستغرق حوالي 13us لجمع قيمة ADC. يجب استرداد هذه القيمة بواسطة المعالج ، ثم تقوم بمقارنة القيمة بإعداد حد ، مما يتطلب وقتًا أطول بكثير.
قياس الحرارة
نظرًا لأن مرجع جهد Arduino مستقل عن درجة الحرارة ، فيمكن مقارنته بإخراج دائرة تعتمد على درجة الحرارة - دائرة داخل الشريحة. يتيح لك ذلك قياس درجة الحرارة في ATMega328P.

يمكن ضبط عنصر استشعار درجة الحرارة في ADC على أحد مدخلات ADC. تنص ورقة البيانات على أن معامل درجة الحرارة هو 1mV / ° C ولكن الدقة الأولية هي ± 10 ° C بسبب تباين العملية في تصنيع الرقاقة. (انظر القسم 24.8 من  المسمى "قياس درجة الحرارة"). للحصول على قراءة دقيقة يتطلب معايرة هذا النظام.

اردوينو الجهد المرجعي الأداء

تشير المعلومات الموجودة في ورقة البيانات على مرجع Arduino للجهد إلى أن قيمها القصوى والدنيا هي 1.0V ~ 1.2V و 1 V1 الاسمية. بخلاف هذا لا يوجد المزيد من المعلومات على الإطلاق.

لا توجد معلومات حول التكرار أو الاستقرار. تشير إلى أن الجهد يمكن أن يختلف بنسبة٪ 9٪ حول 1.1 فولت.

لذا فإن السؤال الحقيقي هو:


    هل مرجع الجهد اردوينو أي خير على الإطلاق؟


يبدو أن المواصفات تشير إلى أنها قد تختلف ± 9٪ في أي وقت. في الواقع هذا ليس صحيحا ومرجع الجهد هو أفضل بكثير ، ومفيدة للغاية.

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

ملاحظة: تم إجراء جميع قياسات الجهد باستخدام ADS1115 على لوحة جانبية. تم إجراء جميع قياسات الجهد في الوضع التفاضلي ADS1115. أجريت قياسات درجة الحرارة باستخدام MAX6675 والنوع J الحرارية.

الدقة الأولية
الدقة الأولية سيئة عند ± 9٪ ولكن معايرة مرجع جهد Arduino يسمح لك بالتخلص من هذا الخطأ.
ملاحظة: تبلغ دقة MAX6143 الأولية 0.05٪ (180 مرة أفضل ، 9٪).


استقرار النتائج Arduino Uno USB Stability Measurements

يتم قياس لوحين ، الأول هو لوحة Arduino uno القياسية والثاني هو لوحة Arduino Nano. كلاهما يستخدم نفس المعالج ATMega328P.

أعطت القياسات التي أجريت في أوقات / أيام مختلفة من Arduino Uno مدعوم من مزود الطاقة USB (hub) النتائج التالية:
اردوينو أونو USB قياسات الاستقرار
اردوينو أونو (PDIP)



Arduino Uno USB Stability Measurements , mechatronics  اردوينو اونو

Arduino Uno USB Stability Measurements




يختلف جهد USB بنسبة 2.4٪ إلى 3.6٪ وهذا ليس له تأثير كبير على تباين الخطأ في المرجع (انظر قياسات الجهد أدناه).
لاحظ كيف يظل الجهد المرجعي ثابتًا ، أي أنه يحتوي على خطأ إزاحة ثابت. على الرغم من أن مرجع الجهد يبدأ من قيمة 1.070V فإنه يحتفظ بالقرب من تلك القيمة. قد يكون هذا بسبب عملية التصنيع ويبدو أنه يظل ثابتًا بمرور الوقت.
للحصول على أفضل مجموعة من النتائج ، يتم الحصول على التزويد من لوحة وصل USB مع ناتج الطاقة الخاص بها بينما في الأسفل يكون مخرج USB مباشر للكمبيوتر الشخصي. هذا الأخير يبدو أكثر استقرارا قليلا (نانو).
في كلتا الحالتين ، فإن استخدام مرجع الجهد الداخلي على متن الطائرة سوف يعطي نتيجة أكثر اتساقًا حيث سيكون له تنظيم أكثر تشددًا للجهد.
ملاحظة: تذكر أنك تستخدم وحدة تزويد USB 5V مباشرة (عند العمل على المقعد) أو تستخدم وحدة طاقة خارجية. يحتوي منظم 5 فولت على متن الطائرة - LD1117AG (نفس NCP1117) - على خطأ تشديد في المواصفات (0.1 فولت في 5 فولت = 2٪) من طاقة USB (انظر قياسات حساسية التزويد أدناه).
استنتاج حول الاستقرار
على الرغم من أن مرجع جهد Arduino يحتوي على خطأ إزاحة أولي (ربما بسبب عملية التصنيع) ، فإن استقرار المرجع لا يزال جيدًا. مع القياسات هنا تظهر بين 0.21 ٪ ~ 0.31 ٪ التغيير.
امدادات التيار الكهربائي الاستقرار
.استخدام ATMega382p على لوح لحام دون توصيله بجهد إمداد متغير

استنتاج بشأن امدادات التيار الكهربائي

إشارة الجهد ذات فجوة الحزمة تبدو جيدة جدًا ، كونها غير حساسة لتوفير التغييرات في الجهد. ينخفض ​​بمقدار 1.2mV لكل انخفاض في إمدادات فولت يبدأ من 0،05 ٪ خطأ في 5.26V العرض. إذا تم الإبقاء على الإمداد ثابتًا ، فيمكن أيضًا إزالة خطأ الإزاحة هذا عن طريق معايرة المرجع.
درجة الحرارة الاستقرار
باستخدام المزدوجات الحرارية (النوع J) مع رقاقة MAX6675 و MSOP Arduino Nano. تسخين الشريحة لمدة دقيقة والانتظار حتى تستقر درجة الحرارة. يحتوي MAX6675 الحرارية على خطأ في درجة حرارة الإزاحة ولكن ما نريده حقًا هو التغير في درجة الحرارة وكيف يرتبط الناتج المرجعي. يتم قياس درجة الحرارة المحيطة أيضًا باستخدام جهاز مختلف لإعطاء نقطة مرجعية للحرارية المزدوجة.
قياسات اردوينو نانو
لدرجات الحرارة المحيطة نانو تقاس الحرارية 24.5 درجة مئوية (يقول مقياس الحرارة الأصلي 23 درجة مئوية) قريبة جدا. درجة الحرارة رقاقة 30 درجة مئوية.

القياس الأول:
Vref هو 1.0674V.
Vref هي رقاقة تسخين 1.0659kV إلى 75 درجة مئوية
السقوط هو: -1.5mV
تغير على درجة الحرارة
للحصول على درجة حرارة 35 درجة مئوية ، يتغير الجهد المرجعي بمقدار -1.5mV. تقريبًا -1.5 / 35 = -0.043mV / ° C. لكن هذا يعتمد فقط على جهاز واحد وقياس واحد!

    التغيير هو -0.043mv / ° C

لزيادة درجة الحرارة من 25 درجة مئوية إلى 125 درجة مئوية (دلتا 100 درجة مئوية) يجب أن ينخفض ​​المرجع بنسبة 4.28mV. من حيث النسبة المئوية (4.28e-3 / 1.1) * 100 = 0.39٪.

للحصول على انخفاض في درجة الحرارة من 25 درجة مئوية إلى -40 درجة مئوية (دلتا -65 درجة مئوية) ، يجب زيادة المرجع بنسبة 2.79mV. من حيث النسبة المئوية (2.79e-3 / 1.1) * 65 = 0.16٪.

إذا كنت تفكر في ترانزستور بسيط يحتوي على تغيير في درجة الحرارة -2.1mV / ° C ثم لنفس دلتا درجة الحرارة ستحصل على تغيير جهد 201mV (تغيير بنسبة 18.2 ٪) لذلك فإن دائرة فجوة النطاق تعمل بشكل جيد!

القياس الثاني:
Vref هو 1.0665V.Temp 30 درجة مئوية
Vref هو رقاقة تسخين 1.0652kV إلى 75 درجة مئوية
السقوط هو: -1.3mV - هذه نتيجة مشابهة للنتيجة الأولى.

القياس الثالث:
Vref هو 1.0688V.Temp 30 درجة مئوية
Vref هي رقاقة تسخين 1.0683kV إلى 75 درجة مئوية
السقوط هو: -0.5mV - مختلف قليلاً ، ولكن في نفس النطاق.
استنتاج حول درجة الحرارة
أداء درجة الحرارة جيد مع تغيير مرجعي بنسبة 0.55٪ فقط على مدى درجة الحرارة الكامل (يقدر من 35 درجة مئوية إلى 75 درجة مئوية).

يتغير الجهد المرجعي بمقدار 0.003٪ لكل درجة مئوية (تقديري) [0.55٪ / 165 (تقديري)].
ملاحظة: يتمتع MAX6143 بأداء أفضل في درجات الحرارة بمقدار 1000 مرة عند 3ppm / ° C.

على مدى درجة الحرارة الكاملة (-40 درجة مئوية إلى + 125 درجة مئوية) ، سيتغير المرجع بحوالي 0.55 ٪ (0.39 ٪ + 0.16 ٪) = 0.55 ٪ (من 1V1) وهو أمر ليس سيئا للغاية.


يجب تغيير مرجع الجهد بمقدار + 2.79mV ~ -4.28mV (من 1V1) على درجات الحرارة هذه.
استنتاجات بشأن مرجع الجهد اردوينو
يمكن أن يكون للمرجع إزاحة كبيرة (بسبب عملية التصنيع) ± 9٪ وبالتالي قد تكون دقتها الأولية سيئة.
حساسية امدادات التيار الكهربائي: ~ -1.2mV لكل انخفاض امدادات فولت.
        هذا هو ~ -11 ٪ لكل انخفاض امدادات فولت.
درجة الحرارة الاستقرار: ~ 0.003 ٪ لكل درجة مئوية (المقدرة)
        ~ 0.55 ٪ على مدى درجة الحرارة الكاملة.
استقرار الجهد الناتج: ~ 0.31 ٪
للحصول على أفضل النتائج من مرجع جهد Arduino ، يجب معايرة ذلك. سيؤدي ذلك بعد ذلك إلى القضاء على الفولتية الناتجة عن عملية التصنيع وحساسية الفولتية في الإمداد (إذا ظل مصدر الجهد ثابتًا ، أي تم توفيره من خلال منظم).


هذا سيعطي ثباتًا عند 0.55 + 0.31 = ~ 0.86٪.
تذكر أن هذا تقدير يستند إلى عدد قليل جدًا من العينات ، لذلك قد تختلف نتائجك ، لكن ذلك يوضح أن المرجع يمكن أن يصبح أكثر استقرارًا إذا تمت معايرته. كما يوضح أن مرجع جهد Arduino قد يكون أكثر فائدة مما تتخيل.
كيفية قياس امدادات التيار الكهربائي
يمكنك تشغيل متحكم (ATMega328p - Uno و Nano) من 1V8 إلى 5V5. لا يستطيع المتحكم الدقيق اكتشاف هذه القيمة "الحقيقية" لجهد التزويد هذا إلا إذا كنت تستخدم جهد مرجعي معروف لمعرفة ذلك. هذا لأن ADC يقيس كل شيء بالنسبة إلى مرجع ، أي أن الجهد الكهربائي هو المرجع!

تحذير: في VCC = يمكن أن تكون الساعة 4.5V 20MHz وفي VCC = 2.7V يجب أن تكون سرعة الساعة <= 10MHz ، وبالنسبة لـ VCC = 1.8V يجب أن تكون سرعة الساعة <= 4MHz). راجع القسم "29.3 درجات السرعة" الذي يوضح أنه يجب تقليل تردد الساعة خطيًا مع تقليل جهد التيار الكهربائي.


إنها طريقة الفرز العكسي لقياس ADC. بدلاً من استخدام مرجع الجهد الكهربائي "كمرجع" ، يمكنك استخدام جهد التيار الكهربائي كمرجع و "مرجع الجهد الداخلي Arduino" باعتباره الكمية المراد قياسها.
يتم ذلك بهذه الطريقة لأنه لا يمكنك تحديد جهد Vcc كمدخل إلى ADC. راجع "مخطط كتلة ADC Mux" أدناه.
في هذه الحالة ، فإن الجهد الكهربائي "المرجعي" هو:
    VBIN = VCC / 1024 V / LSB [الأسرى (2،10) = 1024]
في المعادلة أعلاه VCC غير معروف (إلى متحكم!).
بقياس المرجع 1V1 ، والحصول على قيمة ADC لذلك ، يمكنك حل المعادلة
    VBIN = VREF / ADCVALUE

وبالتالي:
    VCC / 1024 = VREF / ADCVALUE
وبالتالي
    VCC = 1024 * (VREF / ADCVALUE)

و ...
    VCC = 1024 * (1V1 / ADCVALUE)
هنا 1024 هو الصحيح

(1024 هو مقسوم لـ VCC للجهد المرجعي).
نصيحة: نصيحة: للحصول على نتيجة أفضل قم بمعايرة مرجع جهد Arduino.
لمعرفة قيمة جهد التيار الكهربائي باستخدام مرجع جهد Arduino:
قم بتعيين مصدر مرجع ADC على Vcc.
(هذا خيار في ADC mux - انظر الرسم البياني أدناه)
تأخذ قراءة ADC من الجهد ذات فجوة الحزمة (مرجع الجهد اردوينو).
يمكنك استخدام المعادلات أعلاه لحساب جهد التيار الكهربائي أو اتباع المثال التالي.
مثال Sketch1 قياس الجهد العرض
ضع الكود التالي في المخطط داخل وظيفة setup ().

إذا قمت بمعايرة المرجع ، فقم بتغيير قيمة ...
arduinoADCcal
... لقيمتك المقاسة. تمثيل 1.1V هو 11000 وهو تمثيل عشري ثابت حيث يفترض أن تكون العلامة العشرية مكان واحد إلى اليمين. لذلك يمكنك التفكير في 11000 يمثل عدد 0.1mVs في الجهد الفعلي ، أي 11000 x 0.1e-3 = 1.1V
باستخدام ADS1115 أو الفولتميتر جيدة سوف تعطيك أرقام كافية. إذا كنت تستخدم DVM قياسي ، فستحصل على 3 أرقام فقط (على مدى 2 فولت) ، لذا اضبط آخر رقمين على الصفر.
البرنامج 
////////////////////////////////////////////////////////////////
void selfMeasureVcc(char *buf) {
uint8_t low,high; // ADC bytes.
// Default reference value. Set this to your measured reference voltage (or leave as is).
// The value uses an integer fixed point representation
// with the assumed decimal point one place to the right.
static unsigned long arduinoADCcal = 11000;

   if (strlen(buf)>1) {
      if (strlen(buf)<6)
         Serial.print(F("Not enough digits"));

      else if (strlen(buf)>6)
         Serial.print(F("Too many digits"));
      else
         arduinoADCcal = atoi(&buf[1]); // delay<nnn>

   } else if (strlen(buf)==1)
      Serial.print(F("Ref calibration value: ")); Serial.println(arduinoADCcal);


   // ADCSRA |= _BV(ADEN); // Enable ADC. Enabled by init() in Arduino code.

   ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); // Set VCC ref and band gap as input.
   delay(2); // Vref settling time delay

   // Throw away 1st result as datasheet says
   // After switch, ref may be invalid.
   // Datasheet: "24.5.2 ADC Voltage Reference".
   ADCSRA |= _BV(ADSC); // Start conversion
   while ( bit_is_set(ADCSRA, ADSC) ); // Wait for conversion complete.

   ADCSRA |= _BV(ADSC); // Start conversion
   while ( bit_is_set(ADCSRA, ADSC) ); // Wait for conversion complete.

   // ADCL must be read first, then ADCH, to ensure that the content
   // of the Data Registers belongs to the same conversion
   // Datasheet Section "24.2 Overview"
   low = ADCL;  // Read ADCL first which blocks ADCH updates.
   high = ADCH; // After reading ADCH both registers can be updated by the chip.

   long ADCValue = (high << 8) | low;
   Serial.print(F("ADC value of 1V1 ref: "));  Serial.println(ADCValue);

   #define BINS 1024L // VCC/1024 is the value of each LSB of the ADC.

   Serial.println( (arduinoADCcal)* BINS );
   Serial.println( ((arduinoADCcal * BINS)+5L) );
   Serial.println( ((arduinoADCcal * BINS)+5L) / 10L );

   // Note +5 = middle of LSB bin
   // Calculate Vcc (in mV); 1125300 = 1.1*1024*1000
   // Here ccal value is 1.1*10e4 so no need for *1000 and must divide by 10.

   uint32_t res = (((arduinoADCcal * BINS)+5L) / 10L) / ADCValue;

   // Calculate Vcc (in mV); 1126400 = 1.1*1024*1000
   // should be 1024 / ADCValue = 1125300L / ADCValue; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
   // internal1.1Ref = 1.1 * Vcc1 (per voltmeter) / Vcc2 (per readVcc() function)
   Serial.print(F("Measured (mV) ")); Serial.print(res); Serial.println(F(" mV"));
}

ترجمة البرنامج بالعربي
////////////////////////////////////////////////// //////////////
باطل selfMeasureVcc (char * buf) {
uint8_t منخفضة ، عالية ؛ // ADC بايت.
// القيمة المرجعية الافتراضية. اضبط هذا على الجهد المرجعي المقاس (أو اتركه كما هو).
// تستخدم القيمة عددًا صحيحًا من النقاط الثابتة
// مع العلامة العشرية المفترضة مكان واحد إلى اليمين.
ثابت غير موقعة طويلة arduinoADCcal = 11000 ؛

   if (strlen (buf)> 1) {
      إذا (strlen (buf) <6)
         Serial.print (F ("الأرقام غير كافية")) ؛

      وإلا إذا (strlen (buf)> 6)
         Serial.print (F ("عدد كبير جدًا من الأرقام")) ؛
      آخر
         arduinoADCcal = atoi (& buf [1])؛ // التأخير <nnn>

   } آخر إذا (strlen (buf) == 1)
      Serial.print (F ("Ref calibration value:"))؛ Serial.println (arduinoADCcal)؛


   // ADCSRA | = _BV (ADEN)؛ // تمكين ADC. يتم التمكين بواسطة init () في كود Arduino.

   ADMUX = _BV (REFS0) | _BV (MUX3) | _BV (MUX2) | _BV (MUX1) ؛ // تعيين المرجع VCC والفجوة الفرقة كمدخل.
   تأخير (2) ؛ // Vref تسوية تأخير الوقت

   // رمي النتيجة الأولى كما تقول ورقة البيانات
   // بعد التبديل ، قد يكون المرجع غير صالح.
   // ورقة البيانات: "24.5.2 ADC Voltage Reference".
   ADCSRA | = _BV (ADSC) ؛ // ابدأ التحويل
   بينما (bit_is_set (ADCSRA ، ADSC)) ؛ // انتظر التحويل كاملاً.

   ADCSRA | = _BV (ADSC) ؛ // ابدأ التحويل
   بينما (bit_is_set (ADCSRA ، ADSC)) ؛ // انتظر التحويل كاملاً.

   يجب قراءة // ADCL أولاً ، ثم ADCH ، لضمان أن المحتوى
   // سجلات البيانات ينتمي إلى نفس التحويل
   // قسم ورقة البيانات "24.2 نظرة عامة"
   منخفض = ADCL ؛ / / اقرأ ADCL أولاً الذي يمنع تحديثات ADCH.
   عالية = ADCH ؛ // بعد قراءة ADCH يمكن تحديث كلا السجلين بواسطة الشريحة.

   ADCValue طويل = (ارتفاع << 8) | منخفض؛
   Serial.print (F ("ADC value 1V1 ref:"))؛ Serial.println (ADCValue) ؛

   #define BINS 1024L // VCC / 1024 هي قيمة كل LSB من ADC.

   Serial.println ((arduinoADCcal) * BINS)؛
   Serial.println ((((arduinoADCcal * BINS) + 5L)) ؛
   Serial.println ((((arduinoADCcal * BINS) + 5L) / 10L)؛

   // ملاحظة +5 = منتصف صندوق LSB
   / / حساب Vcc (في بالسيارات) ؛ 1125300 = 1.1 * 1024 * 1000
   / / هنا تبلغ قيمة ccal 1.1 * 10e4 لذلك لا داعي لـ * 1000 ويجب قسمة على 10.

   uint32_t res = (((arduinoADCcal * BINS) + 5L) / 10L) / ADCValue؛

   / / حساب Vcc (في بالسيارات) ؛ 1126400 = 1.1 * 1024 * 1000
   يجب أن يكون // 1024 / ADCValue = 1125300L / ADCValue؛ / / حساب Vcc (في بالسيارات) ؛ 1125300 = 1.1 * 1023 * 1000
   // internal1.1Ref = 1.1 * Vcc1 (لكل الفولتميتر) / Vcc2 (لكل وظيفة readVcc ())
   Serial.print (F ("Measured (mV)")) ؛ Serial.print (res)؛ Serial.println (F ("mV")) ؛
}

اردوينو الجهد المرجعي بلوك المخططات
اردوينو أونو / نانو ADC مسك الغزال الرسم البياني
اردوينو adc mux لعملية مرجعية ذات فجوة الحزمة الجهد
Arduino Voltage Reference اردوينو الجهد المرجعي

المصدر: ورقة بيانات ATMega328P

مرجع الجهد الداخلي ATTiny85

يتم ترتيب إشارة الجهد ATTiny85 ، والتي يمكن اختيارها إما 1V1 أو 2.56V ، بشكل مختلف قليلاً في ADC. لا يمكن إعداد دبوس AREF إلا كمدخل (لا يوجد تبديل FET يربط mux المرجع الداخلي بدبوس AREF). لذلك لا يمكنك إعداد مرجع جهد Arduino للقياس عند طرف AREF.

لذلك لا يمكنك معايرة ذلك مباشرة. قد تفترض إما أن لها القيمة المعلنة أو تقيس عرض Vcc بدقة ثم تأخذ قراءة ADC (لكن تذكر أن ADC لديها أخطاءها الخاصة أيضًا!).

إحدى الطرق التي من شأنها القضاء على أخطاء ADC هي التغذية بجهد متغير لإدخال ADC - الذي تقيسه. ثم قارنها بالقراءة من مرجع الجهد (قراءة ADC). بمجرد أن تتطابق القراءتان مع الجهد الكهربي للإدخال ، سيكشف الجهد المرجعي الحقيقي لـ Arduino (بالطبع فقط إلى دقة 1LSB).
اردوينو ATTiny85 ADC Mux بلوك الرسم البياني
إشارة الجهد الداخلي ATtiny85
Arduino Voltage Reference اردوينو الجهد المرجعي

المصدر: ورقة بيانات ATTiny85

معايرة مرجع الجهد اردوينو
لمعايرة المرجع في Uno أو Nano ، عليك فقط تشغيل المرجع وقياس الجهد عند دبوس المرجع. تذكر فقط

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

تحذير: لا تقم بتوصيل أي إشارة جهد أخرى إلى دبوس VREF عند تشغيل مرجع الجهد Arduino (Uno / Nano) - لا توجد حماية ويمكن أن تتلف إما المرجع الخارجي أو الدائرة المرجعية الداخلية.


تشغيل المرجع يستخدم ببساطة كود Arduino التالي:

    التناظرية (الداخلي) ؛

ومع ذلك ، سوف تحتاج إلى تنشيط ADC لتمكين المرجع ، لذلك ستفعل قراءة بسيطة.

    analogRead (0) ؛ // يمكن أن يكون أي قناة

هذا بسبب الطريقة التي يتم بها كتابة التعليمات البرمجية "الأسلاك" - سجلات mux و REFS0 / 1 تتم كتابتها فقط قبل أمر قراءة ADC (داخل دالة analogRead () فقط).

لاردوينو ميجا يمكنك الاختيار من بين ما يلي:
    INTERNAL1V1
    INTERNAL2V56

ضع الكود أعلاه في جزء الإعداد () من Arduino Sketch.

الآن قم بتوصيل المتر المتعدد إلى دبوس VREF واكتب النتيجة (للاستخدام في التعليمات البرمجية الخاصة بك - انظر قياس الجهد الكهربائي للإمداد ، على وجه التحديد).

نصيحة: استخدم مقياس متعدد ، أو لمزيد من الأرقام ، استخدم ADS1115 في الوضع التفاضلي أو مقياس Fluke (مكلف للغاية).

نصيحة: أضف مكثفًا إلى دبوس Vref لتقليل الضوضاء الإضافية. يمكنني استخدام مكثف 100nF.

لضبط المرجع مرة أخرى لاستخدام العرض:

    التناظرية (DEFAULT) ؛

... مرة أخرى تليها ...

    analogRead (0) ؛ // يمكن أن يكون أي قناة

تم العثور على رمز العملية التناظرية هنا:
"C: / Program Files (x86) / Arduino/hardware/arduino/avr/cores/arduino/wiring_analog.c"

التعريفات (# تعريف) هنا:
C: / ملفات البرنامج (x86) / Arduino/hardware/arduino/avr/cores/arduino/Arduino.h

سيضع كود Arduino أعلاه (للاختيار المرجعي الداخلي) السجلات كما يلي (قسم ورقة البيانات: 24.9.1 سجل اختيار ADMUX ADC Multiplexer):

ADMUX بت 7 و 6 مجموعة عالية (REFS1 و REFS0).
بت ADMUX 3..0 لتعيين B1110.

ملاحظة: تنص ورقة البيانات على:
"قد تكون أول نتيجة لتحويل ADC بعد تبديل مصدر الجهد المرجعي غير دقيقة ، وينصح المستخدم بتجاهل هذه النتيجة."
(انظر قسم ورقة البيانات "24.5.2 ADC Voltage Reference").

لذلك يجب عليك التخلص من أول نتيجة ADC.

المصدر :

الجمعة، 28 فبراير 2020

مؤتمرات الروبوتات في دبي Robotics 2020 Conference in Dubai


مؤتمرات الروبوتات في دبي
مؤتمرات الروبوتات في دبي  Robotics 2020 Conference in Dubai

19-20 مارس 2020
ICASR 2020: مؤتمر التقدم المحرز في مؤتمر ثعبان الروبوتات ، دبي (19-20 مارس 2020)
ICEFM 2020: المجالات الكهرومغناطيسية في مؤتمر الميكاترونكس ، دبي (19-20 مارس 2020)
ICIRTCME 2020: الابتكارات والاتجاهات الحديثة والتحديات في مؤتمر هندسة الميكاترونكس ، دبي (19-20 مارس 2020)
ICMAEE 2020: مؤتمر الميكاترونيك وهندسة السيارات والبيئة ، دبي (19-20 مارس 2020)
ICMCEA 2020: مؤتمر هندسة وتطبيقات التحكم في الميكاترونيك ، دبي (19-20 مارس 2020)
ICMEAM 2020: مؤتمر الهندسة الميكانيكية والأتمتة والميكنة ، دبي (19-20 مارس 2020)
ICMEE 2020: مؤتمر الميكاترونيك والهندسة الكهرومغناطيسية ، دبي (19-20 مارس 2020)
ICMSRM 2020: مؤتمر النظم الميكانيكية والآليات الآلية ، دبي (19-20 مارس 2020)
ICPA 2020: مؤتمر المحركات البوليمرية ، دبي (19-20 مارس 2020)
ICRAMIR 2020: التطورات الحديثة في مؤتمر الميكاترونكس والروبوتات الذكية ، دبي (19-20 مارس 2020)
ICRDSR 2020: التطورات الأخيرة في مؤتمر ثعبان الروبوتات ، دبي (19-20 مارس 2020)
ICRIS 2020: مؤتمر الروبوتات وأجهزة الاستشعار الذكية ، دبي (19-20 مارس 2020)
ICRLAM 2020: مؤتمر أساليب تعلم الروبوت والتكيف ، دبي (19-20 مارس 2020)

 نظرة عامة على مؤتمر الروبوتات2020 Robotics 2020 Conference

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



تعد المؤتمرات الدولية حول الميكاترونيك والروبوتات (Robotics-2020) ، والتي ستعقد خلال الفترة من 26 إلى 27 فبراير 2020 في دبي ، الإمارات العربية المتحدة ، حدثًا حاسمًا ، يستقطب نية مشارك عالمي حول تبادل وتبادل واستكشاف طرق جديدة للروبوتات والذكاء الاصطناعي و البحوث ذات الصلة وآخر التطورات. سيكون للحدث 5-6 مستوى عالمي (فئة مستشهد بها بدرجة عالية) متحدثون عامون ، متحدثون رئيسيون أنشئون ، متحدثون نشطون مدعوون ومتحدثون مساهمون جدد. بالإضافة إلى ذلك ، ستكون مجموعة متنوعة من العروض التقديمية للملصقات إلى جانب ورش العمل والدورات الخاصة مهتمة بالجمهور.



الهدف من Robotics-2020 هو تشجيع البحث الجيد وتأثير العالم الحقيقي في جو من التعاون الدولي الحقيقي بين العلماء والمهندسين من خلال الجمع مرة أخرى بين الباحثين من الطراز العالمي والمجتمعات الدولية ورؤساء الصناعة لمناقشة أحدث التطورات والابتكارات في مجالات الميكاترونكس والروبوتات.



نأمل مخلصين أن يكون Robotics-2020 بمثابة منصة دولية للقاء الباحثين من جميع أنحاء العالم ، وتوسيع الاتصال المهني وخلق فرص جديدة ، بما في ذلك إقامة تعاون جديد.



نتطلع لرؤيتك في Robotics-2020 في دبي ، الإمارات العربية المتحدة.

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

الجمهور المستهدف:

• مدراء الشركات

• الباحثون

• الأساتذة

• محاضرون

• العلماء

• الطلاب

• المديرين وخبراء ذكاء الأعمال

• طلاب البحوث ومعاهد البحوث

• وكالة الإعلان والترويج التنفيذي

يسلط الضوء على الروبوتات 2020:

بدأ المؤتمر من قبل المنتدى الرئيسي ، ونحن نشعر بالكلام لنعرب عن شكرنا لجميع المتحدثين الرئيسيين ، الضيوف الكرام ، وحضور المؤتمر لجعل هذا الحدث مثمرًا.

تم عقد الاجتماع من خلال جلسات مختلفة ، عقدت خلالها مناقشات على المسارات العلمية الرئيسية التالية:

الميكاترونيك

·         علم الروبوتات

التفاعل بين الإنسان والآلة

·         أتمتة

دور الأتمتة في الروبوتات

·         أنظمة التحكم

· أنظمة التحكم الذكية والتحسين

الأنظمة الذكية

· معايير السلامة للروبوتات والأنظمة

أدوات التشغيل الآلي

تطبيقات الأتمتة

نظرية التحكم وتقنية التحسين

طرق التحكم

نشكر جميع الأعضاء الذين دعموا المؤتمر من خلال تعزيز المحادثات الصحية. يسرنا أن نعلن عن مؤتمرنا المقبل "المؤتمر الدولي حول الميكاترونيك والروبوتات" الذي سيعقد في دبي ، الإمارات العربية المتحدة خلال الفترة 26-27 فبراير 2020


     اتحاد جمعية الروبوتات الآسيوية

     جمعية تطوير الأتمتة (A3)

     الرابطة الأسترالية للروبوتات والأتمتة

     CLAWAR

EURON

المجتمع التفاعل الروبوت الإنسان

IEEE الروبوتات وأتمتة المجتمع

الجمعية الهندية للروبوتات تحت الماء (IURS)

الرابطة الدولية للتعرف على الأنماط (IAPR)

الاتحاد الدولي للروبوتات

الأساس الدولي لأبحاث الروبوتات

جمعية الشبكة العصبية الدولية (INNS)

جمعية كوريا للروبوتات

RoboNED

منصة روبوتية مفتوحة (ROP)

جمعية الروبوتات في الهند

جمعية الروبوتات في اليابان

جمعية الروبوتات في سنغافورة

جمعية سان فرانسيسكو للروبوتات الأمريكية (SFRSA)

     الجمعية الأمريكية للمهندسين الميكانيكيين

     معهد مهندسي الكهرباء والإلكترونيات

     جمعية مهندسي السيارات

     جمعية مهندسي التصنيع

الجمعة، 20 ديسمبر 2019

مشروع عرض الوقت علي شاشة LCD باستخدام الاردوينو

مشروع عرض الوقت علي شاشة ال سى دي باستخدام الاردوينو
تعمل الشاشة في احد الحالات التالية:
 استقبال الأوامر من الأردوينو وتنفيذها، مثلا : أمر تهيئة ومسح الشاشة :
سيكون بهذا الشكل 
lcd.begin(16,2);
lcd.clear();
استقبال المعلومات من الأردوينو وعرضها، مثلا : كتابة جملة معينة :
يمكنك استخدام هذا الامر بهذه الطريقة
lcd.print("Hello");

توصيل الدارة :

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

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

قم برفع الكود التالي على الأردوينو :
#include <LiquidCrystal.h>

#define HOUR_BUTTON 6
#define MINUTE_BUTTON 7
#define TICK_LENGTH 60000
#define CHECK_TIME 250


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

unsigned int minute = 0;
unsigned int hour = 01;
unsigned long previousMillis = 0;
unsigned char am = 1;

void setup() {
  // put your setup code here, to run once:
  lcd.begin(16, 2);
  pinMode(HOUR_BUTTON, INPUT);
  pinMode(MINUTE_BUTTON, INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  checkTick();
  lcd.setCursor(0,0);
  lcd.print("Time:");
  lcd.setCursor(6,1);
  lcd.print(hour);
  lcd.print(":");
  lcd.print(minute);
  if(am == 1) lcd.print(" AM");
  else lcd.print(" PM");
}

void checkTick() {
   unsigned long currentMillis = millis();
   
   if ((unsigned long)(currentMillis - previousMillis) >= TICK_LENGTH) {
      tick();
      previousMillis = currentMillis;
   }
   if((unsigned long)(currentMillis - previousMillis) >= CHECK_TIME){
      readHourButton();
      readMinuteButton();
   }
}

void tick() {
  minuteUp();
}

  
void readHourButton() {
  if (digitalRead(HOUR_BUTTON) == HIGH) {
    delay(200);
    hourUp();
  }
}

void readMinuteButton() {
  if (digitalRead(MINUTE_BUTTON) == HIGH) {
    delay(200);
    minuteUp();
  }
}

void hourUp() {
  hour = hour + 1;
  if (hour > 12) {
    lcd.clear();
    hour = 1;
    if(am == 1) am = 0;
    else am = 1;
  }
}

void minuteUp() {
  minute = minute + 1;
  if (minute > 59) {
    minute = 0;
    hourUp();
  }
}

شرح الكود :

في البداية نقوم بإضافة مكتبة شاشة الـ LCD وتسمية منافذ الأردوينو المستخدمة مع مفاتيح الضبط :
#include <LiquidCrystal.h>

#define HOUR_BUTTON 6
#define MINUTE_BUTTON 7
ثم نقوم نقوم بالإعلان عن بعض الثوابت التي سيتم استخدامها لاحقا :
#define TICK_LENGTH 60000
#define CHECK_TIME 250
بعد ذلك نقوم بالإعلان عن بعض المتغيرات. يستخدم المتغير minute لحفظ الدقائق. والمتغير hour لحفظ الساعات. والمتغير am لتسجيل ما إذا كان التوقيت صباحا أم مساءاً. وسيتم تسجيل الوقت الخاص بأخر مرة تم حساب التوقيت في المتغير previousMillis .
unsigned int minute = 0;
unsigned int hour = 01;
unsigned long previousMillis = 0;
unsigned char am = 1;
في الدالة ()setup قمنا بضبط الاعدادات اللازمة للمشروع مثل ضبط ارجل الاردوينو كمخارج للمفاتيح وتشغيل الشاشة LCD :
void setup() {
  // put your setup code here, to run once:
  lcd.begin(16, 2);
  pinMode(HOUR_BUTTON, INPUT);
  pinMode(MINUTE_BUTTON, INPUT);
}
في الدلة ()loop، نقوم بحساب عدد الثوان التي مرت، فإذا كانت 60 ثانية نقوم بزيادة عدد الدقائق في المتغير minute. كما نقوم بإختبار الدقائق التي مرت، فعند مرور 60 دقيقة نقوم بزيادة عدد الساعات في المتغير hour. ثم نقوم بالنهاية بعرض الدقائق والساعات على شاشة الـ LCD.
أيضا اثناء الإختبار نقوم بإختبار المفاتيح إذا ما تم الضغط عليها ام لا عبر استدعاء الدالة ()checkTick . فإذا تم الضغط على مفتاح الدقائق نقوم بزيادة عدد الدقائق في المتغير minute، ويعمل بنفس الطريقة عند الضغط على مفتاح الساعات.
void loop() {
  // put your main code here, to run repeatedly:
  checkTick();
  lcd.setCursor(0,0);
  lcd.print("Time:");
  lcd.setCursor(6,1);
  lcd.print(hour);
  lcd.print(":");
  lcd.print(minute);
  if(am == 1) lcd.print(" AM");
  else lcd.print(" PM");
}
سنقوم بعمل عدد من الدوال المستخدمة في المشروع :
الدالة ()checkTick ، في كل مرة يتم استدعائها تقوم بحفظ الوقت الذي مضى منذ عمل Reset للأردوينو. ثم تتم مقارنة الوقت الحالي بقيمة مسبقة فإذا اصبح الفارق بين التوقيتين يتعدى الـ TICK_LENGTH الذي تم تحديده في أول البرنامج، فهذا يعني انه قد مرة دقيقة فنقوم بزيادتها بإستخدام الدالة ()tick. ثم نقوم بتسجيل هذا التوقيت لإستخدامه مرة ارخى لمعرفة هل مر دقيقة أخرى ام لا.
 unsigned long currentMillis = millis();
   
   if ((unsigned long)(currentMillis - previousMillis) >= TICK_LENGTH) {
      tick();
      previousMillis = currentMillis;
   }
ايضا يتم التحقق ما إذا تعدى الفارق في التوقيت قيمة CHECK_TIME ، فعندها نقوم بقراءة المفاتيح المستخدمة في تعديل التوقيت.
   if((unsigned long)(currentMillis - previousMillis) >= CHECK_TIME){
      readHourButton();
      readMinuteButton();
   }
الدالة ()tick، تقوم بإستدعاء الدالة ()minuteUp، والتي بدورها تقوم بزيادة عداد الدقائق.
void tick() {
  minuteUp();
}

الدالة ()readHourtButton تقوم بقراءة المفتاح الخاص بتعديل خانة الساعات فإذا تم الضغط عليه تقوم بتشغيل الدالة ()hourUp التي تقوم بزيادة عداد الساعات.
void readHourButton() {
  if (digitalRead(HOUR_BUTTON) == HIGH) {
    delay(200);
    hourUp();
  }
}
الدالة readMinuteButton() تقوم بقراءة المفتاح الخاص بتعديل خانة الدقائق فإذا تم الضغط عليه تقوم بإستدعاء دالة ()minuteUp التي تقوم بزيادة عداد الدقائق.
void readMinuteButton() {
  if (digitalRead(MINUTE_BUTTON) == HIGH) {
    delay(200);
    minuteUp();
  }
}
الدالة hourUp() في كل مرة يتم إستعداء هذه الدالة تقوم بزيادة عداد الساعات بمقدار واحد وعمل اختبار اذا كان التوقيت تغير من الصباح إلى المساء .
void hourUp() {
  hour = hour + 1;
  if (hour > 12) {
    lcd.clear();
    hour = 1;
    if(am == 1) am = 0;
    else am = 1;
  }
}
الداله minuteUp() في كل مرة يتم إستدعائها تقوم بزيادة عداد الدقائق بمقدار واحد وعمل اختبار اذا وصل عداد الدقائق الى 60 تقوم بتصفير عداد الدقائق و زيادة عداد الساعات بمقدار واحد .
void minuteUp() {
  minute = minute + 1;
  if (minute > 59) {
    minute = 0;
    hourUp();
  }
}

الخميس، 19 ديسمبر 2019

مشروع قياس و قراءة درجة حرارة الطقس عبر شاشة lcd باستخدام الاردوينو Arduano

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

الشاشة 

تعمل الشاشة في احد الحالات التالية:
استقبال أمر من الأردوينو وتنفيذه، على سبيل المثال : أمر التهيئة ومسح الشاشة:
lcd.begin(16,2);
lcd.clear();
استقبال معلومات من الأردوينو وعرضها، على سبيل المثال : كتابة جملة معينة :
lcd.print("Hello");
 للإطلاع على المزيد حول شاشة الـ LCD قم بالإطلاع على درس التحكم بشاشة LCD

حساس الحرارة LM35


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

توصيله في الدارة :

مُخرج هذا الحساس يكون قيمة تناظرية (Analog) ، اي نحتاج إلى توصيله على أحد المنافذ التناظرية (Analog) في الأردوينو. الأطراف التناظرية في الأردوينو من A0 إلى A5 .
جهاز لقياس و التحكم فى درجة الحرارة باستخدام LM35
الطرف (بداية من اليسار)التوصيل
1Vcc
2Output To Arduino
3Ground

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

شرح الدارة

قم بتوصيل الدارة كما هو موضح بالصورة التالية :
جهاز لقياس و التحكم فى درجة الحرارة باستخدام LM35
سيقوم الحساس LM35 بقياس درجة الحرارة بإستمرار وعرضها على شاشة الـ LCD وبإستخدام مفتاح التحكم (Push Buttons) يمكننا التحكم في رفع أو خفض درجة الحرارة المطلوبة في المكان.

الكود البرمجي :

قم بكتابة الكود التالي ورفعه على الأردوينو :
#include <LiquidCrystal.h>
#define tempPin A0 
#define tup 10 
#define tdown 9
 
float temp; 
int defC = 23; 
int upstate = 0; 
int downstate = 0; 

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

void setup() {
  lcd.begin(16, 2); 
  lcd.setCursor(0, 0); 
  lcd.print("Config.."); 
  delay(900);
  lcd.clear(); 
  pinMode(tup, INPUT); 
  pinMode(tdown, INPUT); 
}

void loop() {
  upstate = digitalRead(tup); 
  downstate = digitalRead(tdown); 
  int tvalue = analogRead(tempPin);  
  
  if (upstate == HIGH) { 
    defC = defC + 1; 
  }
  if (downstate == HIGH) { 
    defC = defC - 1; 
  }
  temp = tvalue * 0.48828;

  lcd.setCursor(0, 0);
  lcd.print("Current ");
  lcd.print (temp);  
  lcd.print ('C');
  
  lcd.setCursor (0, 1); 
  lcd.print ("Desired "); 
  lcd.print (defC);
  lcd.print ('C');

  delay(200);
}

شرح الكود :

في البداية، نقوم بإضافة المكتبة الخاصة بشاشة الـ LCD :
#include <LiquidCrystal.h>
ثم نقوم بتسمية منافذ الأردوينو المستخدمة في المشروع :
#define tempPin A0 
#define tup 10 
#define tdown 9
بعد ذلك، نقوم بالإعلان عن المتغيرات التي سيتم استخدامها في البرنامج لتسجيل قيم درجات الحرارة :
float temp; 
int defC = 23; 
int upstate = 0; 
int downstate = 0;
يتم تسجيل درجة الحرارة الناتجة من حساس الحرارة على المتغير temp. واستخدام المتغير defC لتسجيل درجة الحرارة المطلوبة. والمتغير upstate لتسجيل حالة المفتاح الأول الخاص برفع درجة الحرارة المطلوبة. والمتغير downstate لتسجيل حالة المفتاح الثاني الخاص بخفض درجة الحرارة المطلوبة.
ثم نقوم بإنشاء المتغير الخاص بشاشة الـ LCD وتحديد الأرجل التي سيتم توصيلها مع الأردوينو :
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
في الدالة ()setup، نقوم بضبط الإعدادات اللازمة، كإعدادات شاشة الـ LCD وضبط المفاتيح (Push Buttons) كمخرج :
void setup() {
  lcd.begin(16, 2); 
  lcd.setCursor(0, 0); 
  lcd.print("Config.."); 
  delay(900);
  lcd.clear(); 
  pinMode(tup, INPUT); 
  pinMode(tdown, INPUT); 
}
في الدالة ()loop، نقوم بقراءة المفاتيح (Push Buttons) ، وقراءة قيمة الجهد الناتج من الحساس :
  upstate = digitalRead(tup); 
  downstate = digitalRead(tdown); 
  int tvalue = analogRead(tempPin);
ثم نقوم بإختبار ما إذا تم الضغط على المفاتيح. فعند الضغط على مفتاح زيادة درجة الحرارة المطلوبة نقوم بإضافة 1 إلى درجة الحرارة المسجلة في المتغير defC. ويتم العكس عند الضغط على مفتاح خفض درجة الحرارة المطلوبة :
   if (upstate == HIGH) { 
    defC = defC + 1; 
  }
  if (downstate == HIGH) { 
    defC = defC - 1; 
  }