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

من الضروري جعل المطرقة تضرب حافة الوعاء. تلقائيًا. أيضا مع إمكانية التحكم عن بعد (وإعادة البرمجة!). ولمجرد التغلب على الوقت مثل الساعة القديمة ، ولكن بدقة حديثة.
واستشرافا للمستقبل ، سأري ما حدث في النهاية. شاهد بشكل أفضل مع الصوت.
لكن لنبدأ بالترتيب. كان علي أولاً أن أفهم كيف ستبدو الميكانيكا وكيف تعمل. بالنسبة للإلكترونيات والبرمجيات ، كنت هادئة - وراء
ثلاث مقالات حول كيفية التعامل مع أردوينكي عن بعد.
كان العنصر المتحرك الرئيسي هو أن يكون محرك سائر بسيط 28YBJ-48 وكنت بحاجة إلى فهم ما إذا كان يمكنه التعامل مع المطرقة.

اتصال dvigun إلى arduino ليس صعبًا ، لحسن الحظ ، تم بيعه بسائق ULN2003 جاهز. كان من الضروري فقط توفير مصدر طاقة منفصل لـ 5 فولت واحتياطي 200-300 مللي أمبير ، لأنك بالتأكيد لن يكون لديك محول كافٍ على arduino نفسه. ثم ، على أي أربعة منافذ رقمية (أخذت PB1 ، PB2 ، PB3 ، PB4) نقوم بنقل دفاتر بت التالية في كمية ثماني قطع.
PORTB=0b00000010;
للتدوير في الاتجاه المعاكس ، نقوم بنقل دفاتر الملاحظات نفسها ، ولكن بترتيب عكسي.
PORTB=0b00010010; PORTB=0b00010000; PORTB=0b00011000; PORTB=0b00001000; PORTB=0b00001100; PORTB=0b00000100; PORTB=0b00000110; PORTB=0b00000010;
الشيء الوحيد الذي ينشأ هو السرعة التي يتم بها نقل البيانات. من الواضح أنه كلما زادت سرعة دوران عمود المحرك ، ولكن إلى أي حد؟ هناك تردد غامض 100 هرتز في الوصف ، ولكن ماذا يعني بالضبط - فترة دورة كاملة أو كل عاب بشكل منفصل؟
في سياق التجارب ، اتضح أنه ، على ما يبدو ، كان المقصود من تكرار تغيير الرباعيين بدقة. إلى أقصى حد ، تمكنت من تسريع هذا التردد إلى 147 هرتز ، حيث أحدث عمود المحرك ثورة في حوالي ثانية أو اثنتين. لم أقم بقياس ذلك بالضبط ، ولكن يمكنك الحكم بنفسك على أن هذا النموذج مع علبة التروس هذه لا يختلف في خفة الحركة الخاصة. ولكن بالنسبة لمطرقي ، يبدو ، من حيث المبدأ ، مناسبًا.
ولكن بعد كل شيء ، ليست السرعة فقط هي المهمة بالنسبة لنا (أو بالأحرى أنها ليست مهمة للغاية) ولكن القوة التي يمكن أن يؤثر بها المحرك على سائل العمل. في المشاركات المخصصة لهذا المحرك ، قيل أنه لا يمكن أن يتوقف بيد. كما اتضح ، فإن العمود نفسه ، نعم ، لن تتوقف ، ولكن بالفعل رافعة صغيرة (وقررت استخدام نظام رافعة) حرفيا طولها 10 سم ، تتوقف وتتوقف بسهولة كبيرة حتى مع تأثير محلي صغير.
لذلك ، فإن أبسط خيار أولي ، عندما يرفع الرافعة إلى العمود يدفع الخافق على التعليق ، الذي يربح الوعاء وفقًا لذلك ، لم يمر. كان الصوت ضعيفًا جدًا. لذلك قررت أن أطلب مساعدة الجاذبية ("العاهرة التي لا قلب لها" على حد تعبير شيلدون كوبر). في هذا النموذج ، قامت الرافعة بسحب مصفق يصل إلى زاوية حوالي 30 درجة بالنسبة لاتجاه مركز الأرض ، ثم انفصل عنها وأرسلها في طريقها إلى الوعاء. لقد أحببت الصوت حقًا ، سواء من الأسفل أو مع جيراني. تم عمل آلية التحرير على مغناطيس مثبت على نهاية الرافعة. عندما صعدوا ، هزمت الجاذبية المغناطيسية وتم تحرير القفل. ثم قمت بإيقاف ميكانيكي مساعد - شريط عرضي التقى به المطرقة بالقرب من نقطة الارتفاع القصوى. استمر المحرك في الدوران ، وسحب الذراع وفك القفل المغناطيسي بالقوة. هنا ، ساعد الجاذبية المحرك ، لذلك كان جهد فك الارتباط مطلوبًا جدًا.
تم تجميع التصميم نفسه على أساس تفاصيل مصمم أطفال برج إيفل. اشتريتها لفترة طويلة واستخدمت أجزائها بشكل دوري في حرفتي. البرج ، بالطبع ، لم يتحول إلى برج إيفل ، ولكن في رأيي أنه ليس بأي حال أسوأ :)
كل شيء يعمل بشكل مثالي ، ولكن بنقص واحد - كان الصوت دائمًا بنفس القوة. هذا أمر طبيعي لضرب الوقت ، ولكن في الوضع الحر ، أود أن أسمع ليس فقط فترات توقف مختلفة في الوقت ، ولكن أيضًا أصوات نقاط قوة مختلفة. لذلك ، كان من الضروري تطبيق مغناطيس كهربائي ، والذي كان مفيدًا أيضًا. كانت المغناطيسات التقليدية مفيدة أيضًا - عمود مكون من خمس مغناطيسات صغيرة استخدمته كمخمد لترويض اهتزازات المضرب بعد ضرب الوعاء.

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

R1-560 أوم ، VD1 - 1N4007 ، VT1 - BD139
جمعت الجزء الإلكتروني الرئيسي في "Arduino ProMini" ووحدة ESP8266-07 ، التي أكملتها البرامج الثابتة خطوة بخطوة وفقًا لمقالتي
القديمة . ونتيجة لذلك ، أتيحت لي ، كالعادة ، الفرصة لبرمجة اردوينو لاسلكيا والتواصل معه عن بعد ، وتبادل البيانات ، التي استخدمتها في النهاية بنجاح. يوضح الرسم البياني ، مع ذلك ، اردوينو نانو لأسباب تاريخية ، ولكن اتصاله لا يختلف.

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

وكانت ميزتهم الرئيسية المفيدة بالنسبة لي الآن هي قدرتهم على سحب الوقت المحدد من خوادم NTP باستخدام نفس الدائرة المصغرة ESP8266 ، في شخص أول وأبسط تجسيد له.
حتى أنني أردت تقديم مقال حول هذا الموضوع قبل بضع سنوات ، ولكن بعد رؤية عدد المرات التي تم فيها ذلك بالفعل ، غيرت رأيي. سوف يضحكون بعد كل شيء. ولكن في سياق هذا المنصب ، فإن تحليل عملهم مناسب تمامًا. كما ذكرت سابقًا في المقالات ، أكتب برامج ESP8266 باللغة LUA. حدث ما حدث.
لذلك ، كان الرمز الذي تم تحميله في وحدة ESP تلك هو ذلك. uart.setup(0,9600,8,0,1,0) timezone = 3
خلاصة القول بسيطة. مرة واحدة (أم لا) ، يتم استدعاء الوظيفة التي تقوم بإعداد عميل UDP ، والتي تستدعي خادم الوقت الدقيق وتطلب الوقت المحدد وفقًا لذلك. ردا على ذلك ، يفرغ الخادم اثنين وثلاثين بايت ، والتي من الضروري إحضار البايتات الأربعة المطلوبة من البيانات. لسوء الحظ ، هذا ليس دقائق وساعات ، ولكن عدد الثواني التي انقضت حتى الآن منذ 1 يناير 1900. لذلك ، سيكون عليك حساب الوقت الحالي من البايتات الأربعة لهذه الثواني مع العديد من التلاعبات المعقدة.
علاوة على ذلك ، كل شيء أبسط. قم بتشغيل جهاز إرسال UART وإسقاط الوقت المحسوب فيه بثلاث بايت - ساعات ودقائق وثواني.
وأدخلت هذا الرمز مرة أخرى ، بالفعل في محمل إقلاع LUA (الرابط) الخاص بي ، في المكان الذي تم فيه بالفعل الاتصال بشبكة WI-FI ، ولكن لم يبدأ العمل الإضافي بعد.
في العرض الكامل ، يبدو هذا. function InstrProgrammingEnable ()
بالطبع ، هذا يتعارض مع مفهومي ، حيث يعتبر ESP8266 جسرًا لاسلكيًا نظيفًا ، والباقي متحكم ATMEL يقوم بالباقي ، ولكن كما يقولون: "مرة واحدة ، وليس ...".
لذلك ، حصلنا على الوقت الأولي الدقيق (مباشرة من خادم NTP أو بشكل غير مباشر من خلال التطبيق على الكمبيوتر ، لا يهم) ، ثم نود أن نفكر في الوقت بأنفسنا. أولاً ، لا يوجد شيء لتحميل الشبكة ، وثانيًا ، يتيح لك ATMEL نظريًا حساب الثواني بدقة جيدة. من الناحية النظرية ، نعم. ولكن في الممارسة العملية ، هناك مطبات.
انحراف صغير عن الساعة في الوقت الحقيقي على AVR.من الناحية النظرية ، لا يوجد شيء معقد في بناء ساعة على متحكم AVR. حتى أن معظم المصممين المسعورين قد دفعوا ساعة كوارتز بتردد 32768 هرتز إلى الدائرة. ولكن في الواقع ، هذا ليس ضروريا. في الواقع ، فإن ساعة الكوارتز ضرورية من أجل تشكيل مقاطعة متعددة للثانية وإيقاظ متحكم
نائم (ملاحظة). إذا كان جهازك يعمل باستمرار ، والساعة تعمل عادةً ، فإن وضع الكوارتز الإضافي الموجود على واحد الموجود وأخذ قدمين من مخرجات الإدخال تحته متهور. من الممكن استخدام مرنان كوارتز موجود بالفعل ، هناك ثمانية أو ستة عشر ميجا هرتز هناك. دقة قياسه كافية لعينيك ، وسيكون من السهل أيضًا حساب ثانية واحدة كعداد عداد.
في الواقع ، لدى متحكم AVR بالفعل كل شيء لذلك. كما تعلم ، تصل إشارة ساعة الإدخال (على سبيل المثال ، 8 ميجاهرتز) داخل الشريحة (على سبيل المثال ، AVRmega328P باعتبارها الأكثر شيوعًا لـ arduino) على ما يسمى التقسيم المسبق ، حيث يمكن تقسيمها أيضًا حسب رغبة المبرمج (عادةً على 8 ، 64 ، 256 ، 1024). ثم يصل إلى نوع من عداد عداد الوقت (يقول T1) ، والذي يبدأ على الفور في الزيادة.
لذا ، لنأخذ 8 ميجاهرتز ونقسمه على 256. نحصل على التوالي على تردد ساعة العداد 31250 هرتز. وفقًا لذلك ، نظرًا لأن عداد T1 يتكون من ستة عشر رقمًا ويمكن أن يحسب وفقًا لذلك حتى 65535 ، فسيكون لديه الوقت فقط للعد حتى 31250 في ثانية واحدة. ما نحتاج إليه. بالإضافة إلى ذلك ، يحتوي جهاز ضبط الوقت لدينا على سجل مقارنة مفيد جدًا آخر. إذا قمنا بتدوين الرقم 31250 هناك ، فسيتم مقارنته باستمرار في ظل ظروف معينة بمحتويات عداد T1 ، وأخيرًا ، عندما يكون متساويًا ، سينشئ العداد إشارة مقاطعة ، على سبيل المثال ، احتفظ بإشارتك الثانية.
اتضح بشكل ملائم ، ولكن للأسف ، ليس دقيقًا تمامًا. لعدادنا سيتم احتسابه مع خطأ تكمية قدره 256 / 8،000،000 ، مما يعطي خطأ كبيرًا إلى حد ما في حساب ثانية واحدة في ما يصل إلى 32 ميكروثانية. وهذا يؤدي إلى خطأ 2.8 ثانية في اليوم (0.000032 * 3600 * 24).
ولكن إذا قسمنا 8 ميجاهرتز الأصلي بكمية أقل ، على سبيل المثال ، على 64 ، فستزداد دقة القياس 4 مرات إلى 8 ands وتقليل الخطأ الناتج إلى 0.33 ثانية في اليوم. ولكن ، لسوء الحظ ، في هذه الحالة ، يجب أن يتم عد العداد حتى 125000 ، ولن يدخل هذا الرقم في السجل المكون من ستة عشر بتًا. سيتعين علينا كتابة رقم أصغر في سجل المقارنة (62500 لا يزال مناسبًا)) وإضافة حلقة في البرنامج نفسه ، حيث لن يتم حساب ثانية واحدة بواحدة ولكن بمقاطعتين.
لكننا أخذنا حالة مثالية ، ويمكن لمرنان كوارتز حقيقي ، مثبت بشكل خاص على لوح "صنع في الصين" ، أن يجلب لك العديد من المفاجآت. لا ، بشكل عام ، إذا نظرت إلى الكوارتز القياسي في
أوراق البيانات ، فلا نظريًا أن كل شيء سيء للغاية.
كما نرى ، يعمل الكوارتز متوسط المدى بشكل جيد. لديه عدم استقرار في الضبط الخاص به عند 25 جزء في المليون (أو بعبارة أخرى 25 جزء في المليون) ، أي أنه سوف يتردد عند تردد ليس 8 ميجا هرتز ، ولكن ، على سبيل المثال ، على تردد 8 ، 0002 ميجا هرتز ، والذي سيعطينا ما يصل إلى 2.1 ثانية من الخطأ في اليوم الواحد. ولكن هذا خطأ مستمر ويمكن أخذه بعين الاعتبار. يمكن أن يطفو هذا الكوارتز أيضًا عند درجة حرارة 5-10 جزء في المليون لكل درجة ، ولكن في ظل ظروف تشغيل الغرفة للجهاز ، سيكون الخطأ أيضًا صغيرًا. لا يزال هناك عامل مثل الشيخوخة ، لكنه ضئيل للغاية ويغير خصائص الكوارتز إلى حالة على الأقل بعض الملحوظة ، ربما ، ربما خمس سنوات. أو عشرة.
وهنا نحن سعداء بأخذ بعض استنساخ الصينية من اردوينو ، على سبيل المثال ARDUINO UNO.

نقوم بتشغيل برنامج اختبار لحساب الوقت وبدء استخدامه. تراكم للساعة لمدة دقيقة؟ سهل! المجلس الثاني اردوينو UNO؟ ليس أفضل.
خذ Arduino ProMini.

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

وكانت الوحيدة التي أظهرت نتائج أكثر أو أقل عقلانية.
ولكن حتى مع مثل هذه اللوحة ، باستخدام التركيبات النظرية فقط ، فأنت تدرك بنفسك أنك لن تصنع ساعة دقيقة. يحتاج اللوحة إلى تكوين ، وأنا ، مع التنهد ، صعدت خلف مرسمة الذبذبات.
كما اتضح ، فإن لوحات Arduino لها ميزة غير سارة - الإخراج الذي يتصل به مرنان الكوارتز لا يحتوي على خرج إلى مشط الدبوس ، على الرغم من أنه يتوافق مع المنفذ PB7. مثل ، بما أن الميناء مشغول بالكوارتز ، فأنت لا تتشبث به. وفقط عند سفح الميكروكونترولر ، من الصعب جدًا التقاط مسبار الذبذبات ، لتركيب السطح ودرجة 0.5 مم بين المحطات. ولكن حتى الانضمام إلى الساق اليمنى لم يعطني شيئًا. إما لأنني قمت بدس بشكل غير صحيح ، أو بدس في المكان الخطأ ، لأن ناتج مرنان الكوارتز ، ربما ليس ناتج مولد الساعة ، وبشكل عام ، فهو داخل وحدة التحكم الدقيقة نفسها. لذلك ، اضطررت إلى الالتفاف حول الحلول - وضع المكمل الأولي على معامل التقسيم الأدنى - واحد ، واكتب صفرًا في سجل المقارنة بحيث تنقطع المقاطعة على الفور وتدخل متحكمًا دقيقًا في وضع خاص حيث يغير ساق المنفذ PB1 حالته المنطقية مع كل مقاطعة من هذا القبيل.
منطقياً ، عند تشغيل لوحة Arduino Nano 16 MHz ، يجب أن يظهر تعرج 8 MHz عند إخراج هذا المنفذ.
وهو ما حدث. أظهر الذبذبات تردد 8. 002 31 ميغاهيرتز. علاوة على ذلك ، عاش التفريغ الأخير حياته الخاصة ، وما زلت لم أفهم ما إذا كانت دقة مذبذب الذبذبات مفقودة ، أو ما إذا كان تردد مذبذب البلورات عائمًا على هذا النحو. أشبه بالثانية.
الاستقرار الحراري الجيد هناك أيضا ، لا رائحة. إذا كنت تتنفس على اللوح (ربما ، بالمناسبة ، لا تزال الحاويات تأتي من الرطوبة؟) أو أحضر مكواة لحام (من بعيد) ، عندها يمكن أن يتحرك الكوارتز على الفور بمقدار خمسين هرتز. ولا تزال هذه القياسات تتضاعف تقريبًا ، حيث أن التردد الأولي هو 16 ميجاهرتز.
وبالتالي ، في لوحات اردوينو (على الأقل من أصل صيني) ، من المستحيل تحقيق دقة تزيد عن 200 هرتز بتردد ساعة 16 ميجاهرتز. مما يمنحنا الدقة القصوى للساعات التي يتم تجميعها على مثل هذه اللوحات بما لا يزيد عن ثانية واحدة في اليوم. وهذا أمر جيد.
نظرًا لوجود نسخ صينية من Arduino UNO ، سبق أن أشرت إليها سابقًا ، والتي بشكل عام ، كل شيء سيئ. وهي شائعة جدًا لأنها رخيصة ومريحة.
لذا ، قد يختلف تواترها عن المعلن بأكثر من مائة كيلو هرتز! وهو أمر غير معهود حتى لأسوأ الكوارتز الصيني.
يبدأ اللغز بحقيقة أن 12 ميجا هرتز مكتوب على الكوارتز نفسه! وفي أوصاف البائعين أيضًا.

ولكن ليس هناك 12 ميجاهرتز ، هذا أمر مؤكد. إذا قمت بتمكين المنفذ التسلسلي UART على اللوحة ، فسوف ترى بنفسك. نظرًا لأن UART موالف لهذا التردد ، فلن تعمل. وضبطها على تردد 16 ميغاهيرتز - سيتم. علاوة على ذلك ، شاهدت شخصياً الأشكال الموجية على كل من لوحتي Arduino Uno. اللوحة الأولى لها تردد مولد 15.8784 ميجا هرتز ، والثانية 15.8661 ميجا هرتز.
ولكن فجأة اتضح أن الكوارتز 12 ميجاهرتز لا يرتبط مباشرة بوحدة التحكم الدقيقة AVR ، ولكنه مصمم لتشغيل المنفذ التسلسلي مع جهاز كمبيوتر عبر USB (لتنزيل الرسومات). لذلك ، لم يتحقق افتراض عدم وجود كوارتز في الداخل ، ولكن سلسلة RC مضبوطة بشكل سيئ. والكوارتز الذي نحتاجه أصغر في الحجم ويقع بجوار رقاقة الميكروكونترولر. لكنها صغيرة جدا ولا يوجد نقش عليها.
ونتيجة لذلك ، ما زلت لا أستطيع أن أفهم كيف وأين أجد مرنانات الكوارتز ذات الجودة الرهيبة. ولكن يبدو أن كل شيء ممكن في الصين. وبطريقة ما فكرت في الجريئين باستخدام arduinki للأعمال التجارية الجادة. حسنًا ، يمكن ويجب كتابة البرنامج بنفسك ، ولكن ماذا تفعل بجودة الوحدات نفسها؟ على ما يبدو ، من المكونات الإلكترونية ، فإن الصينيين يدفعون كل الأرخص والمرفوضة.برنامج Singing Bowl لـ AVR.في النهاية ، بعد التغلب على جميع الصعوبات بتوقيت دقيق ، كتبت الرمز التالي لـ Arduino ProMiniبرنامج C للميكروكونترولر AVRmega328P #define F_CPU 8000000 #include <avr/io.h> #include <avr/interrupt.h> #include <stdint.h>// #include <math.h> // #include <stdio.h> // - #include <avr/eeprom.h> #include <stdbool.h> #include <setjmp.h> #include <stdlib.h> volatile bool change_mode = false; volatile bool boom =false; volatile bool go_ahead=true; volatile bool go_back=false; volatile bool gerkon=false; volatile uint8_t latency=2;// latency = 1 volatile uint8_t hour=12; volatile uint8_t hour24=12;// 12 volatile uint8_t minute=0; volatile uint8_t secund=0; volatile uint8_t power=0; volatile uint8_t pause_between_boom=0; volatile uint8_t first_byte=0; volatile uint8_t second_byte=0; volatile uint8_t third_byte=0; volatile uint8_t firth_byte=0; volatile uint8_t fifth_byte=0; volatile uint8_t cSREG; ISR(USART_RX_vect) { // , // – , . if (first_byte==0) { first_byte=UDR0; change_mode=true; goto ret; } if (second_byte==0) { second_byte=UDR0; goto ret; } if (third_byte==0) { third_byte=UDR0; goto ret; } if (firth_byte==0) { firth_byte=UDR0; goto ret; } if (fifth_byte==0) { fifth_byte=UDR0; goto ret; } cSREG=UDR0; ret: return; } ISR(PCINT1_vect )//PC2 int 10 // { if (go_ahead) { UDR0=44; // 44 } if (go_back) { gerkon=true; } } ISR(TIMER1_COMPA_vect) { // secund++; if (secund ==60) { secund=0; minute++; if(minute==60) { minute=0; hour++; if(hour==12) { hour=1;// 12 } hour24++; if(hour24==24) { hour24=1; } boom=true; } } } void time_delay(long dell)// { long i; dell=dell*796;// 8 for(i=0;i<dell;i++){;;}; sei();// , - .WTF ?????????????????????? } void turn_onkward()// { uint8_t legnth=170;// ( 0 170) for(uint16_t i =0;i<=legnth;i++) { go_ahead=true; PORTB=0b00000010;// time_delay(latency); PORTB=0b00000110; time_delay(latency); PORTB=0b00000100; time_delay(latency); PORTB=0b00001100; time_delay(latency); PORTB=0b00001000; time_delay(latency); PORTB=0b00011000; time_delay(latency); PORTB=0b00010000; time_delay(latency); PORTB=0b00010010; time_delay(latency); if (i>140) { PORTD |=(1<<PORTD2);// , 1 - } } time_delay(100); go_ahead=false; } void turn_backward(uint8_t pause, uint8_t force_of_sound)// // // { uint8_t legnth=170;// ( 0 170) for(uint16_t i =0;i<=legnth;i++) { go_back=true; PORTB=0b00010010; time_delay(latency); PORTB=0b00010000; time_delay(latency); PORTB=0b00011000; time_delay(latency); PORTB=0b00001000; time_delay(latency); PORTB=0b00001100; time_delay(latency); PORTB=0b00000100; time_delay(latency); PORTB=0b00000110; time_delay(latency); PORTB=0b00000010;//16 ms , latency = 2 time_delay(latency); if (i==force_of_sound*17) { PORTD &=~(1<<PORTD2);// , 0 - } if (gerkon) { gerkon=false; break; } } time_delay(50); time_delay(pause*1000);// go_back=false; } void sound(uint8_t force,uint8_t pause) // 1 10 { turn_onkward(); turn_backward(pause,force); } int main(void) { sei(); // UART 9600 8 time_delay(2000);// , esp - UCSR0A=0; UCSR0B=0b10011000;// a UART UCSR0C=0b00000110; UBRR0L=51;// 8 9600 UART UBRR0H=0; // INT0 2 10 // PCICR|=(1<<PCIE1);// 14-8 PCMSK1|=(1<<PCINT10);// INT10 DDRC&=~(1<<PORTC2); DDRB=0b00111110;//PB1-PB4 , PB5 DDRD=0b00000100; // PD2 //SET INTERRUPT FROM TIMER1 AND SET TIMER1 GTCCR=0;//RESET PRESCALER TCCR1A=0;//I/O NORMAL WORK TCCR1C=0; TCCR1B=0B00001100;//1/256 PRESCALING AND CTC MODE TCNT1H=0;//RESET TIMER1 TCNT1L=0; TIMSK1=0B00000010;//SET COMPARE A INTERRUPT ENABLED OCR1AH=0x79;//SET TIME CONSTANT IN COMPARE REGISTER OCR1AL=0xa7;// 31143 7 972 608 TCCR0B=0b00000010;// 8 0 255 while (1) { begining: time_delay(1000); if (first_byte!=0) { UDR0=first_byte;// . (100,101,102) } if (first_byte==100)// ( NTP { hour=second_byte;// if (hour>12)// 12 (24 ) { hour=hour-12; } if (hour==0) { hour=12; } minute=third_byte;// secund=firth_byte;// power=fifth_byte;// first_byte=0;// second_byte=0; third_byte=0; firth_byte=0; fifth_byte=0; change_mode=false; goto clock_mode; } if (first_byte==101)// { power=second_byte; pause_between_boom=third_byte; first_byte=0; second_byte=0; third_byte=0; firth_byte=0; fifth_byte=0; change_mode=false; goto random_mode; } if (first_byte==102)// { power=second_byte; first_byte=0; second_byte=0; third_byte=0; firth_byte=0; fifth_byte=0; change_mode=false; goto hand_mode; } // , first_byte=0; second_byte=0; third_byte=0; firth_byte=0; fifth_byte=0; goto begining; clock_mode: while(change_mode==false) { if (boom)// { for(uint8_t i =0;i<hour;i++) { if ((hour24>21)|(hour24<10))// { sound(3,0);// 10 (), 0 boom=false; } else { sound(power,0);// 10 (), 0 boom=false; } } } } goto begining; random_mode: while(change_mode==false) { uint8_t random_power = TCNT0;// 1 uint8_t random_pause = TCNT1L;// 1 random_pause=TCNT0;// 1 random_power=random_power/25; if (random_power<5) { random_power=random_power+2;// } random_pause=(random_pause/25)+pause_between_boom; UDR0=random_pause; time_delay(100); sound(random_power,random_pause); } goto begining; hand_mode: sound(power,0); goto begining; } }
كل شيء يعمل ببساطة. بعد تهيئة الأجهزة الطرفية ، ينتقل الميكروكونترولر إلى حلقة لا نهائية ، في انتظار أمر UART. رموز الأوامر هي كما يلي:100وضع الساعة 101وضع عشوائي 102 وضع يدوي.نظرًا لأن AVR لا يهم من أين يأتي الأمر ، يتم تشغيل الأمر الأول من ESP8266 بعد التبديل. كما ذكرنا من قبل ، يتمسك وحدة ESP بالشبكة ، ويسحب الوقت المحدد من خادم NTP ويرسله إلى وحدة التحكم الدقيقة. وهكذا ، في البداية يدخل arduinka إلى وضع ضربات الساعة. من خلال مقاطعة عداد عداد T1 ، يتم حساب الثواني والدقائق والساعات ، وإذا لزم الأمر ، يتم استدعاء الوظائف لضبط محرك السائر ذهابًا وإيابًا من أجل التغلب على الوقت.يعطل انقطاع مفتاح القصب نفس نقطة الصفر ، إذا بدأت مع مرور الوقت في سحب الذراع المصفق في التحرك بالنسبة لعمود المحرك.تطبيق للكمبيوتر.إنه مبني على نفس البرامج القديمة نفسها ، فقط يتغير التمثيل المرئي هنا.
على الرغم من ذلك ، ترتفع قناة الاتصال مع AVR من خلال اتصالات HTTP و UDP. بعد ذلك ، إذا لزم الأمر ، يتم إرسال أمر التحكم الضروري والبيانات ذات الصلة في شكل حزم UDP. بالطبع ، سيكون من الأصح فصل عنصر التحكم والبيانات على قنوات مختلفة ، ولكن ، أولاً ، لهذا تحتاج إلى تعديل كود LUA في محمل الإقلاع ، وثانيًا ، ليس هناك نقطة في هذا ، حيث يتم تلقي وحدة التحكم الدقيقة والأوامر والبيانات واحدة تلو الأخرى و نفس UART. ومع ذلك ، نعم ، في بعض الأحيان (نادرًا) يخلط بينها AVR. لكن هذا ليس مخيفًا ، لأنه إذا لم يتعرف المتحكم الدقيق على الأمر ، فلن يقوم بتنفيذه ، وسيتعرف أيضًا على هذا على تطبيق الكمبيوتر ، والذي سيطالبك بدوره بتكرار الإدخال.الكود متاح في جيثب.ملاحظةبشكل عام ، الرهبان التبتيون لا يخفقون فقط مع المصفقين في أوعية الغناء. إذا كنت تقود المطرقة بعناية على طول حافة الوعاء ، فلن يولد صوتًا رائعًا بدون أي طرق ، حيث تحته الطبيعة الإلهية للرنين. لكن هذا تحدٍ حقيقي لاردوينو.