لقد حان فصل الخريف ...فالشتاء يلوح في الأفق بلا هوادة - إنه مظلم في الصباح ومظلم في المساء.الاستيقاظ على المنبه في الظلام الدامس يعادل الغوص تحت الجليد. الإجهاد في الصباح - يضمن يوم مملة.الحل هو ، يسمى إنذار الضوء ، ولكن سعر هذا الشيء من 5000 روبل. لكن الوخز. بالإضافة إلى ذلك ، خوارزمية التشغيل مشفرة بشدة ، ولكن من الواضح تمامًا أنه ، وفقًا لنتائج الاستيقاظ ، تريد تصحيح شيء ما أو توسيع الوظيفة.لكن ماذا لو كان على أساس مرتجل وسيلة لبناء شيء ما بهذه الروح؟ لغز جيد ل DIY!
تم استخدام المواد التالية للحل:- نموذج أولي من لوحة التصحيح لمجموعة أدوات لتعلم برمجة Arduino (مدرجة في مجموعة NR05 المستقبلية) ، تم تصميمه لـ Arduino Nano ؛- ساعة الوقت الحقيقي MP1095 ؛- المصابيح مختلفة ؛- مكبر صوت بيزو مع مولد مدمج ؛- شيء أبيض شفاف ، بمجرد طباعته عند تصحيح أخطاء طابعة ثلاثية الأبعاد (يمكنك تكييف شيء آخر شفاف كناشر ، ومن لديه طابعة ثلاثية الأبعاد يمكنه طباعة شيء خاص به) ؛- الرغبة في الجمع بين كل هذا وبرمجة خوارزمية عمل مناسبة.كنت أرغب في تكديس الشيء الأبيض على بعض الركيزة من أجل تثبيت LED هناك وتوصيله بكابل إلى اللوحة. دون التفكير مرتين ، نقوم برسم SketchUp وطباعة حامل برتقالي على طابعة ثلاثية الأبعاد. برغبة قوية ، يمكنك طباعة حالة لوحة النموذج الأولي ، ولكن النموذج الأولي جميل بشكل لا يصدق!بالإضافة إلى ذلك ، يمكن استخدامه لتطوير مشاريع أخرى ، ويمكن ترتيب المنبه ، وفقًا لنتائج تشغيل النموذج الأولي ، في تصميم مضغوط أكثر استنادًا إلى نفس لوحة Arduino Nano.عالق أولاً LED واحد. تم لصقها على القاعدة بمادة لاصقة مبتكرة شفيت بواسطة الأشعة فوق البنفسجية. يسمى Bondic. يجب أن أقول الشيء المفيد في الأسرة! يحمل ضيق.


قاموا بلصق الموصل بنفس الغراء.
شاهدنا كيفية توهج. لم يعجبني. في الظلام ، بالطبع ، تكون مرئية ، ولكنها ليست كافية لتنشيط الدماغ من خلال المستقبلات البصرية. سجل عدد قليل من مؤشرات LED البيضاء الساطعة من خلال الحيل. مدمجة بالتوازي في مثل هذا الغصين ، فإنها تعطي ضوءًا يقظًا تمامًا عند أقصى سطوع.
يستهلكون حوالي 100 مللي أمبير كحد أقصى ، ولا يمكنك الاتصال مباشرة بمنفذ Arduino ، ولكن هناك مكبر للصوت الحالي على لوحة التصحيح مزودًا بترانزستور يوفر 200 مللي أمبير.
هناك أيضًا خمسة أزرار على اللوحة لجميع أنواع التجارب ، نستخدمها للتحكم في الأوضاع وضبط المنبه.بشكل عام ، تعتبر لوحة التصحيح مثيرة للاهتمام من خلال وجود دبابيس موصلات ملحوظة لتوصيل أجهزة استشعار ومشغلات مختلفة ، مما يوفر وظائف جيدة وواجهة ودية - يمكنك توصيل أجهزة استشعار درجة الحرارة ، وأجهزة استشعار الضغط ، والمرحلات ، والمرحلات ، والأجهزة بواجهة I2C دون تردد (موقعة). إلخ للاتصال ، هناك حاجة فقط الأسلاك مع مآخذ.
سنقوم بتعديل السطوع باستخدام PWM من الطرف التاسع من Arduino ، والذي يتم فصله على اللوحة إلى مكبر الصوت. نقوم بتوصيل مكبر الصوت بموصل SOUND ، على DAT plus ، على GND ناقص. ساعة في الوقت الفعلي - إلى موصل I2C_5V ، نظرًا لأنها تحتاج إلى 5 فولت لإمداد الطاقة. تحتوي اللوحة بالفعل على مؤشر LCD من سطرين ، متناقض للغاية ، مع أحرف بيضاء لطيفة على خلفية زرقاء.في الواقع ، جميع الأجهزة في مكانها ، والآن الأمر متروك للبرنامج.تم تصميم الخوارزمية على النحو التالي:- عندما يتزامن الوقت الحالي مع الوقت الذي يتم فيه ضبط المنبه ، يجب زيادة سطوع المصباح ببطء إلى الامتلاء ؛- في نفس الوقت ، يجب إرسال الإشارات الصوتية عدة مرات بترتيب متزايد ، مما يمنع جسم الإيقاظ من الدفع في المصباح الكهربائي والنوم في الضوء ؛- يجب أن تعطي الفرصة لإيقاف الصوت المزعج في النهاية ، وكذلك تشغيل الضوء الكامل يدويًا ، أو إيقاف تشغيله ، مع إدراكك التام تمامًا.- يجب أن يكون من الممكن ضبط الوقت على الساعة وساعة المنبه.يظهر الرسم الناتج في نهاية المادة ويزود بتعليقات مفصلة. من السهل تعديل رغباتك وتفضيلاتك.أتمنى لك يقظة جميلة للجميع!
رسم تخطيطي لبرنامج المنبه//
#include <LiquidCrystalRus.h>
#include <LiquidCrystalExt.h>
#include <LineDriver.h>
// I2C
#include <Wire.h>
// RTC
#include «RTClib.h»
// 2
//
#include <MsTimer2.h>
//-----------------------------------------------------------------------
#define NUM_KEYS 5
// ( )
int adcKeyVal[NUM_KEYS] = {30, 150, 360, 535, 760};
//-----------------------------------------------------------------------
int led13 = 13; // Arduino Nano
int alarmPin = 3; //
int led = 9; //
int brightness = 0; //
int riseAmount = 1; // 0-255
int timeAmount = 500; // ,
int beepCount = 0; //
int numberOfBeeps = 0;
unsigned long time_old;
unsigned long time_curr;
int alarm = 0; //
int Step; //
unsigned long tSetOld;
unsigned long tTickOld;
// lcd, RS,EN,DB4,DB5,DB6,DB7
LiquidCrystalRus lcd(A1, A2, A3, 2, 4, 7);
// RTC
RTC_DS1307 RTC;
int Year; // RTC
int Month;
int Day;
int Hour;
int Minute;
int Second;
int alarmHour = 0;
int alarmMinute = 0;
int setAlarm = 0; // ./.
int SetMode = 0; // / ./.
int AlarmOn; // ./.
void setup() {
pinMode(led13, OUTPUT);
pinMode(3, OUTPUT);
lcd.begin(16, 2);
Wire.begin(); // 1Wire ( RTC)
RTC.begin(); // RTC
RTC.writenvram(2, 0); // 00 ( 2 RTC)
tTickOld = millis(); //
// 5,
// 0
if (get_key() == 5) {
RTC.adjust(DateTime(__DATE__, __TIME__));
for (int i = 0; i < 5; i++) RTC.writenvram(i, 0);
}
}
void loop() {
AlarmOn = RTC.readnvram(3); // 3- RAM RTC: (1) (0)
if (get_key() == 2) { // 2
SetMode++; //
delay(500);
tSetOld = millis();
}
while (SetMode) { //
if (get_key() == 2) {
SetMode++;
delay(200);
tSetOld = millis();
}
if (SetMode > 4) { //
SetMode = 0;
lcd.noBlink();
lcd.noCursor();
}
switch (SetMode) { //
case 1:
lcd.setCursor(12, 1); lcd.blink();
break;
case 2:
lcd.setCursor(9, 1); lcd.blink();
break;
case 3:
lcd.setCursor(12, 0); lcd.blink();
break;
case 4:
lcd.setCursor(9, 0); lcd.blink();
break;
}
if (get_key() == 1 or get_key() == 3) { // 1 3
tSetOld = millis(); //
if (get_key() == 3) Step = 1; // 3 —
if (get_key() == 1) Step = -1; // 1 —
switch (SetMode) {
case 1:
SetMinuteAlarm(Step); //
break;
case 2:
SetHrAlarm(Step); //
break;
case 3:
SetMinute(Step); //
break;
case 4:
SetHr(Step); //
break;
}
}
if ((millis() — tTickOld) > 1000) {
displayTime(); //
tTickOld = millis();
}
if ((millis() — tSetOld) > 10000) {
SetMode = 0; // 10 .
lcd.noBlink();
}
} // end SetMode
if (get_key() == 4) { // /
int alarm_ram = RTC.readnvram(3);
RTC.writenvram(3, !alarm_ram);
delay(50);
AlarmOn = alarm_ram;
delay(500);
}
if (get_key() == 5) { //
alarm = 0;
digitalWrite(led13, LOW);
lightDown();
}
if (get_key() == 5 && brightness >= 0) { //
lightUp();
}
if (get_key() == 1 && !SetMode) { //
//alarm = 0;
MsTimer2::stop();
digitalWrite(alarmPin, LOW);
}
if ((millis() — tTickOld) > 1000) {
displayTime(); //
tTickOld = millis();
}
if (alarm == 1) //
{
digitalWrite(led13, HIGH);
time_curr = millis();
if ((time_curr — time_old) > timeAmount) {
if (brightness < 255) {
brightness = brightness + riseAmount;
time_old = time_curr;
if (brightness > 255) brightness = 255;
analogWrite(led, brightness); //
switch (brightness) { //
case 60:
numberOfBeeps = 4;
alarmRun();
break;
case 120:
numberOfBeeps = 4;
alarmRun();
break;
case 180:
numberOfBeeps = 8;
alarmRun();
break;
case 220:
numberOfBeeps = 14;
alarmRun();
break;
}
if (brightness >= 255) {
numberOfBeeps = 32000; // (32000 )
alarmRun();
}
}
else digitalWrite(led13, LOW);
}
}
} // end loop
//----------------------------------------------
int get_key() //
{
int input = analogRead(A6);
int k;
for (k = 0; k < NUM_KEYS; k++)
if (input < adcKeyVal[k])
return k + 1;
return 0;
}
void SetMinuteAlarm(int Step) { //
alarmMinute = RTC.readnvram(1);
alarmMinute += Step;
if (alarmMinute > 59) alarmMinute = 0;
if (alarmMinute < 0) alarmMinute = 59;
RTC.writenvram(1, alarmMinute);
delay(300);
}
void SetHrAlarm(int Step) { //
alarmHour = RTC.readnvram(0);
alarmHour += Step;
if (alarmHour > 23) alarmHour = 0;
if (alarmHour < 0) alarmHour = 23;
RTC.writenvram(0, alarmHour);
delay(300);
}
void SetMinute(int Step) { //
DateTime now = RTC.now();
Year = now.year();
Month = now.month();
Day = now.day();
Hour = now.hour();
Minute = now.minute();
Second = now.second();
Minute += Step;
if (Minute > 59) Minute = 0;
if (Minute < 0) Minute = 59;
RTC.adjust(DateTime(Year, Month, Day, Hour, Minute, Second));
delay(300);
}
void SetHr(int Step) { //
DateTime now = RTC.now();
Year = now.year();
Month = now.month();
Day = now.day();
Hour = now.hour();
Minute = now.minute();
Second = now.second();
Hour += Step;
if (Hour > 23) Hour = 0;
if (Hour < 0) Hour = 23;
RTC.adjust(DateTime(Year, Month, Day, Hour, Minute, Second));
delay(300);
}
void displayTime() { //
DateTime now = RTC.now();
Year = now.year() — 2000;
Month = now.month();
Day = now.day();
Hour = now.hour();
Minute = now.minute();
Second = now.second();
lcd.setCursor(0, 0);
lcd.print(«: „);
if (Hour < 10) lcd.print(' ');
lcd.print(Hour);
lcd.print(':');
if (Minute < 10) lcd.print('0');
lcd.print(Minute);
lcd.print(':');
if (Second < 10) lcd.print('0');
lcd.print(Second);
int h = RTC.readnvram(0);
int m = RTC.readnvram(1);
int s = RTC.readnvram(2);
if (AlarmOn) {
lcd.setCursor(0, 1);
lcd.print(“: „);
if (h < 10) lcd.print(' ');
lcd.print(h);
lcd.print(':');
if (m < 10) lcd.print('0');
lcd.print(m);
lcd.print(':');
if (s < 10) lcd.print('0');
lcd.print(s);
}
else {
lcd.setCursor(0, 1);
lcd.print(“: --:--:--»);
}
if (Hour == h && Minute == m && Second == s && AlarmOn) { // !
alarm = 1;
numberOfBeeps = 2;
alarmRun();
}
}
void lightDown() { //
while (brightness > 0) {
time_curr = millis();
if ((time_curr — time_old) > 10) {
if (brightness > 0) {
brightness = brightness — 1;
time_old = time_curr;
if (brightness < 1) brightness = 0;
analogWrite(led, brightness);
}
}
}
}
void lightUp() { //
while (brightness < 255) {
time_curr = millis();
if ((time_curr — time_old) > 10) {
if (brightness < 255) {
brightness++;
time_old = time_curr;
if (brightness > 255) brightness = 255;
analogWrite(led, brightness);
}
}
}
}
void alarmRun() { // 1 ( )
digitalWrite(alarmPin, HIGH);
beepCount = 0;
MsTimer2::set(500, beep); // 500ms period
MsTimer2::start();
}
void beep() { // 500 2
if (beepCount < numberOfBeeps) {
static boolean output = HIGH;
digitalWrite(alarmPin, output);
output = !output;
beepCount++;
}
else {
MsTimer2::stop();
digitalWrite(alarmPin, LOW);
}
}
.ملاحظة انتباه! من 23 سبتمبر إلى 23 أكتوبر 2015 ، نقيم مسابقة صور"طباعة ثلاثية الأبعاد لحل المشاكل اليومية"!سيحصل الفائز على MC5 مصمم طابعة ثلاثية الأبعاد مع علبة أكريليك كهدية .يمكن لأولئك الذين يرغبون ببساطة الذهاب والتصويت لعملهم المفضل.شروط مسابقة الصور .