محطة الطقس DIY.
كان المساء، لم يكن هناك شيء للقيام به بعد العام الجديد. كالعادة، خلال عطلة رأس السنة الشتوية، أريد أن أشغل رأسي ويدي بشيء مفيد ومبدع. خلال عطلة رأس السنة الجديدة قررت إنشاء محطة أرصاد جوية بيدي. بدأت بالتحضير مسبقًا، وقمت بشراء جميع المكونات وتجميعها قبل حلول العام الجديد، وقمت بالبرمجة الرئيسية خلال العطلات.
(هناك الكثير من الصور تحت القطع!)
أولاً، سأتناول المكونات ولن أعطي روابط، نظرًا لأن المنتجات الموجودة على موقع eBay (في حسابي الشخصي) قد تمت أرشفتها. لقد اشتريت العديد من المكونات على مهل على موقع eBay. لقد جربت المزاد لأول مرة، قبل أن أشتري دائمًا “اشتريه الآن”. ماذا يمكنني أن أقول، إذا لم تتعجل في التسوق، فيمكنك شراء بعض المكونات بسعر أرخص (الفرق في بعض الأحيان يكون ضعف ذلك).
مستشعر الضغط VMR085
هذا هو المستشعر الرئيسي. عندما رأيت ذلك على موقع eBay، عرفت أنني أريد بناء محطة طقس منزلية.
وصل المستشعر في مظروف عادي، مغطى بطبقة فقاعية من الداخل.
كان داخل المظروف بطاقة عمل البائع وجهاز استشعار، معبأة في كيس مضاد للكهرباء الساكنة وملفوف بطبقة أخرى من غلاف الفقاعات.
تم إغلاق الكيس المضاد للكهرباء الساكنة بحيث لا تهدد الرطوبة أثناء الرحلة المستشعر
نحن نخرج المستشعر. يوجد على أحد الجانبين خط ملحوم من نقاط الاتصال التي تم إدخالها في الرغوة لمنعها من الانحناء. على الجانب الآخر يوجد المستشعر نفسه وعلامات الاتصال.
كل شيء سيكون على ما يرام، ولكن يتم تطبيق علامات الاتصال في صورة معكوسة.
يتم توصيل المستشعر عبر ناقل I2C ويتم تشغيله بجهد 3.3 فولت. أي أنك تحتاج إلى 4 أسلاك (+، -، SDA، SCL) للتشغيل العادي.
يمكنك استجواب المستشعر بطريقتين: إما من خلال المكتبة، أو باستخدام الوظائف مباشرة في الرسم.
برنامج المثال:
#يشمل#define BMP085_ADDRESS 0x77 // عنوان I2C لـ BMP085
Const unsigned char OSS = 0; // إعداد الإفراط في أخذ العينات
// قيم المعايرة
كثافة العمليات AC1؛
كثافة العمليات2؛
كثافة العمليات3؛
كثافة العمليات غير الموقعة AC4؛
كثافة العمليات غير الموقعة AC5؛
غير موقعة كثافة العمليات AC6؛
كثافة العمليات B1؛
كثافة العمليات B2؛
كثافة العمليات ميغابايت؛
كثافة العمليات مولودية.
كثافة العمليات MD؛درجة حرارة قصيرة
ضغط طويلالإعداد باطل()
{
Serial.begin(9600);
Wire.begin();
bmp085Calibration();
}حلقة فارغة()
{
درجة الحرارة = bmp085GetTemperature(bmp085ReadUT());
الضغط = bmp085GetPressure(bmp085ReadUP());
Serial.print("درجة الحرارة: „);
Serial.print (درجة الحرارة / 10.0، ديسمبر)؛
Serial.println("C");
Serial.print("الضغط: „);
Serial.print(الضغط/133.322، ديسمبر)؛
Serial.println("مم زئبق");
println();
تأخير (1000)؛
}باطل bmp085Calibration ()
{
ac1 = bmp085ReadInt(0xAA);
ac2 = bmp085ReadInt(0xAC);
ac3 = bmp085ReadInt(0xAE);
ac4 = bmp085ReadInt(0xB0);
ac5 = bmp085ReadInt(0xB2);
ac6 = bmp085ReadInt(0xB4);
b1 = bmp085ReadInt(0xB6);
b2 = bmp085ReadInt(0xB8);
mb = bmp085ReadInt(0xBA);
mc = bmp085ReadInt(0xBC);
md = bmp085ReadInt(0xBE);
}قصير bmp085GetTemperature(unsigned int ut)
{
طويل ×1، ×2؛
x1 = (((طويل)ut - (طويل)ac6)*(طويل)ac5) >> 15;
x2 = ((طويل)mc<< 11)/(x1 + md);
b5 = x1 + x2;إرجاع ((b5 + 8)>>4);
}طويل bmp085GetPressure (طويل غير موقع)
{
طويل x1، x2، x3، b3، b6، p؛
b4 طويل غير موقع، b7؛
ب6 = ب5 - 4000؛
// احسب B3
x1 = (b2 * (b6 * b6)>>12)>>11;
x2 = (ac2 * b6)>>11;
x3 = x1 + x2;
b3 = (((((طويل)ac1)*4 + x3)<>2;
// احسب B4
x1 = (ac3 * b6)>>13;
x2 = (b1 * ((b6 * b6)>>12))>>16;
x3 = ((x1 + x2) + 2)>>2;
b4 = (ac4 * (طويل غير موقع)(x3 + 32768))>>15;
b7 = ((طويل غير موقع)(up - b3) * (50000>>OSS));
إذا (ب7< 0x80000000)
ع = (ب7<<1)/b4;
آخر
ع = (ب7/ب4)<<1;
x1 = (ع>>8) * (ع>>8);
x1 = (x1 * 3038)>>16;
x2 = (-7357 * ع)>>16;
ع += (x1 + x2 + 3791)>>4;
العودة ص؛
}// قراءة بايت واحد من BMP085 في "العنوان"
char bmp085Read (عنوان char غير الموقع)
{
بيانات الحرف غير الموقعة؛
Wire.write(address);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 1);
بينما(!Wire.available())
;
إرجاع Wire.read();
}Int bmp085ReadInt (عنوان الحرف غير الموقع)
{
غير موقعة شار msb، lsb؛
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(address);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 2);
بينما (Wire.available())<2)
;
msb = Wire.read();
lsb = Wire.read();
العودة (كثافة العمليات) مللي ثانية<<8 | lsb;
}// اقرأ قيمة درجة الحرارة غير المعوضة
كثافة العمليات غير الموقعة bmp085ReadUT()
{
كثافة العمليات غير الموقعة؛
// اكتب 0x2E في السجل 0xF4
// هذا يتطلب قراءة درجة الحرارة
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x2E);
Wire.endTransmission();
// انتظر 4.5 مللي ثانية على الأقل
تأخير (5)؛
// اقرأ وحدتي بايت من المسجلين 0xF6 و0xF7
ut = bmp085ReadInt(0xF6);
العودة؛
}// اقرأ قيمة الضغط غير المعوض
bmp085ReadUP () طويل غير موقع
{
غير موقعة char msb، lsb، xlsb؛
فترة طويلة غير موقعة = 0؛
// اكتب 0x34+(OSS<<6) into register 0xF4
// طلب قراءة الضغط مع إعداد الإفراط في أخذ العينات
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x34 + (OSS<<6));
Wire.endTransmission();
// انتظر التحويل، يعتمد وقت التأخير على OSS
تأخير (2 + (3<// قراءة التسجيل 0xF6 (MSB)، 0xF7 (LSB)، و0xF8 (XLSB)
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF6);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 3);
// انتظر حتى تصبح البيانات متاحة
بينما (Wire.available())< 3)
;
msb = Wire.read();
lsb = Wire.read();
xlsb = Wire.read();
up = (((طويل غير موقع) msb<< 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS)؛
ارجع للأعلى؛
}
اردوينو نانو v3.0
هذا هو قلب محطة الطقس بأكملها. ببساطة، وحدة التحكم صغيرة الحجم.
اشتريت
لن أتحدث بالتفصيل عن وحدة التحكم، حيث سبق أن تم ذلك قبلي:
كانت حزمة Lightake جاهزة مسبقًا، وجاءت وحدة التحكم في حزمة تحتوي على كابل USB وArduino في حقيبة محكمة الغلق مضادة للكهرباء الساكنة.
لتقدير الحجم، قمت بوضع عملة بقيمة 1 روبل بجانب الاردوينو.
لوحة التحكم عن قرب
كابل USB جيد، مع حلقة من الفريت. يتم تشغيل Arduino عبر كابل USB. يمكن تنزيل بيئة التطوير (صفحة التنزيل). اللغة تشبه لغة C، ولم تكن هناك مشاكل في إتقانها، حيث أنني أقوم بالكثير من البرمجة بها في العمل.
شاشة عرض من الكريستال السائل
في العمل وجدت شاشة LCD 1602 متوافقة في الصناديق. اضطررت إلى التلاعب بالاتصال، لأنني لم أتمكن من العثور على ورقة بيانات خاصة به. ونتيجة لذلك، بدأت شاشات الكريستال السائل في العمل.
لكن بعد فترة قصيرة من الاستخدام، لاحظت أن هذه الشاشة ليست كافية بالنسبة لي ولن يكون من الممكن عرض المزيد من البيانات، حيث أنها تحتوي على سطرين فقط يتكون كل منهما من 16 حرفًا. في البداية يبدو أن هذه المعلمات كافية، ولكن عندما تبدأ البرمجة، تدرك أن الحد الأقصى الذي يمكنك الضغط عليه هو 3-4 معلمات. وإذا قمت بإنشاء قائمة (كنت أفكر في إنشاء قائمة على هذه الشاشة)، فلن يكون هناك سوى 1-2 معلمات متبقية في المساحة الحرة.
ونتيجة لذلك، بدأت أبحث عن شاشة أخرى. في البداية نظرت عن كثب إلى الشاشة الرسومية لجهاز Nokia 3310 وشاركت في مزاد eBay لشرائه، لكن الأمر لم ينجح (وهو ما أنا سعيد به جدًا)، لذلك اضطررت للتخلي عن هذه الشاشة. الآن أفهم أنه سيكون صغيرا جدا لأغراضي، لأن هناك ما يمكن مقارنته به.
أثناء البحث بشكل عشوائي عبر الدروع في Arduino، صادفت شاشة رسومية 12864 على وحدة التحكم ST7920. تتميز هذه الشاشة بالحجم المناسب والدقة الجيدة التي تناسب احتياجاتي (128 × 64). أي أنه يمكنك بسهولة وضع 6-7 أسطر مكونة من 20 حرفًا بخط يمكن قراءته بشكل طبيعي. نظرًا لأن الشاشة رسومية، بالإضافة إلى النص، يمكن وضع الرسومات بخطوط مختلفة. باختصار، هذا هو بالضبط ما كنت أحتاجه، كل شيء كان موجودًا على هذه الشاشة، لذلك لم أستطع المقاومة وطلبت ذلك.
وصل الطرد بسرعة وتم تعبئته بشكل قياسي: مظروف مغلف بالفقاعات، وكان بداخله طبقة أخرى من غلاف الفقاعات وشاشة في كيس مضاد للكهرباء الساكنة:
لتقدير الحجم، وضعت عملة معدنية بقيمة 1 روبل بجوار شاشة LCD.
لتوصيل الشاشة بسرعة بـ Arduino، قمت بلحام خط من نقاط الاتصال بمنافذ LCD. يمكن توصيل شاشة LCD عبر ناقل تسلسلي أو ناقل متوازي. لقد اخترت الخيار الأول، نظرًا لوجود عدد قليل بالفعل من جهات اتصال Arduino المجانية.
الاتصال (مأخوذ من الويب):
- يتم توصيل الدبوس 1 (GND) بالحافلة المشتركةوفقًا لهذه التعليمات، قمت بتوصيل كل شيء باستثناء الإضاءة الخلفية. لقد استخدمت Arduino PWM لتشغيل الإضاءة الخلفية.
- يتم توصيل الدبوس 2 (VCC) بحافلة الطاقة +5 فولت، والاستهلاك الحالي صغير نسبيًا ويمكن تشغيل الشاشة من مثبت Arduino المدمج.
- تتصل الأطراف 4 و5 و6 بمخرجات Arduino الرقمية لتشكل الواجهة التسلسلية SPI:
الدبوس 4 – (RS) – يتوافق مع خط CS (على سبيل المثال 7)
الدبوس 5 – (RW) – يتوافق مع خط MOSI (على سبيل المثال 8)
الدبوس 6 – (E) – يتوافق مع خط SCK (على سبيل المثال 3)
يمكن أن تكون أرقام الاتصال بـ Arduino أي شيء، والشيء الرئيسي هو عدم نسيان الإشارة إليها بشكل صحيح في نص البرنامج عند تهيئة الشاشة.
- يتم توصيل الدبوس 15 (PSB) بالحافلة المشتركة.
- جهات الاتصال 19 (A) و 20 (K) هي مصدر طاقة الإضاءة الخلفية (+5V وGND، على التوالي). لضبط سطوع الإضاءة الخلفية، يمكنك استخدام مقاومة متغيرة تبلغ 10 كيلو أوم متصلة بين ناقل الطاقة وGND. يتم توفير الجهد من محركها إلى دبوس 19 من الشاشة.
البرنامج نفسه :
#تشمل "U8glib.h"U8GLIB_ST7920_128X64 u8g(3, 9, 8, U8G_PIN_NONE); // SPI E = 3، RW = 9، RS = 8
// روتين فرعي لتحديد الذاكرة الحرة
إنت فري رام () (
extern int __heap_start, *__brkval;
في التلفاز؛
return (int) &v - (__brkval == 0? (int) &__heap_start: (int) __brkval);
}إعداد باطل(باطل) (
u8g.setFont(u8g_font_6x10); // الخط
u8g.setRot180(); // اقلب الشاشة
تمثيلي(6, 115); // اضبط سطوع الشاشة (أنود الإضاءة الخلفية عند 6 سنون)
}حلقة باطلة(باطلة)(
u8g.firstPage();
يفعل(
u8g.setPrintPos(1, 12); // موضع
u8g.print("مرحبا!!!"); // إخراج النص
u8g.drawBox(0,22,128,9); // قم بطلاء المستطيل باللون الأبيض
u8g.setColorIndex(0); // حبر أبيض، خلفية سوداء
u8g.setPrintPos(1, 30); // موضع
u8g.print("كلمة..."); // إخراج النصU8g.setColorIndex(1); // حبر أبيض، خلفية سوداء
u8g.setPrintPos(1, 50); // موضع
u8g.print("بعد البدء ="); // إخراج النص
u8g.setPrintPos(85, 50); // موضع
u8g.print(ملي() / 1000); // إخراج عدد الثواني بعد البداية
u8g.setPrintPos(1, 64); // موضع
u8g.print(freeRam()); // إخراج مقدار الذاكرة المشغولة
) بينما(u8g.nextPage());تأخير (200)؛
}
الوقت الحقيقي على مدار الساعة DS1307
عنصر آخر لمحطة الطقس الخاصة بي. يطبق هذا الدرع ساعة في الوقت الفعلي. لقد طلبتهم على موقع eBay. أرسل البائع وشاح الساعة في صندوق كبير بشكل غير واقعي
كان داخل الصندوق ورقتين من الإعلانات مقاس A4 ومنديل ساعة ملفوفًا بالسيلوفان
أود أن أشير إلى أن الرسوم لا تتجاوز 2 روبل. عملة معدنية، وقياس الصندوق 13x15x5 سم.
كانت اللوحة معبأة في كيس مضاد للكهرباء الساكنة
شال قريب
اضطررت إلى العبث بهذه الوحدة. أولاً، كانت هناك صعوبات في الاتصال. وثانيا، لا يوجد كوارتز في هذه اللوحة. إذا كنت أعرف أنني سأقضي الكثير من الوقت في الوحدة، فمن المرجح أن أقوم بتجميعها بنفسي، لأن الإنترنت مليء بالمخططات. أبسط دائرة تحتوي على 4-5 مكونات.
فيما يتعلق بالاتصال. لقد وجدت مكتبة تقول إن واجهة I2C لا يمكن توصيلها بمدخلات Arduino التناظرية المعتادة (A4 و A5)، ولكن بأي مدخلات منفصلة. لقد فعلت ذلك كما هو مكتوب. في البداية لم ينجح أي شيء، ولكن بعد رقصة طويلة مع الدف بدأت الساعة. حسنًا، اعتقدت أن كل شيء قد انتهى، ولكن بعد أن حاولت توصيل نفس الوحدة باردوينو آخر، استمر الرقص مع الدف. لقد قضيت الكثير من الوقت في البحث عن حل لهذه المشكلة وفي كل مكان تقريبًا تمت الإشارة إلى اتصال غير صحيح أو عدم وجود مقاومات سحب في جهات اتصال SCL وSDA. كنت أرغب بالفعل في الدخول إلى اللوحة باستخدام مكواة لحام، ولكن في أحد المنتديات صادفت بالصدفة رمزًا يُقال إنه يربط SCL وSDA بمنافذ I2C القياسية في Arduino. بعد اتصال قياسي، كل شيء يعمل على الفور.
الآن عن الكوارتز. لا أعرف نوع الكوارتز الذي وضعه الصينيون هناك، لكن الساعات التي تحتوي على مثل هذا الكوارتز هربت لمدة 10-11 ثانية يوميًا. هذا الخطأ هو 5 دقائق شهريًا، وساعة واحدة سنويًا. ليست هناك حاجة لساعة مثل هذه. اضطررت إلى الاتصال بالإنترنت مرة أخرى والبحث عن كيفية إصلاح هذا الخطأ. الحل الأول الذي يظهر هو أنك تحتاج إلى تأريض الكوارتز. لقد فعلت ذلك - وكانت النتيجة صفرًا. لقد وجدت أيضًا في مكان ما أنني بحاجة إلى العثور على اللوحة الأم القديمة وإزالة ساعة الكوارتز من هناك. لقد فعلت ذلك - هناك نتيجة. الآن تعمل الساعة ليس بمقدار 10-11 ثانية، ولكن بمقدار 1.5 ثانية في اليوم. دعنا نقول فقط أنه أصبح أفضل، لكنه أبعد ما يكون عن المثالية. نظرًا لأنني لم أعد أرغب في العبث بمكواة اللحام، فقد تقرر ضبط الساعة برمجيًا، أي ضبط الساعة على القيمة المطلوبة مرة واحدة يوميًا. وبعد 10 أيام، لم تتأخر الساعة بما لا يزيد عن ثانية واحدة. الطريقة جيدة ولكن فقط عندما يكون جهاز المزامنة Arduino متصلاً بالطاقة، وإلا فإن الساعة تعمل على طاقة البطارية ولا تزال تنفد.
برنامج اختبار صغير:
#تتضمن "Wire.h"
#تعريف DS1307_I2C_ADDRESS 0x68 // SDA A4، SCL A5بايت decToBcd (بايت فال)
{
إرجاع ((val/10*16) + (val%10));
}بايت bcdToDec (بايت فال)
{
إرجاع ((val/16*10) + (val%16));
}باطلة setDateDs1307 (بايت ثانية، // 0-59
بايت دقيقة، // 0-59
ساعة البايت) // 0-99
{
Wire.write(0);
Wire.write(decToBcd(الثانية));
Wire.write(decToBcd(دقيقة));
Wire.write(decToBcd(hour));
Wire.endTransmission();
}getDateDs1307 باطلة (بايت * ثانية،
بايت * دقيقة،
بايت * ساعة)
{Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();Wire.requestFrom(DS1307_I2C_ADDRESS, 3);
*sec = bcdToDec(Wire.read());
*دقيقة = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read());
}الإعداد باطل()
{
بايت ثانية، دقيقة، ساعة؛
Wire.begin();
Serial.begin(9600);الثانية = 45؛
دقيقة = 5؛
ساعة = 16؛SetDateDs1307(ثانية، دقيقة، ساعة)؛
}حلقة فارغة()
{
بايت ثانية، دقيقة، ساعة؛GetDateDs1307(&ثانية، &دقيقة، &ساعة);
Serial.print (ساعة، ديسمبر)؛
Serial.print(":":);
Serial.print (دقيقة، DEC)؛
Serial.print(":":);
Serial.println(الثانية، ديسمبر)؛تأخير (1000)؛
}
مستشعر درجة الحرارة والرطوبة DHT11
لا يوجد شيء يمكن قوله عن هذا المستشعر. لن أستخدمه حتى إذا لم تكن الرطوبة ضرورية. لسوء الحظ، لم ألتقط صورة لها عندما استلمتها، لذلك لن تكون هناك أي صور. يمكن رؤية صور المستشعر أدناه، حيث قمت بتوصيله بـ Arduino. اتصال المستشعر بسيط (+، الإخراج الرقمي، -). عادة ما تكون أجهزة الاستشعار مصنوعة من أربعة دبابيس. مع عامل الشكل هذا، فإن الدبوس الثالث غير متصل بأي شيء.
يمكنك استخدام المكتبة للاتصال بـ Arduino. يمكنك تنزيله.
برنامج اختبار صغير مع إخراج المعلومات على شاشة LCD 1602:
// تضمين رمز المكتبة:
#يشمل
#يشمل// أعلن عن الكائنات
dht11 dht11;
شاشات الكريستال السائل السائل (12، 11، 6، 5، 4، 3)؛#تعريف DHT11PIN 7
كثافة العمليات أنا؛الإعداد باطل()
{
شاشات الكريستال السائل. تبدأ (16، 2)؛
شاشات الكريستال السائل.طباعة("الحالة: ');
أنا=0;
}حلقة فارغة()
{
int chk = DHT11.read(DHT11PIN);
شاشات الكريستال السائل.setCursor(8, 0);
التبديل (الفصل)
{
الحالة 0: شاشات الكريستال السائل.طباعة("موافق"); استراحة؛//lcd.setCursor(11, 0); شاشات الكريستال السائل. طباعة (ملي () / 2000)؛ استراحة؛
الحالة -1: شاشة LCD.print("خطأ في المجموع الاختباري"); مير(); استراحة؛
الحالة -2: شاشة LCD.print("خطأ في المهلة"); مير(); استراحة؛
الافتراضي: شاشات الكريستال السائل.طباعة("خطأ غير معروف"); مير(); استراحة؛
}
تأخير (500)؛
شاشات الكريستال السائل.setCursor(15, 0);
التبديل (ط)
{
الحالة 0: شاشة LCD.print("^"); شاشات الكريستال السائل.setCursor(15, 1); شاشات الكريستال السائل.طباعة("");استراحة;
الحالة 1: شاشة LCD.print("v"); شاشات الكريستال السائل.setCursor(15, 1); شاشات الكريستال السائل.طباعة("");استراحة;
الافتراضي: LCD.setCursor(15, 1); شاشات الكريستال السائل. طباعة ("E")؛ استراحة؛
}
أنا=أنا+1;
إذا (i>1) i=0;
شاشات الكريستال السائل.setCursor(0, 1);
شاشات الكريستال السائل.طباعة("H =");
شاشات الكريستال السائل.setCursor(2, 1);
شاشات الكريستال السائل.طباعة ((تعويم)DHT11.الرطوبة، 0)؛
شاشات الكريستال السائل.setCursor(4, 1);
شاشات الكريستال السائل.طباعة("%");
شاشات الكريستال السائل.setCursor(8, 1);
شاشات الكريستال السائل.طباعة ("T =")؛
شاشات الكريستال السائل.setCursor(10, 1);
شاشات الكريستال السائل. طباعة ((تعويم) DHT11.درجة الحرارة، 0)؛
شاشات الكريستال السائل.setCursor(12, 1);
شاشات الكريستال السائل.طباعة("C");باطلة مير ()
{
شاشات الكريستال السائل.setCursor(2, 1);
شاشات الكريستال السائل.طباعة("**");
شاشات الكريستال السائل.setCursor(10, 1);
شاشات الكريستال السائل.طباعة("**");
أنا = 5؛
}
يبدو أنني كتبت عن جميع المكونات. كل ما تبقى هو جمع كل شيء في كل واحد.
عفوًا، لقد نسيت تقريبًا! من أجل تجميع الجهاز، تحتاج إلى حالة. أنا أيضا أمرت القضية على موقع ئي باي. وتبين أن البائع من إنجلترا. وصلت الطرود بسرعة، ولكن لم ألتقط صورا لها. جميع صور القضية أدناه.
أولاً، قمت بتجميع كل شيء على الطاولة باستخدام أسلاك خاصة. لقد كتبت برنامج اختبار وقمت بتحميله على وحدة التحكم.
في الواقع، اللون الأزرق للإضاءة الخلفية أكثر سطوعًا. حتى عند الحد الأدنى من السطوع (سطوع = 5)، يتم إضاءة الإطار.
لتجميع كل شيء لاسلكيًا، تقرر إنشاء لوحة أم صغيرة، ووضع لوحات ودروع Arduino على الموصلات. إذا حدث شيء ما، فيمكن إزالتها بسرعة وسهولة. قررت أيضًا توصيل شاشة LCD وأزرار التحكم بالموصلات، فقط من أجل لحام مستشعر درجة الحرارة الموجود على الأسلاك.
هكذا خرج الوشاح
في الصورة الأخيرة لم أغسل التدفق بالكامل. لقد قمت بلصق المطاط المسامي أسفل الدروع بجوار الموصلات بحيث يكون هناك بعض الدعم على الأقل. على الرغم من أن الدروع الموجودة في الموصلات الموجودة على جهات الاتصال صامدة بشكل جيد.
اللوحة الأم مع الدروع المثبتة ولوحة Arduino.
هذا ما يبدو عليه الاتصال الكامل باللوحة الأم
بدلا من الأزرار، استخدمت درعا محلي الصنع ملحوم على اللوح. لقد استخدمت أزرارًا من الفئران القديمة كأزرار.
كما ترون، انخفض عدد الأسلاك.
المشكلة الرئيسية في الوضع في العلبة هي قطع أخدود ناعم لشاشة LCD. بغض النظر عن مدى صعوبة محاولتي، إلا أن الأمر لم ينجح بشكل مثالي. كانت الفجوات في بعض الأماكن تزيد قليلاً عن 1 مم. لجعل كل شيء يبدو أنيقًا، أخذت مادة مانعة للتسرب لحوض السمك الأسود وملأت جميع الشقوق، وفي نفس الوقت قمت بتوصيل الشاشة بهذا المادة المانعة للتسرب. بعد أن يجف مانع التسرب، قمت بقطع الفائض من الخارج. في الضوء الساطع، يكون مانع التسرب مرئيا، ولكن في الضوء العادي، يتم دمج كل شيء مع الجسم.
هذا هو شكل العلبة من الداخل مع شاشة LCD واللوحة الأم المثبتة.
هذا ما يبدو عليه من الخارج في الضوء الساطع (آسف بشأن بصمات الأصابع، لقد رأيتها عندما كنت أفرز الصور).
لقد فكرت لفترة طويلة في كيفية تركيب الأزرار في العلبة، والأهم من ذلك، ما هي الأزرار التي يجب استخدامها...
في متاجر الراديو الإلكترونية، أحبوا الزر ذو الدبوس الطويل والنصائح التي تناسب هذا الدبوس. تستخدم هذه الأزرار لحام اللوحة. كل شيء سيكون على ما يرام، ولكن لديهم ناقص - السكتة الدماغية الضغط صغيرة جدا وبصوت عال.
كان علينا وضع الأزرار على مرحلتين: الأولى هي وضع الأزرار على اللوحة، والثانية هي تركيب هذه اللوحة على لوحة أخرى. ثم ضع كل هذا في الجسم على الأدلة.
هذا ما يبدو عليه الوشاح ذو الأزرار:
هذا ما تبدو عليه لوحة الحامل:
هنا يمكنك رؤية الأدلة التي يتم فيها إدراج اللوحة ذات الأزرار. تم لحام بعض العناصر لإضفاء الصلابة على اللوحة.
الآن نضع كل شيء في الجسم
بدون أزرار الاتصال:
مع اتصال زر:
أغلق العلبة وقم بتشغيلها. كل شيء يعمل بشكل رائع، الأزرار تعمل كما ينبغي.
وفي النهاية أنشر فيديو قصير للجهاز وهو يعمل في أوضاع مختلفة:
http://www.youtube.com/watch?v=KsiVaUWkXNA&feature=youtu.be
لمن لم يشاهد الفيديو هنا هذا هو الرابط
لقد حان الوقت لإنهاء المراجعة.
سأكتب قليلا عن البرنامج، ثم بعض الاستنتاجات الموجزة. عندما كتبت البرنامج، لم أكن أعتقد أنني سأصل بسرعة إلى الحد الأقصى البالغ 30.720 بايت.
اضطررت إلى تحسين الكود. لقد قمت بنقل العديد من أجزاء التعليمات البرمجية إلى الإجراءات الفرعية. لم أكن أعتقد أبدًا أن عبارة حالة التبديل... في النموذج المترجم تشغل مساحة أكبر من عدة عبارات if...else. الإعلان الصحيح للمتغيرات يوفر أيضًا المساحة. إذا قمت بإعلان مصفوفة طويلة، على الرغم من إمكانية الحصول عليها بالبايت، فإن تجاوز الذاكرة يصل إلى 500 بايت، اعتمادًا على حجم المصفوفة. عندما تكتب برنامجًا، فإنك لا تفكر فيه، وفقط لاحقًا، عندما تقوم بتحليل البرنامج، تدرك أنك ارتكبت بعض الأخطاء، وتبدأ في تحسين الكود. بعد حل المشكلات المتعلقة بحجم البرنامج، واجهت قيودًا على ذاكرة الوصول العشوائي (RAM). تم التعبير عن ذلك في حقيقة أن البرنامج بدأ في التجميد بعد التحميل. اضطررت إلى تقديم روتين فرعي لحساب ذاكرة الوصول العشوائي المجانية. نتيجة لذلك، اضطررت إلى التخلي عن خوارزمية واحدة للتنبؤ بالطقس، حيث يجب أن تعرض الرموز على الشاشة. تعمل الخوارزمية نفسها، ولكن يجب تسجيل مخرجات الرموز. لا تزال لدي أفكار حول كيفية تحسين الكود، ولكن في المستقبل القريب سأترك الجهاز يعمل كما هو لتقييم أدائه وتحديد جميع الأخطاء.
الآن بعض الاستنتاجات
السلبيات
1) السعر. مبرر هذا العيب هو أن الهواية ليست رخيصة أبدًا.
الايجابيات
1) الأداء الرائع للجهاز
2) تقتصر الوظائف المتزايدة فقط على وحدة التحكم المستخدمة ورغبتك الخاصة
3) المتعة الجمالية من التأمل والرضا المعنوي من حقيقة أنني قمت أخيرًا بتجميع هذا الجهاز وإكماله
تُستخدم أجهزة استشعار درجة الحرارة كجزء من أجهزة الإنذار الأمنية أو أنظمة المنزل الذكي. وظيفتهم الرئيسية هي التحكم في درجة الحرارة في الغرفة. يجب عليك شراء مستشعر درجة حرارة GSM عندما تكون هناك حاجة لجمع المعلومات وإرسالها إلى جهاز إنذار مركزي. في أنظمة المنزل الذكي، يتيح لك الجهاز معرفة معلومات حول المناخ الداخلي، الذي يؤثر على التشغيل التلقائي للأجهزة الكهربائية أو إيقاف تشغيلها. يتيح التحكم في المبنى عبر نظام GSM، والذي يعد نظام الإنذار المزود بأجهزة استشعار لدرجة الحرارة جزءًا لا يتجزأ منه، للمالك توفير الوقت والمال بأكبر قدر ممكن من الكفاءة. كل ما عليك فعله هو شراء بطاقة SIM وتثبيتها، وتوصيل المستشعر بمأخذ كهربائي.
إذا كنت تصدق مراجعات الخبراء حول موازين الحرارة وأجهزة إنذار GSM المزودة بأجهزة استشعار لدرجة الحرارة، فيمكننا أن نستنتج أن أنظمة التحكم في درجة الحرارة وتنظيمها هي أحدث الطرق للتحكم في مناخ الغرفة. لا يقتصر الأمر على التدفئة أو تكييف الهواء فحسب، بل يتعلق أيضًا بالقدرة على تصفية الهواء وترطيبه.
تم تصميم محطة الأرصاد الجوية في المقام الأول لمراقبة الطقس وعرض درجة الحرارة والرطوبة والضغط الجوي الحالية. الشيء مناسب جدًا للصيادين. قررت إنشاء محطة أرصاد جوية خاصة بي تعتمد على الأردوينو، ولكن مع عرض البيانات على الهاتف المحمول.
مبدأ تشغيل التطبيق هو أننا نقوم بتشغيله على هاتف يعمل بنظام التشغيل Android، ونتصل بلوحة Arduino عبر البلوتوث، ومن خلال النقر على الرموز، نحصل على عرض للبيانات المختلفة.
مبدأ تشغيل محطة الأرصاد الجوية بسيط. عند الاستلام من الهاتف 1، نقوم باستقصاء مستشعر درجة الحرارة DS18B20 الموجود بالخارج وإرسال البيانات إلى الهاتف، عند الاستلام 2، نقوم باستقصاء مستشعر درجة الحرارة DS18B20 الموجود في الغرفة وإرسال البيانات إلى الهاتف. عندما نستقبل 3 نقوم باستقصاء مستشعر BMP085 وعندما نستقبل 4 نقوم باستقصاء مستشعر الرطوبة ونرسل البيانات أيضًا.
سأجيب على الفور على السؤال "لماذا يتم عرض البيانات على الهاتف المحمول؟" إنه أكثر ملاءمة بالنسبة لي، خاصة وأنني أقوم بالتوفير عند شراء شاشة العرض وشراء الأزرار والذاكرة الداخلية لوحدة التحكم الدقيقة. لا يزال الكسل هو محرك التقدم.
لقطات من شاشة الهاتف المحمول
قياس درجة الحرارة الخارجية بالدرجات المئوية:
قياس درجة حرارة الغرفة بالدرجة المئوية:
قياس الضغط الجوي الخارجي بالملليمتر. غ. فن.:
قياس رطوبة الهواء بنسبة %
حسنًا، الآن، بعد مراجعة قصيرة للعمل، دعنا ننتقل إلى الجزء الفني من المشروع.
مخططات اتصال أجهزة الاستشعار
مخطط اتصال لأجهزة استشعار درجة الحرارة DS18B20
يجب توصيل أجهزة استشعار درجة الحرارة بالتوازي.
مخطط اتصال جهاز الاستشعار BMP085:
مخطط اتصال جهاز الاستشعار DHT11:
مخطط اتصال لوحدة البلوتوث HC-05:
رسم
#يشمل
تقدم هذه المقالة مشروعًا لمحطة أرصاد جوية مستقلة تعمل في الوقت الفعلي. يقوم الجهاز بجمع البيانات التناظرية أو الرقمية ويرسلها إلى خادم الويب عبر قناة اتصال GPRS. إذا كنت تستخدم لوحة شمسية وبطارية لها، فيمكن جعل المحطة مستقلة تمامًا. يدعم الجهاز 3 مدخلات تناظرية أو رقمية. قلب الدائرة هو المتحكم الدقيق PIC16F877A. يتفاعل المتحكم الدقيق أيضًا مع وحدة GSM/GPRS SIM900أو SIM300، الموجود في الجزء الخلفي من لوحة الدوائر المطبوعة.
في البداية، تم تصميم الجهاز لقياس تدفق الرياح من أجل جمع قاعدة بيانات لطاقة تدفق الرياح لمواقع مختلفة. في المستقبل، سيسمح لك ذلك باختيار الموقع الأمثل لمولد الرياح.
يتم نقل البيانات إلى خادم الويب باستخدام طلب GET عادي. هذه هي أبسط طريقة لنقل البيانات. مصادر التعليمات البرمجية موجودة على جيثب، لا يوجد شيء معقد فيها.
رسم تخطيطي لوحدة GSM:
لقد اخترت SIM900/300 المشهور كوحدة GSM. يتم توصيله باستخدام UART ويتم التفاعل معه باستخدام أوامر AT. جهد إمداد الوحدة هو 3.6 فولت. هوائي خارجي متصل بالوحدة. تحتوي الوحدة على وحدة تحكم مدمجة في الشاحن، وهي مفيدة جدًا عند استخدام البطاريات واللوحة الشمسية أو مولد الرياح لإعادة شحنها.
تستخدم الدائرة مؤشر LED LED1، الذي يوضح حالة GSM (يومض). يتم تشغيل/إيقاف الوحدة باستخدام الزر S3.
ملاحظة 1: أثناء تطوير المشروع، تم إيقاف وحدة SIM300 واستبدالها بوحدة SIM900 الأحدث. تم تصميم الرسم البياني أعلاه لبطاقة SIM300؛ وبالنسبة لوحدة SIM900، ستتم إزالة بعض العناصر بين الوحدة وبطاقة SIM (انظر أوراق البيانات).
ملاحظة 2. تم تصميم المحول S3 لتشغيل/إيقاف تشغيل وحدة GSM، ولكن يمكن استبداله بترانزستور متصل بمنفذ وحدة التحكم الدقيقة. سيسمح لك ذلك بتشغيل وحدة GSM أو إيقاف تشغيلها باستخدام أمر من MK. هذا هو الحل الصحيح لتصميم الدوائر.
ملاحظة 3: تعمل الوحدة بشكل صحيح عندما يتم تطبيق الجهد الكهربي> 4 فولت على طرف Vbat.
مخطط محطة الطقس مع MK PIC 16F877A:
لذا، فإن الشيء الرئيسي هو المتحكم الدقيق PIC 16F877A الذي يعمل بتردد 16 ميجاهرتز. يتم تشغيل MK بواسطة Vbat تمامًا مثل وحدة GSM. يتم استخدام الأطراف RA0,1,2 كمدخلات تناظرية. يتم تحويل جهد الدخل من هذه المسامير باستخدام داخلي. ADC مع Vref=3.1V، والذي يتم الحصول عليه باستخدام صمام ثنائي زينر 3.1V. تقوم موصلات الإدخال أيضًا بإخراج Vbat وGND لتشغيل أجهزة الاستشعار الخارجية (إذا لزم الأمر). يستخدم الترانزستور Q3 (BC547) للتحكم في سطوع PWM لشاشة LCD. يتم استخدام الزر S4 لإعادة ضبط وحدة التحكم الدقيقة، ويستخدم الزر R1 كمقاوم سحب. يستخدم الجهاز أيضًا موصل PIC-ICSP لتوفير إمكانيات البرمجة داخل الدائرة.
شاشة ال سي دي 16×2 HD44780:
يتم استخدام شاشة LCD لعرض معلومات الحالة. تستخدم الدائرة مفتاح Power-LCD لإيقاف الإضاءة الخلفية للشاشة، مما يوفر استهلاك الطاقة للدائرة. أيضًا، يتم توصيل الإخراج من المفتاح إلى وحدة التحكم الدقيقة LCD-INT بحيث يعرف MK متى يتم تشغيل شاشة LCD (ينفذ وحدة التحكم الدقيقة إجراء تهيئة لشاشة LCD لإخراج المعلومات إليها). بفضل هذا، يمكنك فصل وتوصيل وحدة LCD أثناء تشغيل دائرة محطة الطقس الرئيسية.
بعض الصور للجهاز :
المشروع على github (أحدث إصدار من البرامج الثابتة، وملفات PCB، وPDF، وما إلى ذلك)