جدول المحتويات:

IOT123 - تعقب الطاقة الشمسية - وحدة تحكم: 8 خطوات
IOT123 - تعقب الطاقة الشمسية - وحدة تحكم: 8 خطوات

فيديو: IOT123 - تعقب الطاقة الشمسية - وحدة تحكم: 8 خطوات

فيديو: IOT123 - تعقب الطاقة الشمسية - وحدة تحكم: 8 خطوات
فيديو: شرح طريقة برمجة لوحة التحكم السخان الشمسي TK-7 2024, ديسمبر
Anonim
Image
Image
IOT123 - تعقب الطاقة الشمسية - وحدة تحكم
IOT123 - تعقب الطاقة الشمسية - وحدة تحكم
IOT123 - تعقب الطاقة الشمسية - وحدة تحكم
IOT123 - تعقب الطاقة الشمسية - وحدة تحكم

هذا امتداد لـ Instructable

IOT123 - تعقب الطاقة الشمسية - إمالة / عمود ، إطار لوحة ، جهاز LDR MOUNTS RIG. نركز هنا على وحدة التحكم في الماكينات وأجهزة استشعار موضع الشمس. من المهم الإشارة إلى أن هذا التصميم يفترض أنه سيتم استخدام وحدتي MCU: واحدة (3.3 فولت 8 ميجاهرتز Arduino Pro Mini) لتعقب الطاقة الشمسية ، وواحدة MCU مستقلة لأجهزة الاستشعار / الممثلين.

هذا هو الإصدار 0.3

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

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

ماذا يشمل هذا:

  1. استخدم LDRs من Instructable الأصلي لاستشعار موقع الشموس التقريبي.
  2. حرك الماكينات لمواجهة الشمس.
  3. خيارات لحساسية الحركات.
  4. خيارات لحجم الخطوة عند الانتقال إلى الشمس.
  5. خيارات للقيود الزاوية المستخدمة في الماكينات.
  6. خيارات لتأخير الحركات.
  7. واجهة I2C لضبط / الحصول على القيم بين MCUs.

  8. النوم العميق بين الحركات.

ما لا يشمله هذا (وسيتم تناوله حسب ما يسمح به الوقت):

  1. فقط باستخدام الطاقة خلال ساعات النهار.
  2. تذكر موقف الفجر والذهاب إلى هناك عند الغسق.
  3. إزالة المنظم من MCU.
  4. تعطيل LED (s) على MCU.
  5. إعادة توجيه الطاقة من خلال VCC بدلاً من RAW.
  6. توفير حلول للوميض بدون طاقة منظمة من USB إلى محول Serial TTL.
  7. مراقبة جهد البطارية.

التاريخ

20 ديسمبر 2017 كود V0.1

الإصدار الأولي يتتبع مصدر الضوء ، دائمًا قيد التشغيل ، بدون شحن

7 يناير 2018 كود V0.2

  • تغييرات الأجهزة

    • أضف دبابيس I2C
    • إضافة التبديل إلى أجهزة GNDs
    • ملصق مطبوع على لوحة صندوق التحكم
  • تغييرات البرامج

    • قراءة التكوين من EEPROM
    • دعم ناقل I2C كعبد لـ MCU آخر (3.3 فولت)
    • ضبط التكوين عبر I2C
    • تعيين ممكّن عبر I2C
    • احصل على التكوين عبر I2C
    • احصل على خصائص وقت التشغيل عبر I2C (ممكّن حاليًا ، وشدة الإضاءة الحالية)

    • إزالة التسجيل التسلسلي (أثر على قيم I2C)

19 يناير 2018 كود V0.3

  • المعدات

    تم تحديث التسمية. يتم استخدام مفتاح التبديل الآن لاختيار وضع CONFIG أو TRACK

  • البرمجيات

    • I2C تستخدم فقط للتكوين
    • ينتظر جهاز التحكم 5 ثوانٍ قبل بدء التتبع ، مما يسمح بتحريك اليدين
    • لاستخدام تكوين I2C ، يجب أن يكون SPDT في CONFIG أثناء تمهيد الوحدة
    • بين حركة التتبع ، تكون الوحدة في وضع السكون العميق لقيمة التكوين SLEEP MINUTES (افتراضي 20 دقيقة).

الخطوة 1: المواد والأدوات

المواد والأدوات
المواد والأدوات
المواد والأدوات
المواد والأدوات
المواد والأدوات
المواد والأدوات

توجد الآن قائمة كاملة بالمواد والمصادر.

  1. أجزاء مطبوعة ثلاثية الأبعاد.
  2. Arduino Pro Mini 3.3 فولت 8 ميجا هرتز
  3. 1 من 4x6 سم مزدوج الجانب النموذج الأولي ثنائي الفينيل متعدد الكلور لوحة الدوائر المطبوعة العالمية (تقطع إلى نصفين)
  4. 1 من 40P رأس ذكر (يتم قصه حسب الحجم).
  5. 1 من 40P رأس أنثى (ليتم قصها حسب الحجم).
  6. 4 قبالة 10K 1 / 4W ترميمات.
  7. وصل الأسلاك.
  8. اللحيم والحديد.
  9. 20 قبالة مسامير 4G x 6mm الفولاذ المقاوم للصدأ رئيس التنصت الذاتي.
  10. 4 قبالة 4G x 6mm الفولاذ المقاوم للصدأ مسامير التنصت الذاتي غاطسة.
  11. 1 إيقاف 3.7 فولت بطارية LiPo وحاملها (تنتهي في موصلات دوبونت 2P).
  12. 1 قبالة 2P الذكور رأس الزاوية اليمنى
  13. 1 قبالة مفتاح SPDT 3 دبوس 2.54mm الملعب
  14. غراء Cyanoacrylate قوي
  15. موصلات دوبونت أنثى رأس 1P (1 من اللون الأزرق ، 1 من الأخضر).

الخطوة 2: تجميع الدائرة

تجميع الدائرة
تجميع الدائرة
تجميع الدائرة
تجميع الدائرة
تجميع الدائرة
تجميع الدائرة

لا تحتوي الدائرة حاليًا على دائرة مقسم الجهد (فولت متر).

  1. قم بقص لوحة الدوائر المطبوعة الشاملة للنموذج الأولي مقاس 4 × 6 سم من ثنائي الفينيل متعدد الكلور إلى النصف عبر المحور الطويل.
  2. قطع رأس الذكور 40P إلى قطع:

    1. 2 من 12 P.
    2. 3 من 3 P.
    3. 6 قبالة 2P.
  3. قطع رأس الأنثى 40P إلى قطع:

    1. 2 من 12 P.
    2. 1 من 6 P.
  4. اللحيم 2 من 12 رأس أنثى كما هو مبين.
  5. ألصق الفاصل الذي تمت إزالته من رأس ذكر 3P (إضافي) على الجانب السفلي من مفتاح SPDT باستخدام غراء Cyanoacrylate
  6. على الجانب الآخر ، ضع ثم اللحام 6 من 2P ، 2 من 3Pmale ومفتاح SPDT كما هو موضح.
  7. لحام 4 من 10K مقاومات (A ، B ، C ، D أسود) عبر الرصاص إلى رأس دبوس GND (# 2 أسود) وإلى دبابيس رأس A0 - A3 (# 5 ، # 6 ، # 7 ، # 8) ثم من خلال الفتحة (أصفر) كما هو موضح (3 صور + 1 رسم بياني).
  8. تتبع 3.3 فولت من دبابيس لحام LDR PINS # 4 و # 6 و # 8 و # 10 وخيط على الرغم من الفتحة إلى رأس feamale دبوس VCC (أخضر).
  9. تتبع 3.3 فولت على جانب الرأس الأنثوي كما هو موضح (أحمر) لحام إلى PINS # 1 ، # 12 ، # 15.
  10. 3.3 فولت من خلال الفتحة ، دبوس رأس RAW الملحوم على الجانب (أحمر) رقم 1.
  11. تتبع الخطاف البرتقالي من رقم التعريف الشخصي 11 من خلال الفتحة إلى دبوس أنثى اللحام على الجانب الآخر كما هو موضح.
  12. تتبع سلك التوصيل الأزرق واللحام من # 20 إلى # 30 ومن # 31 إلى # 13 و # 16.
  13. Solder Female Header PIN # 11 إلى Male Header PIN # 11 من خلال الفتحة.
  14. قم بإعداد موصلين دوبونت بطول 30 ملم مع رأس 1P أنثى (1 من الأزرق ، 1 من الأخضر). الشريط والقصدير نهاية أخرى.
  15. سلك اللحام الأزرق Dupont إلى # 28 ؛ سلك لحام دوبونت الأخضر إلى رقم 29.
  16. في الجزء العلوي من Arduino ، قم بإصلاح الرأس الأنثوي 6P ثم اللحام.
  17. في الجزء العلوي من Arduino ، قم بإصلاح الرأس الأنثوي ذو الزاوية اليمنى 2P int # 29 و # 30 ثم اللحام.

  18. على الجانب السفلي من Arduino ، قم بإصلاح 2 من 12P و 1 من دبابيس الذكور 3P ثم اللحام.
  19. أدخل دبابيس Arduino male 12P في رؤوس الإناث PCB 12P.

الخطوة 3: تفليش MCU

وامض MCU
وامض MCU
وامض MCU
وامض MCU
وامض MCU
وامض MCU

يتم وميض Arduino Pro Mini بشكل ملائم باستخدام محول FTDI232 USB إلى TTL باستخدام رأس أنثى 6P. انظر الصورة أعلاه لمحاذاة اللوحين.

تأكد من اختيار الإعداد 3.3 فولت على FTDI232 الخاص بك. اتبع التعليمات الواردة هنا باستخدام الكود أدناه (استخدم رابط GIST).

يجب تثبيت مكتبة الطاقة المنخفضة (المرفقة و

بمجرد تثبيت Arduino Pro Mini + PCB في الغلاف ، لا يزال من الممكن وميضه أثناء تعرض دبابيس الرأس. ما عليك سوى فصل وحدة التحكم عن إطار اللوحة وكشف الرأس.

إمالة جهاز تعقب الطاقة الشمسية مع تكوين I2C / EEPROM ودورة النوم بين الحركات. تقل دقة مدة دورة النوم مع زيادة المدة ، ولكنها كافية لهذا الغرض

/*
* معدل من كود
* بقلم ماتياس ليروي
*
* تعديلات V0.2
** I2C SET GET
** EEPROM SET GET
** قم بإزالة الإخراج التسلسلي - متأثر I2C
** تمكين / تعطيل التتبع
** انقل الخدمات إلى الحدود عبر I2C
** اقرأ كثافة AVG الحالية عبر I2C
* تعديلات V0.3
** التبديل إلى وضعين - المسار (لا يوجد I2C) والتكوين (يستخدم I2C)
** النوم في وضع المسار (دقة منخفضة جدًا بسبب 8 كتل ثانية)
** فك / إرفاق خدمات عند النوم / الاستيقاظ (يستخدم الترانزستور في النهاية)
** قم بإزالة الموضع الأولي القابل للتهيئة (احتياطي)
** قم بإزالة الثواني التنشيطية القابلة للتهيئة (احتياطي)
** قم بإزالة قابل للتهيئة / تمكين / تعطيل (احتياطي)
** قم بإزالة أداة التتبع القابلة للتهيئة التي تم تمكينها (استخدم مفتاح الأجهزة)
** قم بإزالة مقياس الجهد الكهربائي - ستستخدم مكون I2C منفصل
** أضف التسجيل التسلسلي عند عدم استخدام I2C
*/
#يشمل
#يشمل
#يشمل
#يشمل
#يشمل
# حدد EEPROM_VERSION1
# حدد I2C_MSG_IN_SIZE3
#definePIN_LDR_TL A0
#definePIN_LDR_TR A1
#definePIN_LDR_BR A3
#definePIN_LDR_BL A2
# حدد PIN_SERVO_V11
# حدد PIN_SERVO_H5
# حدد IDX_I2C_ADDR0
# حدد IDX_V_ANGLE_MIN1
# حدد IDX_V_ANGLE_MAX2
# حدد IDX_V_SENSITIVITY3
# حدد معرف X_V_STEP4
# حدد IDX_H_ANGLE_MIN5
# حدد IDX_H_ANGLE_MAX6
# تعريف IDX_H_SENSITIVITY7
# تعريف IDX_H_STEP8
# حدد IDX_SLEEP_MINUTES9
# حدد IDX_V_DAWN_ANGLE10
# حدد IDX_H_DAWN_ANGLE11
# selectIDX_DAWN_INTENSITY12 // متوسط كل LDRS
# selectIDX_DUSK_INTENSITY13 // متوسط كل LDRS
# حدد IDX_END_EEPROM_SET14
# selectIDX_CURRENT_INTENSITY15 // متوسط كل LDRS - يُستخدم لحساب IDX_DAWN_INTENSITY الضوء غير المباشر المحيط
# حدد IDX_END_VALUES_GET16
# selectIDX_SIGN_117
# تعريف IDX_SIGN_218
# تعريف IDX_SIGN_319
مؤازرة _servoH ؛
مؤازرة _servoV ؛
بايت _i2cVals [20] = {10، 10، 170، 20، 5، 10، 170، 20، 5، 20، 40، 10، 30، 40، 0، 0، 0، 0، 0، 0} ؛
int _servoLoopDelay = 10 ؛
int _slowingDelay = 0 ؛
int _angleH = 90 ؛
int _angleV = 90 ؛
int _averageTop = 0 ؛
int _averageRight = 0 ؛
int _averageBottom = 0 ؛
int _averageLeft = 0 ؛
البايت _i2cResponse = 0 ؛
bool _inConfigMode = خطأ ؛
الإعداد باطل()
{
Serial.begin (115200) ؛
getFromEeprom () ،
إذا (inConfigMode ()) {
Serial.println ("وضع التكوين") ؛
Serial.print ("عنوان I2C:") ؛
Serial.println (_i2cVals [IDX_I2C_ADDR]) ،
Wire.begin (_i2cVals [IDX_I2C_ADDR]) ؛
Wire.onReceive (استقبال الحدث) ؛
Wire.onRequest (requestEvent) ؛
}آخر{
Serial.println ("وضع التتبع") ؛
تأخير (5000) ؛ // حان الوقت لإبعاد اليدين عن الطريق في حالة توصيل البطارية وما إلى ذلك.
}
}
حلقة فارغة()
{
getLightValues () ،
إذا (! _inConfigMode) {
// المهام: قم بتشغيل مفتاح الترانزستور
_servoH.attach (PIN_SERVO_H) ؛
_servoV.attach (PIN_SERVO_V) ؛
لـ (int i = 0 ؛ i <20 ؛ i ++) {
إذا (أنا! = 0) {
getLightValues () ،
}
moveServos () ؛
}
تأخير (500) ؛
_servoH.detach () ،
_servoV.detach () ،
// المهام: قم بإيقاف تشغيل مفتاح الترانزستور
تأخير (500) ؛
asleepFor ((_ i2cVals [IDX_SLEEP_MINUTES] * 60) / 8) ؛
}
}
//---------------------------------الوضع الحالي
boolinConfigMode () {
pinMode (PIN_SERVO_H ، INPUT) ؛
_inConfigMode = digitalRead (PIN_SERVO_H) == 1 ؛
إرجاع _inConfigMode ؛
}
// --------------------------------- إيبروم
voidgetFromEeprom () {
لو(
EEPROM.read (IDX_SIGN_1)! = 'S' ||
EEPROM.read (IDX_SIGN_2)! = 'T' ||
EEPROM.read (IDX_SIGN_3)! = EEPROM_VERSION
) EEPROM_write_default_configuration () ،
EEPROM_read_configuration () ،
}
voidEEPROM_write_default_configuration () {
Serial.println ("EEPROM_write_default_configuration") ؛
لـ (int i = 0 ؛ i <IDX_END_EEPROM_SET ؛ i ++) {
EEPROM.update (i، _i2cVals ) ،
}
EEPROM.update (IDX_SIGN_1، "S") ،
EEPROM.update (IDX_SIGN_2، "T") ،
EEPROM.update (IDX_SIGN_3، EEPROM_VERSION) ،
}
voidEEPROM_read_configuration () {
Serial.println ("EEPROM_read_configuration") ؛
لـ (int i = 0 ؛ i <IDX_END_EEPROM_SET ؛ i ++) {
_i2cVals = EEPROM.read (i) ،
//Serial.println(String(i) + "=" + _i2cVals ) ؛
}
}
// --------------------------------- I2C
voidreceiveEvent (عدد صحيح) {
إذا (العد == I2C_MSG_IN_SIZE)
{
char cmd = Wire.read () ؛
فهرس البايت = Wire.read () ؛
قيمة البايت = Wire.read () ؛
مفتاح (cmd) {
case'G ':
إذا (الفهرس <IDX_END_VALUES_GET) {
_i2cResponse = _i2cVals [فهرس] ،
}
استراحة؛
حالات':
إذا (الفهرس <IDX_END_EEPROM_SET) {
_i2cVals [الفهرس] = القيمة ؛
EEPROM.update (index، _i2cVals [index]) ؛
}
استراحة؛
إفتراضي:
إرجاع؛
}
}
}
طلب باطل ()
{
Wire.write (_i2cResponse) ؛
}
// --------------------------------- LDRs
voidgetLightValues () {
int valueTopLeft = analogRead (PIN_LDR_TL) ،
int valueTopRight = analogRead (PIN_LDR_TR) ،
القيمة int valueBottomRight = analogRead (PIN_LDR_BR) ،
القيمة int valueBottomLeft = analogRead (PIN_LDR_BL) ،
_averageTop = (valueTopLeft + valueTopRight) / 2 ؛
_averageRight = (valueTopRight + valueBottomRight) / 2 ؛
_averageBottom = (valueBottomRight + valueBottomLeft) / 2 ؛
_averageLeft = (valueBottomLeft + valueTopLeft) / 2 ؛
متوسط الكثافة int = (valueTopLeft + valueTopRight + valueBottomRight + valueBottomLeft) / 4 ؛
_i2cVals [IDX_CURRENT_INTENSITY] = خريطة (متوسط الكثافة ، 0 ، 1024 ، 0 ، 255) ؛
}
// --------------------------------- الخوادم
voidmoveServos () {
Serial.println ("moveServos") ؛
if ((_averageLeft-_averageRight)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH-_i2cVals [IDX_H_STEP])> _ i2cVals [IDX_H_ANGLE_MIN]) {
// يتجه يسارًا
Serial.println ("moveServos تتجه يسارًا") ؛
تأخير (_slowingDelay) ؛
لـ (int i = 0 ؛ i <_i2cVals [IDX_H_STEP] ؛ i ++) {
_servoH.write (_angleH--) ؛
تأخير (_servoLoopDelay) ؛
}
}
elseif ((_averageRight-_averageLeft)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH + _i2cVals [IDX_H_STEP]) <_ i2cVals [IDX_H_ANGLE_MAX]) {
// يسير يمينًا
Serial.println ("moveServos تتجه يسارًا") ؛
تأخير (_slowingDelay) ؛
لـ (int i = 0 ؛ i <_i2cVals [IDX_H_STEP] ؛ i ++) {
_servoH.write (_angleH ++) ؛
تأخير (_servoLoopDelay) ؛
}
}
آخر {
// لا أفعل شئ
Serial.println ("moveServos لا تفعل شيئًا")؛
تأخير (_slowingDelay) ؛
}
if ((_averageTop-_averageBottom)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV + _i2cVals [IDX_V_STEP]) <_ i2cVals [IDX_V_ANGLE_MAX]) {
// ذاهبين للأعلى
Serial.println ("moveServos ترتفع") ؛
تأخير (_slowingDelay) ؛
لـ (int i = 0 ؛ i <_i2cVals [IDX_V_STEP] ؛ i ++) {
_servoV.write (_angleV ++) ؛
تأخير (_servoLoopDelay) ؛
}
}
elseif ((_averageBottom-_averageTop)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV-_i2cVals [IDX_V_STEP])> _ i2cVals [IDX_V_ANGLE_MIN]) {
// ذاهب إلى الأسفل
Serial.println ("moveServos تتجه لأسفل") ؛
تأخير (_slowingDelay) ؛
لـ (int i = 0 ؛ i <_i2cVals [IDX_V_STEP] ؛ i ++) {
_servoV.write (_angleV--) ؛
تأخير (_servoLoopDelay) ؛
}
}
آخر {
Serial.println ("moveServos لا تفعل شيئًا")؛
تأخير (_slowingDelay) ؛
}
}
//---------------------------------نايم
voidasleepFor (مقاطع ثمانية ثوانٍ غير موقعة) {
Serial.println ("asleepFor") ؛
لـ (بدون إشارة sleepCounter = eightSecondSegments ؛ sleepCounter> 0 ؛ sleepCounter--)
{
LowPower.powerDown (SLEEP_8S، ADC_OFF، BOD_OFF) ؛
}
}

عرض rawtilt_pan_tracker_0.3.ino مستضاف مع ❤ بواسطة GitHub

الخطوة 4: تجميع غلاف الدائرة

تجميع غلاف الدائرة
تجميع غلاف الدائرة
تجميع غلاف الدائرة
تجميع غلاف الدائرة
تجميع غلاف الدائرة
تجميع غلاف الدائرة
  1. تأكد من إدخال Ardiuno Pro Mini في الرؤوس الموجودة على PCB.
  2. أدخل قاعدة صندوق وحدة التحكم SOLAR TRACKER في جدران صندوق التحكم SOLAR TRACKER وألصقها ببراغي غاطسة من الفولاذ المقاوم للصدأ بقطعتين 4G x 6 مم.
  3. أدخل Ardiuno Pro Mini + PCB مع فتحة رأس 6P في الفراغ في قاعدة صندوق التحكم SOLAR TRACKER.
  4. أدخل غطاء صندوق التحكم SOLAR TRACKER في جدران صندوق التحكم SOLAR TRACKER وألصق ببراغي غاطسة ذاتية الغلق من الفولاذ المقاوم للصدأ 4G x 6mm.
  5. قم بإلصاق التجميع أعلاه بقاعدة إطار اللوحة باستخدام 4 مسامير من الفولاذ المقاوم للصدأ غاطسة من النوع 4G × 6 مم.

الخطوة 5: توصيل يؤدي جهاز الحفر بوحدة التحكم

توصيل يؤدي جهاز الحفر بوحدة التحكم
توصيل يؤدي جهاز الحفر بوحدة التحكم
توصيل يؤدي جهاز الحفر بوحدة التحكم
توصيل يؤدي جهاز الحفر بوحدة التحكم
توصيل يؤدي جهاز الحفر بوحدة التحكم
توصيل يؤدي جهاز الحفر بوحدة التحكم

الاتصالات ذات الصلة الجاهزة من Instructable السابقة ، هي 4 من اتصالات 2P LDR و 2 من اتصالات 3P من الماكينات. ما هو مؤقت حتى إعادة الشحن هو البطارية. استخدم 3.7V LiPo الذي ينتهي في اتصال 2P DuPont في الوقت الحالي.

  1. أدخل وصلات LDR (بدون قطبية) من الأعلى:

    1. فوق على اليمين
    2. أعلى اليسار
    3. أسفل اليمين
    4. أسفل اليسار
  2. أدخل اتصالات المؤازرة (مع سلك الإشارة إلى اليسار) من الأعلى:

    1. أفقي
    2. عمودي
  3. انتظر حتى تصبح جاهزًا للاختبار بعد ذلك: أدخل سلك التيار المستمر بجهد 3.7 فولت + في الأعلى ، ثم إلى الأسفل.

الخطوة السادسة: اختبار وحدة التحكم

Image
Image

كما هو مذكور من قبل ، لم يتم تحسين البرنامج لسير عمل شحن الطاقة الشمسية. يمكن اختباره وتعديله باستخدام مصادر الضوء الطبيعية (الشمس) وغير الطبيعية.

لاختبار التتبع في بيئة مضبوطة ، قد يكون من الملائم ضبط عدد دقائق النوم على قيمة أقل (انظر الخطوة التالية).

الخطوة 7: التكوين عبر I2C باستخدام إدخال وحدة التحكم

يوضح هذا تكوين وحدة التحكم عبر وحدة MCU ثانية ، وإدخال الإعدادات في نافذة وحدة التحكم.

  1. قم بتحميل البرنامج النصي التالي على D1M WIFI BLOCK (أو Wemos D1 Mini).
  2. افصل USB عن جهاز الكمبيوتر
  3. اتصالات رقم التعريف الشخصي: -ve (تحكم) => GND (D1M) + ve (تحكم) => 3V3 (D1M) SCL (تحكم) => D1 (D1M)

    SDA (تحكم) => D2 (D1M)

  4. أدر مفتاح SPDT إلى CONFIG
  5. قم بتوصيل USB بجهاز الكمبيوتر
  6. من Arduino IDE ، ابدأ نافذة وحدة التحكم باستخدام منفذ COM الصحيح
  7. تأكد من تحديد "Newline" و "9600 baud"
  8. يتم إدخال الأوامر في Send Textbox متبوعة بالمفتاح Enter
  9. الأوامر في تنسيق الأحرف بايت
  10. إذا لم يتم تضمين البايت الثاني (المقطع الثالث) ، يتم إرسال 0 (صفر) بواسطة البرنامج النصي
  11. كن حذرًا عند استخدام الإدخال التسلسلي ؛ راجع ما أدخلته قبل الضغط على مفتاح "Enter". إذا تم حظر دخولك (على سبيل المثال تغيير عنوان I2C إلى قيمة قد نسيتها) ، فستحتاج إلى تحديث البرنامج الثابت لجهاز التحكم مرة أخرى.

الاختلافات المدعومة في الحرف الأول من الأمر هي:

  • E (تمكين التعقب المؤازر) مفيد لإيقاف الحركة أثناء التكوين. هذا هو الإدخال باستخدام: E 0
  • D (تعطيل التعقب المؤازر) مفيد لبدء التتبع التلقائي إذا لم يكن إعادة تشغيل الجهاز. هذا هو الإدخال باستخدام: D 0
  • G (الحصول على قيمة التكوين) يقرأ القيم من EEPROM و IN-MEMORY: هذا الإدخال باستخدام: G (الفهرس قيم بايت صالحة 0-13 و 15)
  • يقوم S (تعيين قيمة EEPROM) بتعيين القيم إلى EEPROM والتي تكون متاحة بعد عمليات إعادة التشغيل. هذا إدخال باستخدام: S (الفهرس هو قيم بايت صالحة من 0 إلى 13 ، القيمة هي قيم بايت صالحة وتختلف لكل خاصية)

الكود هو نقطة الحقيقة للفهارس ولكن ما يلي يستخدم كدليل للقيم / التعليقات الصالحة:

  • I2C ADDRESS 0 - عنوان وحدة التحكم التابعة ، يحتاج السيد إلى هذا للتواصل مع وحدة التحكم (الافتراضي 10)
  • الحد الأدنى للزاوية الرأسية 1 - الحد الأدنى للزاوية المؤازرة العمودية (الافتراضي 10 ، النطاق 0-180)
  • MAXIMUM VERTICAL ANGLE 2 - الحد الأعلى للزاوية المؤازرة الرأسية (الافتراضي 170 ، النطاق 0-180)
  • SENSITIVITY VERTICAL LDR 3 - هامش قراءة LDR العمودي (الافتراضي 20 ، النطاق 0-1024)
  • ANGLE ANGLE الخطوة 4 - خطوات مؤازرة رأسية للزاوية على كل ضبط (افتراضي 5 ، النطاق 1-20)
  • الحد الأدنى للزاوية الأفقية 5 - الحد الأدنى للزاوية المؤازرة الأفقية (الافتراضي 10 ، النطاق 0-180)
  • MAXIMUM HORIZONTAL ANGLE 6 - الحد الأعلى للزاوية الأفقية المؤازرة (الافتراضي 170 ، النطاق 0-180)
  • SENSITIVITY HORIZONTAL LDR 7 - هامش قراءة LDR أفقي (افتراضي 20 ، النطاق 0-1024)
  • ANGLE ANGLE STEP 8 - خطوات مؤازرة أفقية بزاوية على كل ضبط (الافتراضي 5 ، النطاق 1-20)
  • دقائق النوم 9 - فترة النوم التقريبية بين التتبع (الافتراضي 20 ، النطاق 1 - 255)
  • زاوية الفجر العمودية 10 - الاستخدام المستقبلي - الزاوية الرأسية التي يجب الرجوع إليها عندما تغرب الشمس
  • زاوية الفجر الأفقية 11 - الاستخدام المستقبلي - الزاوية الأفقية التي يجب الرجوع إليها عندما تغرب الشمس
  • كثافة الفجر 12 - الاستخدام المستقبلي - الحد الأدنى لمتوسط جميع LDRs التي تؤدي إلى بدء التتبع اليومي لأشعة الشمس
  • كثافة الغسق 13 - الاستخدام المستقبلي - الحد الأدنى لمتوسط كل LDRs التي تؤدي إلى إنهاء التتبع اليومي لأشعة الشمس
  • محدد قيم نهاية EEPROM 14 - القيمة غير مستخدمة
  • الكثافة الحالية 15 - متوسط النسبة المئوية الحالية لشدة الضوء
  • نهاية محدد القيم في الذاكرة 16 - القيمة غير مستخدمة.

يلتقط الإدخال التسلسلي (إدخال لوحة المفاتيح في نافذة وحدة التحكم) ويعيد توجيهه إلى تابع I2C بتنسيق char ، byte ، byte

#يشمل
# حدد I2C_MSG_IN_SIZE2
# حدد I2C_MSG_OUT_SIZE3
# حدد I2C_SLAVE_ADDRESS10
قيمة منطقية _newData = خطأ ؛
البايت الثابت _numChars = 32 ؛
char _receivedChars [_numChars] ؛ // مجموعة لتخزين البيانات المستلمة
الإعداد باطل() {
Serial.begin (9600) ؛
Wire.begin (D2، D1) ؛
تأخير (5000) ؛
}
حلقة فارغة() {
recvWithEndMarker () ،
parseSendCommands () ،
}
voidrecvWithEndMarker () {
البايت الثابت ndx = 0 ؛
char endMarker = '\ n' ؛
شار RC
while (Serial.available ()> 0 && _newData == false) {
rc = Serial.read () ،
إذا (rc! = endMarker) {
_receivedChars [ndx] = rc؛
ndx ++ ؛
إذا (ndx> = _numChars) {
ndx = _numChars - 1 ؛
}
} آخر {
_receivedChars [ndx] = '0' ؛ // إنهاء السلسلة
ndx = 0 ؛
_newData = صحيح ؛
}
}
}
voidparseSendCommands () {
إذا (_newData == صحيح) {
constchar delim [2] = "" ؛
رمز شار * ؛
الرمز المميز = strtok (_receivedChars، delim) ؛
char cmd = _receivedChars [0] ؛
فهرس البايت = 0 ؛
قيمة البايت = 0 ؛
كثافة العمليات أنا = 0 ؛
بينما (token! = NULL) {
//Serial.println (منطوقة) ؛
أنا ++ ؛
التبديل (ط) {
حالة 1:
رمز = strtok (NULL ، delim) ؛
الفهرس = atoi (رمز) ؛
استراحة؛
الحالة 2:
رمز = strtok (NULL، delim) ؛
إذا (رمز! = NULL) {
القيمة = atoi (رمز) ؛
}
استراحة؛
إفتراضي:
رمز = NULL ؛
}
}
sendCmd (كمد ، فهرس ، قيمة) ؛
_newData = خطأ ؛
}
}
voidsendCmd (char cmd ، فهرس البايت ، قيمة البايت) {
Serial.println ("-----") ؛
Serial.println ("إرسال الأمر:") ؛
Serial.println ("\ t" + String (cmd) + "" + String (index) + "" + String (value))؛
Serial.println ("-----") ؛
Wire.beginTransmission (I2C_SLAVE_ADDRESS) ؛ // إرسال إلى الجهاز
Wire.write (cmd) ؛ // يرسل حرفًا
Wire.write (فهرس) ؛ // يرسل بايت واحد
Wire.write (القيمة) ؛ // يرسل بايت واحد
Wire.endTransmission () ؛
استجابة البايت = 0 ؛
منطقي hadResponse = خطأ ؛
إذا (cmd == 'G') {
Wire.requestFrom (I2C_SLAVE_ADDRESS، 1) ،
while (Wire.available ()) // قد يرسل التابع أقل من المطلوب
{
hadResponse = صحيح ؛
الاستجابة = Wire.read () ؛
}
إذا (hadResponse == صحيح) {
Serial.println ("الحصول على استجابة:")؛
Serial.println (استجابة) ؛
}آخر{
Serial.println ("لا توجد استجابة ، تحقق من العنوان / الاتصال") ؛
}
}
}

عرض rawd1m_serial_input_i2c_char_byte_byte_v0.1.ino مستضاف مع ❤ بواسطة GitHub

الخطوة 8: الخطوات التالية

تحقق مرة أخرى بشكل دوري للتحقق من التغييرات في البرامج / الأجهزة.

قم بتعديل البرامج / الأجهزة وفقًا لمتطلباتك.

التعليق على أي طلبات / تحسينات.

موصى به: