สถานีตรวจอากาศ Arduino พร้อมกราฟความดัน สถานีตรวจอากาศภายในบ้านบน Arduino และส่งข้อมูลไปที่ "People's Monitoring"

สถานีตรวจอากาศทำเอง

มันเป็นช่วงเย็น ไม่มีอะไรทำหลังจากปีใหม่ ตามปกติในช่วงวันหยุดปีใหม่ฤดูหนาวฉันต้องการใช้สมองและมือกับสิ่งที่มีประโยชน์และสร้างสรรค์ ในช่วงวันหยุดปีใหม่เหล่านี้ ฉันตัดสินใจสร้างสถานีตรวจอากาศด้วยมือของตัวเอง ฉันเริ่มเตรียมตัวล่วงหน้า ซื้อและประกอบส่วนประกอบทั้งหมดก่อนปีใหม่ และเขียนโปรแกรมหลักในช่วงวันหยุด

(ใต้คัทมีรูปเยอะมาก!)

ก่อนอื่น ฉันจะอธิบายส่วนประกอบต่างๆ ฉันจะไม่ให้ลิงก์ เนื่องจากบน eBay (ใน บัญชีส่วนตัว) สินค้าเข้าไปในที่เก็บถาวร ฉันซื้อส่วนประกอบหลายอย่างอย่างสบายๆ บนอีเบย์ ฉันลองประมูลเป็นครั้งแรก ก่อนที่ฉันจะซื้อ "ซื้อเลย" เสมอ ฉันจะพูดอะไรได้บ้างถ้าคุณไม่รีบไปซื้อของ คุณสามารถซื้อส่วนประกอบบางอย่างได้ถูกกว่า (บางครั้งความแตกต่างก็เป็นสองเท่า)

เซ็นเซอร์วัดแรงดัน VMR085
นี่คือเซ็นเซอร์หลัก เมื่อฉันเห็นมันบน eBay ฉันรู้ว่าฉันต้องการสร้างสถานีตรวจอากาศที่บ้าน
เซ็นเซอร์มาในซองธรรมดาซึ่งมีแผ่นกันกระแทกอยู่ข้างใน

ภายในซองจดหมายมีนามบัตรของผู้ขายและเซ็นเซอร์ บรรจุในถุงป้องกันไฟฟ้าสถิตและห่อด้วยพลาสติกกันกระแทกอีกชั้น

ถุงป้องกันไฟฟ้าสถิตถูกปิดผนึกเพื่อไม่ให้ความชื้นระหว่างการบินคุกคามเซ็นเซอร์

เรานำเซ็นเซอร์ออกมา ด้านหนึ่งมีหน้าสัมผัสแบบบัดกรีซึ่งสอดเข้าไปในโฟมเพื่อป้องกันไม่ให้โค้งงอ อีกด้านหนึ่งมีเซ็นเซอร์และเครื่องหมายหน้าสัมผัส




ทุกอย่างจะเรียบร้อยดี แต่มีการใช้เครื่องหมายหน้าสัมผัสในภาพสะท้อนในกระจก
เซ็นเซอร์เชื่อมต่อผ่านบัส I2C และใช้พลังงาน 3.3 V นั่นคือสำหรับการทำงานปกติคุณต้องใช้สายไฟ 4 เส้น (+, -, SDA, SCL)
คุณสามารถสอบปากคำเซ็นเซอร์ได้ 2 วิธี: ผ่านห้องสมุด หรือใช้ฟังก์ชันโดยตรงในภาพร่าง
โปรแกรมตัวอย่าง:

#รวม

#define BMP085_ADDRESS 0x77 // ที่อยู่ I2C ของ BMP085

Const ถ่าน OSS ที่ไม่ได้ลงนาม = 0; // การตั้งค่าการสุ่มตัวอย่างมากเกินไป

// ค่าการสอบเทียบ
อินท์ ac1;
อินท์ ac2;
อินท์ ac3;
int ac4 ที่ไม่ได้ลงนาม;
int ac5 ที่ไม่ได้ลงนาม;
int ac6 ที่ไม่ได้ลงนาม;
อินท์ b1;
อินท์บี2;
int เมกะไบต์;
อินท์ เอ็มซี;
อินท์ เอ็มดี;

อุณหภูมิสั้น
แรงกดดันที่ยาวนาน

การตั้งค่าเป็นโมฆะ()
{
อนุกรมเริ่มต้น(9600);
Wire.begin();
bmp085การสอบเทียบ();
}

เป็นโมฆะวน()
{
อุณหภูมิ = bmp085GetTemperature(bmp085ReadUT());
ความดัน = bmp085GetPressure(bmp085ReadUP());
Serial.print("อุณหภูมิ: „);
Serial.พิมพ์ (อุณหภูมิ/10.0,DEC);
Serial.println("C");
Serial.print("ความดัน: „);
Serial.พิมพ์ (ความดัน/133.322,DEC);
Serial.println("มม.ปรอท");
อนุกรม.println();
ล่าช้า (1,000);
}

โมฆะ bmp085 การสอบเทียบ ()
{
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 (ไม่ได้ลงนาม int ut)
{
ยาวx1,x2;
x1 = (((ยาว)ut - (ยาว)ac6)*(ยาว)ac5) >> 15;
x2 = ((ยาว)ไมโครกรัม<< 11)/(x1 + md);
b5 = x1 + x2;

กลับ ((b5 + 8)>>4);
}

Long bmp085GetPressure (ไม่ได้ลงชื่อนานขึ้น)
{
ยาว x1, x2, x3, b3, b6, p;
ยาวที่ไม่ได้ลงนาม b4, b7;
b6 = b5 - 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 = ((ยาวไม่ได้ลงนาม)(ขึ้น - b3) * (50000>>OSS));
ถ้า (b7< 0x80000000)
พี = (ข7<<1)/b4;
อื่น
พี = (b7/b4)<<1;
x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>>16;
x2 = (-7357 * พี)>>16;
พี += (x1 + x2 + 3791)>>4;
กลับพี;
}

// อ่าน 1 ไบต์จาก BMP085 ที่ "ที่อยู่"
ถ่าน bmp085Read (ที่อยู่ถ่านที่ไม่ได้ลงนาม)
{
ข้อมูลถ่านที่ไม่ได้ลงนาม

Wire.write (ที่อยู่);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 1);
ในขณะที่(!Wire.available())
;
กลับ Wire.read();
}

Int bmp085ReadInt (ที่อยู่ถ่านที่ไม่ได้ลงนาม)
{
ถ่าน msb ที่ไม่ได้ลงนาม, lsb;
Wire.beginTransmission (BMP085_ADDRESS);
Wire.write (ที่อยู่);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 2);
ในขณะที่(Wire.available()<2)
;
msb = Wire.read();
lsb = Wire.read();
กลับ (int) msb<<8 | lsb;
}

// อ่านค่าอุณหภูมิที่ไม่มีการชดเชย
int bmp085ReadUT() ที่ไม่ได้ลงนาม
{
int ut ที่ไม่ได้ลงนาม;
// เขียน 0x2E ลงในรีจิสเตอร์ 0xF4
// นี่ขอการอ่านอุณหภูมิ
Wire.beginTransmission (BMP085_ADDRESS);
ลวด.write(0xF4);
ลวดเขียน(0x2E);
Wire.endTransmission();
// รออย่างน้อย 4.5ms
ล่าช้า(5);
// อ่านสองไบต์จากรีจิสเตอร์ 0xF6 และ 0xF7
ut = bmp085ReadInt(0xF6);
กลับ;
}

// อ่านค่าความดันที่ไม่มีการชดเชย
bmp085ReadUP แบบยาวที่ไม่ได้ลงนาม ()
{
ถ่าน msb, lsb, xlsb ที่ไม่ได้ลงนาม;
ไม่ได้ลงนามนานขึ้น = 0;
// เขียน 0x34+(OSS<<6) into register 0xF4
// ขอการอ่านค่าความดันด้วยการตั้งค่าการสุ่มตัวอย่างเกิน
Wire.beginTransmission (BMP085_ADDRESS);
ลวด.write(0xF4);
Wire.write(0x34 + (OSS<<6));
Wire.endTransmission();
// รอการแปลง เวลาหน่วงขึ้นอยู่กับ OSS
ความล่าช้า(2 + (3<// อ่านรีจิสเตอร์ 0xF6 (MSB), 0xF7 (LSB) และ 0xF8 (XLSB)
Wire.beginTransmission (BMP085_ADDRESS);
ลวด.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 รูเบิลไว้ข้าง Arduino

บอร์ดควบคุมปิดตัวลง



สาย USB อย่างดี มีวงแหวนเฟอร์ไรต์ Arduino ใช้พลังงานจากสาย USB สามารถดาวน์โหลดสภาพแวดล้อมการพัฒนาได้ (หน้าดาวน์โหลด) ภาษาก็เหมือนกับภาษา "C" ไม่มีปัญหาในการใช้งานเพราะฉันเขียนโปรแกรมในที่ทำงานเยอะมาก

หน้าจอแอลซีดี
ที่ทำงาน ฉันพบหน้าจอ LCD 1602 ที่ใช้ร่วมกันได้อยู่ในถังขยะ ฉันต้องแก้ไขการเชื่อมต่อ เนื่องจากฉันไม่พบเอกสารข้อมูลสำหรับการเชื่อมต่อนั้น เป็นผลให้จอ LCD เริ่มทำงาน

แต่หลังจากใช้งานไปไม่นาน ฉันสังเกตเห็นว่าหน้าจอนี้ไม่เพียงพอสำหรับฉัน และไม่สามารถแสดงข้อมูลเพิ่มเติมได้ เนื่องจากหน้าจอนี้มีเพียง 2 บรรทัด บรรทัดละ 16 ตัวอักษร ในตอนแรกดูเหมือนว่าพารามิเตอร์เหล่านี้เพียงพอแล้ว แต่เมื่อคุณเริ่มการเขียนโปรแกรม คุณจะพบว่าค่าสูงสุดที่คุณสามารถบีบได้คือ 3-4 พารามิเตอร์ และถ้าคุณสร้างเมนู (ฉันกำลังคิดที่จะทำเมนูบนหน้าจอนี้) ก็เหลือพารามิเตอร์ว่างเพียง 1-2 ตัวเท่านั้น
เป็นผลให้ฉันเริ่มมองหาหน้าจออื่น ตอนแรกฉันดูหน้าจอกราฟิกของ Nokia 3310 อย่างใกล้ชิดและยังเข้าร่วมการประมูลใน eBay เพื่อซื้อมันด้วยซ้ำ แต่มันก็ไม่ได้ผล (ซึ่งฉันดีใจมาก) ดังนั้นฉันจึงต้องละทิ้งหน้าจอนี้ ตอนนี้ฉันเข้าใจแล้วว่ามันจะเล็กเกินไปสำหรับจุดประสงค์ของฉันเนื่องจากมีบางอย่างที่จะเปรียบเทียบ
ในขณะที่สุ่มดูโล่บน Arduino ฉันบังเอิญเจอหน้าจอกราฟิก 12864 บนคอนโทรลเลอร์ ST7920 หน้าจอนี้มีขนาดที่เหมาะสมและมีความละเอียดเหมาะสมกับความต้องการของฉัน (128x64) นั่นคือคุณสามารถวาง 6-7 บรรทัดจาก 20 ตัวอักษรในแบบอักษรที่อ่านได้ตามปกติ เนื่องจากหน้าจอเป็นแบบกราฟิก นอกเหนือจากข้อความแล้ว จึงสามารถวางกราฟิกเป็นแบบอักษรต่างๆ ได้ กล่าวโดยสรุป นี่คือสิ่งที่ฉันต้องการจริงๆ ทุกอย่างปรากฏบนหน้าจอนี้ ดังนั้นฉันจึงอดใจไม่ไหวและสั่งมัน
พัสดุมาถึงอย่างรวดเร็วและได้รับการบรรจุตามมาตรฐาน: ซองกันกระแทก ด้านในมีแผ่นกันกระแทกอีกชั้นและมีตะแกรงในถุงป้องกันไฟฟ้าสถิต:






เพื่อประมาณขนาด ฉันวางเหรียญ 1 รูเบิลไว้ข้างจอ LCD




หากต้องการเชื่อมต่อหน้าจอกับ Arduino อย่างรวดเร็ว ฉันจึงบัดกรีสายหน้าสัมผัสเข้ากับพิน LCD สามารถเชื่อมต่อ LCD ผ่านทางบัสอนุกรมหรือบัสขนานได้ ฉันเลือกตัวเลือกแรกเนื่องจากมีผู้ติดต่อ Arduino ฟรีอยู่แล้วไม่กี่ราย
การเชื่อมต่อ (นำมาจากเว็บ):

- ขา 1 (GND) ต่อเข้ากับบัสทั่วไป
- พิน 2 (VCC) เชื่อมต่อกับบัสจ่ายไฟ +5V และการสิ้นเปลืองกระแสไฟค่อนข้างน้อย และจอแสดงผลสามารถจ่ายไฟจากโคลง 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 kOhm ที่เชื่อมต่อระหว่างพาวเวอร์บัสและ GND แรงดันไฟฟ้าจากเครื่องยนต์ถูกจ่ายไปที่พิน 19 ของจอแสดงผล
ตามคำแนะนำเหล่านี้ ฉันเชื่อมต่อทุกอย่างแล้ว ยกเว้นไฟแบ็คไลท์ ฉันใช้ Arduino PWM เพื่อจ่ายไฟแบ็คไลท์
ในการเชื่อมต่อ LCD กับ Arduino โดยทางโปรแกรมจะใช้ไลบรารี u8glib คุณสามารถดาวน์โหลดได้ หากมีปัญหาในการดาวน์โหลด ฉันสามารถอัปโหลดไลบรารี่ไปที่ narod.ru ได้
ไลบรารี่นั้นไม่ซับซ้อนและช่วยให้คุณสามารถแสดงข้อความในแบบอักษรต่าง ๆ วาดเส้น วาดรูปทรงเรขาคณิตง่ายๆ (สี่เหลี่ยม วงกลม) และแสดงรูปภาพของคุณเองที่เตรียมไว้ในลักษณะพิเศษ โดยหลักการแล้ว เครื่องมือนี้เพียงพอสำหรับงานส่วนใหญ่
นี่คือผลลัพธ์ของโปรแกรมง่ายๆ:

ตัวโปรแกรมเอง:

#รวม "U8glib.h"

U8GLIB_ST7920_128X64 u8g(3, 9, 8, U8G_PIN_NONE); // SPI E = 3, RW = 9, RS = 8

// รูทีนย่อยสำหรับกำหนดหน่วยความจำว่าง
int freeRam() (
ภายนอก int __heap_start, *__brkval;
อินท์วี;
กลับ (int) &v - (__brkval == 0? (int) &__heap_start: (int) __brkval);
}

การตั้งค่าเป็นโมฆะ(เป็นโมฆะ) (
u8g.setFont(u8g_font_6x10); // แบบอักษร
u8g.setRot180(); //พลิกหน้าจอ
อะนาล็อกเขียน(6, 115); // ตั้งค่าความสว่างหน้าจอ (ขั้วบวกแบ็คไลท์ที่ 6 พิน)
}

โมฆะวน(เป็นโมฆะ) (
u8g.หน้าแรก();
ทำ (

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(มิลลิวินาที() / 1,000); // ส่งออกจำนวนวินาทีหลังจากเริ่มต้น
u8g.setPrintPos(1, 64); // ตำแหน่ง
u8g.print(ฟรีแรม()); // ส่งออกจำนวนหน่วยความจำที่ถูกครอบครอง
) ในขณะที่(u8g.nextPage());

ความล่าช้า(200);
}

นาฬิกาเรียลไทม์ DS1307
องค์ประกอบอื่นสำหรับสถานีตรวจอากาศของฉัน เกราะป้องกันนี้ใช้นาฬิกาแบบเรียลไทม์ ฉันสั่งพวกมันบนอีเบย์ ผู้ขายส่งผ้าพันคอนาฬิกามาในกล่องขนาดใหญ่ที่ไม่สมจริง


ภายในกล่องมีแผ่นโฆษณา A4 สองแผ่น และผ้าเช็ดหน้านาฬิกาห่อด้วยกระดาษแก้ว


ฉันต้องการทราบว่าค่าธรรมเนียมไม่เกิน 2 รูเบิล เหรียญและกล่องขนาด 13x15x5 ซม.
กระดานถูกบรรจุในถุงป้องกันไฟฟ้าสถิต

ผ้าคลุมไหล่อย่างใกล้ชิด



ฉันต้องคนจรจัดกับโมดูลนี้ ประการแรก มีปัญหาในการเชื่อมต่อ และประการที่สอง ไม่มีควอตซ์บนกระดานนี้ ถ้าฉันรู้ว่าฉันจะใช้เวลามากกับโมดูล ฉันคงจะประกอบมันขึ้นมาเอง เนื่องจากอินเทอร์เน็ตเต็มไปด้วยไดอะแกรม วงจรที่ง่ายที่สุดประกอบด้วยส่วนประกอบ 4-5 ชิ้น
เกี่ยวกับการเชื่อมต่อ ฉันพบห้องสมุดที่บอกว่าอินเทอร์เฟซ I2C สามารถเชื่อมต่อได้ไม่ใช่กับอินพุตอะนาล็อก Arduino ปกติ (A4 และ A5) แต่กับอินพุตแยกส่วนใด ๆ ฉันทำตามที่เขียนไว้ ในตอนแรกไม่มีอะไรทำงาน แต่หลังจากเต้นรำกับแทมบูรีนมาเป็นเวลานาน นาฬิกาก็เริ่มทำงาน ฉันคิดว่าแค่นั้นปัญหาก็จบลงแล้ว แต่หลังจากที่ฉันพยายามเชื่อมต่อโมดูลเดียวกันกับ Arduino อื่น การเต้นรำกับแทมบูรีนก็ดำเนินต่อไป ฉันใช้เวลาส่วนใหญ่มองหาวิธีแก้ไขปัญหานี้ และเกือบทุกที่พบว่ามีการเชื่อมต่อที่ไม่ถูกต้องหรือไม่มีตัวต้านทานแบบดึงขึ้นบนหน้าสัมผัส SCL และ SDA ฉันอยากจะเข้าไปในบอร์ดด้วยหัวแร้งแล้ว แต่ในฟอรัมหนึ่งฉันบังเอิญเจอรหัสที่มีการกล่าวกันว่าเชื่อมต่อ SCL และ SDA กับพอร์ต I2C มาตรฐานบน Arduino หลังจากการเชื่อมต่อแบบมาตรฐาน ทุกอย่างทำงานได้ทันที
ตอนนี้เกี่ยวกับควอตซ์ ฉันไม่รู้ว่าคนจีนใส่ควอตซ์แบบไหน แต่นาฬิกาที่มีควอตซ์แบบนั้นวิ่งหายไป 10-11 วินาทีต่อวัน ข้อผิดพลาดนี้คือ 5 นาทีต่อเดือน และ 1 ชั่วโมงต่อปี ไม่จำเป็นต้องมีนาฬิกาแบบนี้ ฉันต้องออนไลน์อีกครั้งและค้นหาวิธีแก้ไขข้อบกพร่องนี้ วิธีแก้ปัญหาแรกที่เกิดขึ้นบอกว่าคุณต้องกราวด์ควอตซ์ ฉันทำไปแล้ว - ผลลัพธ์คือศูนย์ ฉันยังพบบางที่ที่ฉันต้องค้นหาเมนบอร์ดเก่าและถอดนาฬิกาควอทซ์ออกจากที่นั่น ฉันทำไปแล้ว - มันได้ผล ตอนนี้นาฬิกาเดินเร็วขึ้นไม่ใช่ 10-11 วินาที แต่ 1.5 วินาทีต่อวัน สมมติว่ามันดีขึ้น แต่ก็ยังห่างไกลจากอุดมคติ เนื่องจากฉันไม่รู้สึกอยากเล่นซอกับหัวแร้งอีกต่อไปจึงตัดสินใจปรับนาฬิกาโดยทางโปรแกรมนั่นคือปรับนาฬิกาให้เป็นค่าที่ต้องการวันละครั้ง หลังจากผ่านไป 10 วัน นาฬิกาก็เดินออกไปไม่ถึงหนึ่งวินาที วิธีนี้ดี แต่เมื่ออุปกรณ์ซิงโครไนซ์ Arduino เชื่อมต่อกับพลังงานเท่านั้น ไม่เช่นนั้นนาฬิกาจะทำงานโดยใช้พลังงานจากแบตเตอรี่และยังคงทำงานต่อไป
โปรแกรมทดสอบขนาดเล็ก:

#รวม"Wire.h"
#define DS1307_I2C_ADDRESS 0x68 // SDA A4, SCL A5

ไบต์ decToBcd (ไบต์ val)
{
กลับ ((ค่า/10*16) + (ค่า%10));
}

ไบต์ bcdToDec (ไบต์ val)
{
กลับ ((ค่า/16*10) + (ค่า%16));
}

เป็นโมฆะ setDateDs1307 (ไบต์วินาที // 0-59
ไบต์นาที // 0-59
ไบต์ชั่วโมง) // 0-99
{

ลวด.write(0);
Wire.write(decToBcd(วินาที));
Wire.write(decToBcd(นาที));
Wire.write(decToBcd(ชั่วโมง));
Wire.endTransmission();
}

เป็นโมฆะ getDateDs1307 (ไบต์ * วินาที
ไบต์*นาที
ไบต์ *ชั่วโมง)
{

Wire.beginTransmission (DS1307_I2C_ADDRESS);
ลวด.write(0);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 3);

*วินาที = bcdToDec(Wire.read());
*นาที = bcdToDec(Wire.read());
*ชั่วโมง = bcdToDec(Wire.read());
}

การตั้งค่าเป็นโมฆะ()
{
ไบต์วินาที นาที ชั่วโมง
Wire.begin();
อนุกรมเริ่มต้น(9600);

ที่สอง = 45;
นาที = 5;
ชั่วโมง = 16;

SetDateDs1307(วินาที นาที ชั่วโมง);
}

เป็นโมฆะวน()
{
ไบต์วินาที นาที ชั่วโมง

GetDateDs1307(&วินาที, &นาที, &ชั่วโมง);
Serial.print (ชั่วโมง ธ.ค. );
Serial.พิมพ์(::);
Serial.print (นาที ธ.ค. );
Serial.พิมพ์(::);
Serial.println (วินาที, ธ.ค. );

ความล่าช้า(1,000);
}


ที่นี่ไม่ได้ใช้ไลบรารี และฟังก์ชันสำหรับการอ่านและการเขียนจะถูกตัดทอนลง

เซ็นเซอร์อุณหภูมิและความชื้น DHT11
ไม่มีอะไรจะบอกเกี่ยวกับเซ็นเซอร์นี้ ฉันจะไม่ใช้มันถ้าไม่ต้องการความชื้น เสียดายตอนรับไม่ได้ถ่ายรูปไว้ เลยไม่มีรูปมาให้ดู สามารถดูรูปถ่ายของเซ็นเซอร์ได้ที่ด้านล่าง ซึ่งฉันเชื่อมต่อกับ Arduino การเชื่อมต่อเซ็นเซอร์ทำได้ง่าย (+, เอาต์พุตดิจิตอล, -) โดยทั่วไปแล้วเซ็นเซอร์จะประกอบด้วยพินสี่พิน ด้วยฟอร์มแฟคเตอร์นี้ พินที่สามจึงไม่ได้เชื่อมต่อกับสิ่งใดเลย
คุณสามารถใช้ไลบรารีเพื่อเชื่อมต่อกับ Arduino คุณสามารถดาวน์โหลดได้
โปรแกรมทดสอบขนาดเล็กที่มีข้อมูลเอาต์พุตบนจอ LCD 1602:

// รวมรหัสห้องสมุด:
#รวม
#รวม

// ประกาศวัตถุ
dht11 DHT11;
จอแอลซีดีลิควิดคริสตัล (12, 11, 6, 5, 4, 3);

#กำหนด DHT11PIN 7
ฉัน;

การตั้งค่าเป็นโมฆะ()
{
จอแอลซีดี. เริ่มต้น (16, 2);
lcd.print("สถานะ: „);
ฉัน=0;
}

เป็นโมฆะวน()
{
int chk = DHT11.อ่าน(DHT11PIN);
จอแอลซีดี setCursor (8, 0);
สวิตช์ (CHK)
{
กรณีที่ 0: lcd.print (“ตกลง ”); แตก;// lcd.setCursor(11, 0); จอแอลซีดีพิมพ์(มิลลิวินาที()/2000); หยุดพัก;
กรณี -1: lcd.print (“ข้อผิดพลาดการตรวจสอบ”); mErr(); หยุดพัก;
กรณี -2: lcd.print ("ข้อผิดพลาดการหมดเวลา"); mErr(); หยุดพัก;
ค่าเริ่มต้น: lcd.print("ข้อผิดพลาดที่ไม่ทราบสาเหตุ"); mErr(); หยุดพัก;
}
ล่าช้า (500);
จอแอลซีดี setCursor (15, 0);
สวิตช์ (ฉัน)
{
กรณีที่ 0: lcd.print("^"); จอแอลซีดี setCursor (15, 1); lcd.print(" ");แตก;
กรณีที่ 1: lcd.print("v"); จอแอลซีดี setCursor (15, 1); lcd.print(" ");แตก;
ค่าเริ่มต้น: lcd.setCursor(15, 1); จอแอลซีดีพิมพ์("E"); หยุดพัก;
}
ฉัน=ฉัน+1;
ถ้า (i>1) i=0;
จอแอลซีดี setCursor (0, 1);
จอแอลซีดีพิมพ์("H =");
จอแอลซีดี setCursor (2, 1);
lcd.print((ลอย)DHT11.ความชื้น, 0);
จอแอลซีดี setCursor (4, 1);
จอแอลซีดีพิมพ์("%");
จอแอลซีดี setCursor (8, 1);
จอแอลซีดีพิมพ์("T =");
จอแอลซีดี setCursor (10, 1);
lcd.print((ลอย)DHT11.อุณหภูมิ, 0);
จอแอลซีดี setCursor (12, 1);
จอแอลซีดีพิมพ์("C");

เป็นโมฆะ mErr()
{
จอแอลซีดี setCursor (2, 1);
จอแอลซีดีพิมพ์("**");
จอแอลซีดี setCursor (10, 1);
จอแอลซีดีพิมพ์("**");
ผม=5;
}


เซ็นเซอร์มีข้อเสียบางประการ - ข้อมูลจากเซ็นเซอร์เป็นจำนวนเต็มเท่านั้นและช่วงไม่ชัดเจน

ดูเหมือนว่าฉันจะเขียนเกี่ยวกับส่วนประกอบทั้งหมด สิ่งที่เหลืออยู่คือการรวบรวมทุกอย่างให้เป็นหนึ่งเดียว
อ๊ะ ฉันเกือบลืม! ในการประกอบอุปกรณ์ คุณต้องมีตัวเครื่อง ฉันยังสั่งเคสนี้บน Ebay ด้วย ผู้ขายกลายเป็นจากอังกฤษ พัสดุมาถึงอย่างรวดเร็วแต่ฉันไม่ได้ถ่ายรูปไว้ ภาพถ่ายทั้งหมดของคดีอยู่ด้านล่าง

ก่อนอื่น ฉันประกอบทุกอย่างไว้บนโต๊ะโดยใช้สายไฟแบบพิเศษ ฉันเขียนโปรแกรมทดสอบและอัปโหลดไปยังคอนโทรลเลอร์



ที่จริงแล้วสีน้ำเงินของแบ็คไลท์นั้นสว่างกว่ามาก แม้จะใช้ความสว่างต่ำสุด (สว่าง=5) เฟรมก็ยังสว่างอยู่

ในการประกอบทุกอย่างแบบไร้สาย จึงตัดสินใจสร้างมาเธอร์บอร์ดขนาดเล็ก โดยมีการติดบอร์ด Arduino และโล่ไว้ที่ตัวเชื่อมต่อ หากมีสิ่งใดเกิดขึ้น ก็สามารถลบออกได้อย่างรวดเร็วและง่ายดาย ฉันยังตัดสินใจติดหน้าจอ LCD และปุ่มควบคุมเข้ากับขั้วต่อเพื่อบัดกรีเซ็นเซอร์อุณหภูมิบนสายไฟเท่านั้น
ผ้าพันคอจึงออกมาเป็นแบบนี้



ในรูปสุดท้ายฉันไม่ได้ล้างฟลักซ์ออกจนหมด ฉันติดยางที่มีรูพรุนไว้ใต้แผงป้องกันถัดจากขั้วต่อเพื่อให้มีการรองรับเป็นอย่างน้อย แม้ว่าในความเป็นจริงแล้วโล่ในขั้วต่อบนหน้าสัมผัสจะยึดได้ดีก็ตาม

เมนบอร์ดพร้อมแผงป้องกันและบอร์ด Arduino

นี่คือลักษณะของการเชื่อมต่อกับเมนบอร์ดโดยสมบูรณ์


แทนที่จะใช้ปุ่มฉันใช้โล่แบบโฮมเมดที่บัดกรีบนเขียงหั่นขนม ฉันใช้ปุ่มจากหนูตัวเก่าเป็นปุ่ม
อย่างที่คุณเห็นจำนวนสายไฟลดลง

ปัญหาหลักของการจัดวางเคสคือการตัดร่องจอ LCD ให้เรียบ ไม่ว่าฉันพยายามแค่ไหน มันก็ยังไม่สมบูรณ์แบบ ช่องว่างในบางจุดมากกว่า 1 มม. เล็กน้อย เพื่อให้ทุกอย่างดูเรียบร้อย ฉันจึงเอาน้ำยาซีลตู้ปลาสีดำมาอุดรอยแตกทั้งหมด ในขณะเดียวกันก็ติดตะแกรงเข้ากับน้ำยาซีลนี้ด้วย หลังจากกาวยาแนวแห้งแล้ว ฉันจึงตัดส่วนที่เกินจากด้านนอกออก ในแสงจ้าจะมองเห็นสารเคลือบหลุมร่องฟัน แต่ในแสงปกติทุกอย่างจะรวมเข้ากับร่างกาย
นี่คือลักษณะของเคสจากด้านในที่ติดตั้งหน้าจอ LCD และมาเธอร์บอร์ด

นี่คือลักษณะที่ปรากฏเมื่อมองจากภายนอกในที่มีแสงจ้า (ขออภัยเรื่องลายนิ้วมือ ฉันเห็นมันตอนที่กำลังจัดรูปภาพ)

คิดอยู่นานว่าจะใส่ปุ่มต่างๆ เข้ากับเคสยังไงดี และที่สำคัญคือจะใช้ปุ่มอะไร...
ในร้านขายวิทยุอิเล็กทรอนิกส์ พวกเขาชอบปุ่มที่มีหมุดยาวและส่วนปลายที่พอดีกับหมุดนี้ ปุ่มเหล่านี้ใช้สำหรับบัดกรีเข้ากับบอร์ด ทุกอย่างคงจะดี แต่มีข้อเสีย - จังหวะการกดมีขนาดเล็กและดังมาก
เราต้องวางปุ่มต่างๆ ออกเป็นสองขั้นตอน ขั้นตอนแรกคือการวางปุ่มบนกระดาน ขั้นตอนที่สองคือติดบอร์ดนี้ไว้บนบอร์ดอื่น จากนั้นใส่ทั้งหมดนี้ลงในเนื้อหาบนไกด์

นี่คือลักษณะของผ้าพันคอที่มีกระดุม:



นี่คือลักษณะของบอร์ดยึด:


ที่นี่คุณสามารถดูคำแนะนำในการใส่บอร์ดพร้อมปุ่มได้ องค์ประกอบบางอย่างถูกบัดกรีเพื่อให้บอร์ดมีความแข็งแกร่ง

ตอนนี้เราใส่ทุกอย่างเข้าไปในร่างกายแล้ว
โดยไม่ต้องเชื่อมต่อปุ่ม:


ด้วยการเชื่อมต่อปุ่ม:

ปิดเคสแล้วเปิดเครื่อง ทุกอย่างใช้งานได้ดี ปุ่มต่างๆ ทำงานได้ตามปกติ

ในตอนท้ายฉันโพสต์วิดีโอสั้น ๆ ของอุปกรณ์ที่ทำงานในโหมดต่างๆ:
http://www.youtube.com/watch?v=KsiVaUWkXNA&feature=youtu.be
สำหรับผู้ที่ไม่เห็นวิดีโอที่นี่ นี่คือลิงค์ไป

ถึงเวลาที่จะสิ้นสุดการทบทวน
ฉันจะเขียนเกี่ยวกับโปรแกรมเล็กน้อย จากนั้นจึงสรุปสั้นๆ ตอนที่ฉันเขียนโปรแกรม ฉันไม่คิดว่าฉันจะถึงขีดจำกัด 30,720 ไบต์อย่างรวดเร็ว


ฉันต้องปรับโค้ดให้เหมาะสม ฉันย้ายโค้ดหลายส่วนไปไว้ในรูทีนย่อย ฉันไม่เคยคิดเลยว่าคำสั่ง switch...case ในรูปแบบที่คอมไพล์จะใช้พื้นที่มากกว่าคำสั่ง if...else หลายๆ คำสั่ง การประกาศตัวแปรที่ถูกต้องยังช่วยประหยัดพื้นที่อีกด้วย หากคุณประกาศอาร์เรย์แบบยาว แม้ว่าจะค่อนข้างเป็นไปได้ที่จะได้รับเป็นไบต์ก็ตาม หน่วยความจำเกินจะสูงถึง 500 ไบต์ ขึ้นอยู่กับขนาดของอาร์เรย์ เมื่อคุณเขียนโปรแกรม คุณจะไม่ได้คิดถึงมัน และต่อมาเมื่อคุณวิเคราะห์โปรแกรม คุณจะรู้ว่าคุณทำบางอย่างผิด และคุณเริ่มปรับโค้ดให้เหมาะสม หลังจากที่ปัญหาเกี่ยวกับขนาดของโปรแกรมได้รับการแก้ไข ฉันพบข้อจำกัดของ RAM สิ่งนี้แสดงให้เห็นความจริงที่ว่าโปรแกรมเริ่มค้างหลังจากโหลด ฉันต้องแนะนำรูทีนย่อยสำหรับการคำนวณ RAM ที่ว่าง เป็นผลให้ฉันถูกบังคับให้ละทิ้งอัลกอริธึมการพยากรณ์อากาศหนึ่งอัลกอริธึมเนื่องจากจะต้องแสดงไอคอนบนหน้าจอ อัลกอริธึมทำงานได้ แต่ต้องบันทึกเอาต์พุตของไอคอน ฉันยังมีแนวคิดเกี่ยวกับวิธีการเพิ่มประสิทธิภาพโค้ด แต่ในอนาคตอันใกล้นี้ ฉันจะปล่อยให้อุปกรณ์ทำงานตามที่เป็นอยู่เพื่อประเมินประสิทธิภาพและระบุจุดบกพร่องทั้งหมด

ตอนนี้ได้ข้อสรุปบางอย่างแล้ว
ข้อเสีย
1) ราคา. เหตุผลสำหรับข้อเสียนี้คืองานอดิเรกไม่เคยถูก

ข้อดี
1) ฟังก์ชั่นที่ยอดเยี่ยมของอุปกรณ์
2) ฟังก์ชั่นที่เพิ่มขึ้นจะถูกจำกัดโดยคอนโทรลเลอร์ที่ใช้และความต้องการของคุณเองเท่านั้น
3) ความสุขอันสวยงามจากการใคร่ครวญและความพึงพอใจทางศีลธรรมจากการที่ในที่สุดฉันก็ประกอบอุปกรณ์นี้เสร็จ

ฉันกำลังวางแผนที่จะซื้อ +85 เพิ่มในรายการโปรด ฉันชอบรีวิว +137 +304

ฉันทดสอบแต่ละส่วนของระบบบน Arduino UNO เหล่านั้น. ฉันเชื่อมต่อโมดูล ESP กับ uno แล้วศึกษา ตัดการเชื่อมต่อ จากนั้นจึงเชื่อมต่อ nRF24 ฯลฯ สำหรับการใช้งานเซ็นเซอร์หน้าต่างขั้นสุดท้าย ฉันเลือก Arduino Pro Mini เป็นอุปกรณ์จิ๋วที่ใกล้เคียงที่สุดกับ Uno



ในแง่ของการใช้พลังงาน Arduino Pro Mini ก็ดูดีเช่นกัน:

  • ไม่มีตัวแปลง USB-TTL ซึ่งตัวมันเอง "กิน" มาก
  • LED เชื่อมต่อผ่านตัวต้านทาน 10k

สำหรับการอนุรักษ์พลังงานขั้นสูงมีการวางแผน:

  • ถอด LED - ไฟแสดงสถานะพลังงานบน Arduino Pro Mini (ฉันเสียใจที่ไม่ได้ทำให้บอร์ดเสียหาย)
  • หรือใช้ชุดประกอบ "เปลือย" บนไมโครโปรเซสเซอร์ Atmel ATmega328 (ไม่ได้ใช้)
  • ใช้ไลบรารีพลังงานต่ำหรือ JeeLib

จากห้องสมุดต่างๆ ฉันเลือกห้องสมุดพลังงานต่ำ มันเรียบง่ายและมีเพียงสิ่งที่จำเป็นเท่านั้น


สำหรับหน่วยกลางเนื่องจากมีการวางแผนที่จะเชื่อมต่ออุปกรณ์ต่อพ่วงจำนวนมากจึงเลือกบอร์ด Arduino Mega นอกจากนี้ยังเข้ากันได้กับ UNO อย่างสมบูรณ์และมีหน่วยความจำมากขึ้น เมื่อมองไปข้างหน้าฉันจะบอกว่าตัวเลือกนี้สมเหตุสมผลอย่างสมบูรณ์


คุณสามารถซื้อ Arduino Mega ได้ในราคาประมาณ 8 ดอลลาร์

การใช้พลังงานและพลังงาน

ตอนนี้เกี่ยวกับพลังงานและการใช้พลังงาน


Arduino Pro Mini มีสองประเภท:

  • สำหรับจ่ายแรงดัน 5V และความถี่ 16MHz
  • สำหรับแรงดันไฟฟ้า 3.3V และความถี่ 8MHz

เนื่องจากโมดูลวิทยุ nRF24L01+ ต้องใช้แหล่งจ่ายไฟ 3.3 V และความเร็วไม่สำคัญ ดังนั้นให้ซื้อ Arduino Pro Mini ที่มี 8 MHz และ 3.3 V


ในกรณีนี้ ช่วงแรงดันไฟฟ้าของ Arduino Pro Mini คือ:

  • 3.35-12V สำหรับรุ่น 3.3V
  • 5-12V สำหรับรุ่น 5V

ฉันมี Arduino Pro Mini ที่ 5V อยู่แล้ว ดังนั้นฉันจึงใช้มัน คุณสามารถซื้อ Arduino Pro Mini ได้ในราคาประมาณ 4 ดอลลาร์


หน่วยส่วนกลางจะได้รับพลังงานจากเครือข่าย 220 V ผ่านแหล่งจ่ายไฟขนาดเล็ก โดยให้เอาต์พุต 12 V, 450 mA, 5 W แบบนี้ราคา $5 นอกจากนี้ยังมีพิน 5V แยกต่างหาก



และหากยังไม่เพียงพอ คุณก็สามารถติดตั้งสิ่งที่ทรงพลังกว่านี้ได้ กล่าวอีกนัยหนึ่งการประหยัดพลังงานสำหรับยูนิตส่วนกลางนั้นไม่สมเหตุสมผลนัก แต่สำหรับเซ็นเซอร์ไร้สายระยะไกล การประหยัดพลังงานเป็นส่วนที่สำคัญที่สุด แต่ฉันก็ไม่อยากสูญเสียฟังก์ชันการทำงานเช่นกัน


ดังนั้น Arduino Pro Mini และโมดูลวิทยุ nRF24 จะใช้พลังงานจากแบตเตอรี่ Ni-Mh จำนวน 4 ก้อน


และจำไว้ ความจุสูงสุดของแบตเตอรี่สมัยใหม่ประมาณ 2,500-2,700mAh มีอะไรเพิ่มเติมเป็นลูกเล่นทางการตลาด (Ansmann 2850) หรือการหลอกลวง (UltraFire 3500)


ฉันไม่ใช้แบตเตอรี่ Li-Ion ด้วยเหตุผลหลายประการ:

  • มีราคาแพงมาก
  • เมื่ออุณหภูมิโดยรอบลดลงต่ำกว่า 0°C พลังงานของแบตเตอรี่ลิเธียมไอออนจะลดลงเหลือ 40-50%
  • ราคาถูกผลิตโดยไม่มีการป้องกันและไม่ปลอดภัย (ในระหว่างการลัดวงจรหรือการคายประจุพวกเขาสามารถระเบิดและเผาไหม้ได้ดูวิดีโอมากมายบน YouTube)
  • พวกเขามีอายุมากขึ้นแม้ว่าจะไม่ได้ใช้งานก็ตาม (อย่างไรก็ตาม อาจกล่าวได้เกี่ยวกับองค์ประกอบทางเคมีทั้งหมด) หลังจากผ่านไป 2 ปี แบตเตอรี่ลิเธียมไอออนจะสูญเสียความจุประมาณ 20%

สำหรับต้นแบบ ค่อนข้างเป็นไปได้ที่จะใช้แบตเตอรี่ Ni-MH AA หรือ AAA คุณภาพสูง ยิ่งกว่านั้นเราไม่ต้องการกระแสน้ำขนาดใหญ่ ข้อเสียเปรียบประการเดียวของแบตเตอรี่ Ni-MH คือเวลาในการชาร์จที่ยาวนาน

แผนภาพทั่วไปของสถานีตรวจอากาศ

มาสรุปกัน ต่อไปนี้เป็นแผนภาพทั่วไปเกี่ยวกับวิธีการทำงานทั้งหมด



ที่จะดำเนินต่อไป

แท็ก: เพิ่มแท็ก

เช่นเดียวกับคนทำงานส่วนใหญ่ การทำโปรเจ็กต์ของคุณเองจะใช้เวลาว่างเพียงอย่างเดียวที่คุณมีอยู่ นั่นเป็นเหตุผลว่าทำไมฉันไม่ได้สร้างอะไรเลยมาเป็นเวลานานและฉันก็อยากจะทำอะไรสักอย่าง น่าแปลกที่โอกาสนี้ปรากฏที่มหาวิทยาลัย เป็นเดือนกันยายนนอกหน้าต่าง ปีที่ 4 และหลักสูตรการออกแบบวงจรที่กำลังจะมีขึ้น เราได้รับแจ้งว่าการเรียนในหลักสูตรสามารถทำได้สองรูปแบบ: กระดาษและฮาร์ดแวร์

เป็นเวลา 5 ปีแล้วที่มหาวิทยาลัยของเราจัดทำรายวิชากระดาษตามหลักการ “เอาอันเก่ามารวมเข้าด้วยกัน” แนวทางนี้ไม่เหมาะกับฉันเนื่องจากเป็นกิจวัตรประจำวัน ฉันจึงเลือกรายวิชาวิชาฮาร์ดแวร์ทันที ไมโครคอนโทรลเลอร์ Arduino ได้รับการเสนอให้เป็นหัวใจสำคัญของรายวิชาเนื่องจากง่ายต่อการเรียนรู้ หลังจากพิจารณาประเภทของรายวิชาแล้ว ยังมีคำถามอีกข้อหนึ่งคือ จะต้องทำอะไรกันแน่ เนื่องจากฉันไม่เคยมีประสบการณ์ในการเขียนโปรแกรมไมโครคอนโทรลเลอร์ ฉันจึงเปิด Google ทันทีและเริ่มศึกษาโครงการที่มีอยู่ มีหลายโครงการ บางโครงการค่อนข้างเรียบง่าย บางโครงการมีความคิดสร้างสรรค์ (เช่น สแกนเนอร์ 3 มิติ) แต่ส่วนใหญ่ไม่มีการใช้งานจริง และฉันแค่อยากได้ของที่ไม่วางบนชั้นวางและสะสมฝุ่น หลังจากเที่ยวชมโลกของ Arduino เป็นเวลาครึ่งชั่วโมง ฉันก็เริ่มสนใจหัวข้อสถานีตรวจอากาศในบ้าน และโครงการต่างๆ ดูเหมือนจะทำได้ไม่ยากนัก (ซึ่งเป็นสิ่งที่ดึงดูดผู้มาใหม่เป็นหลัก)

นี่คือวิธีการเลือกหัวข้อสำหรับรายวิชาและเมื่อเวลาผ่านไปก็ดูเหมือนจะไม่มีปัญหาใดๆ

การเลือกส่วนประกอบ

เมื่อดูโปรเจ็กต์ต่างๆ แล้ว ฉันพบว่า Nano หรือแม้แต่ Pro Mini ก็เพียงพอแล้วสำหรับฉัน แต่ฉันยังคงเลือก Arduino Uno ด้วยความหวังว่าฉันจะอยากเขียนโปรแกรมสำหรับ Arduino และจะนำโปรเจ็กต์อื่นๆ ไปใช้ในอนาคต ฉันไม่เคยถือหัวแร้งไว้ในมือมาก่อน ดังนั้นเพื่อให้การพัฒนาง่ายขึ้น ฉันจึงตัดสินใจซื้อ Sensor Shield v4 ด้วย

รายละเอียดเพิ่มเติม

บอร์ดนี้อำนวยความสะดวกในการเชื่อมต่อเซ็นเซอร์ โมดูล เซอร์โวมอเตอร์ อินเทอร์เฟซแบบอนุกรมและ I2C ได้อย่างรวดเร็ว และยังแสดงพอร์ตทั้งหมดของตัวควบคุมของฟอร์มแฟคเตอร์ Duemilanova/Uno (สามารถเชื่อมต่อกับซีรีส์ mega ได้ด้วย แต่มีข้อจำกัดและผลที่ตามมา) . รองรับโล่อื่น ๆ ที่อยู่ด้านบนของตัวมันเอง


ฉันเลือกเซ็นเซอร์ต่อไปนี้เป็นแหล่งข้อมูลอุตุนิยมวิทยา:


ฉันตัดสินใจเลือกเซนเซอร์แล้ว แต่จะทำอย่างไรกับข้อมูลที่มาจากเซ็นเซอร์? ฉันตัดสินใจที่จะแสดงมัน ฉันต้องการภาพสี ดังนั้นฉันจึงทิ้งโซลูชันขาวดำทันที หลังจากค้นหาหลายนาที จอแสดงผล TFT ST7735 1.8 นิ้วก็ถูกเลือก

รายละเอียดเพิ่มเติม

เนื่องจากจอแสดงผลใช้โปรโตคอล SPI 4 สายสำหรับการสื่อสาร และมีบัฟเฟอร์เฟรมระบุตำแหน่งพิกเซลได้ จึงสามารถใช้กับไมโครคอนโทรลเลอร์ทุกประเภทได้ จอแสดงผลขนาด 1.8 นิ้วมีพิกเซลสี 128x160 นอกจากนี้ยังมีช่องเสียบการ์ด microSD ดังนั้นคุณจึงสามารถโหลดภาพบิตแมปสีเต็มรูปแบบจากระบบไฟล์การ์ด microSD FAT16/FAT32 ได้อย่างง่ายดาย

ข้อมูลจำเพาะ:

  • จอแสดงผลในแนวทแยง - 1.8 นิ้ว, ความละเอียด 128x160 พิกเซล, สี 18 บิต (262,144 สี)
  • คอนโทรลเลอร์พร้อมการกำหนดแอดเดรสพิกเซลในตัวของบัฟเฟอร์หน่วยความจำวิดีโอ
  • ช่องเสียบ microSD ในตัว - ใช้สายดิจิตอลมากกว่า 2 เส้น
  • เข้ากันได้กับ 3.3 และ 5V
  • ขนาด: 34 มม. x 56 มม. x 6.5 ม


การเขียนโปรแกรมคอนโทรลเลอร์ Arduino

หลังจากที่เราตัดสินใจเกี่ยวกับส่วนประกอบสำหรับสถานีตรวจอากาศแล้ว เราจะเริ่มตั้งโปรแกรมคอนโทรลเลอร์ Arduino IDE ใช้เพื่อแฟลชเฟิร์มแวร์ Arduino ใช้ไลบรารี่จาก Adafruit ด้วย

ก่อนที่จะไปยังภาพร่าง มาดูฟังก์ชันการทำงานกันก่อน:

  • การอ่านจะถูกนำมาจากเซ็นเซอร์ทุกๆ 10 วินาที และเฉพาะตัวบ่งชี้ที่เปลี่ยนแปลงเมื่อเทียบกับการวัดครั้งก่อนเท่านั้นที่จะได้รับการอัปเดตบนหน้าจอ
  • ดำเนินการถ่ายโอนข้อมูลผ่านพอร์ต COM

ร่าง

#รวม // ไลบรารีสำหรับการสื่อสารกับอุปกรณ์ I2C #include // ไลบรารีหลักสำหรับเซ็นเซอร์ทั้งหมด #include // ไลบรารีสำหรับ BMP180 #include // ไลบรารีกราฟิกหลัก #include // ไลบรารี่เฉพาะฮาร์ดแวร์ #include // ไลบรารี่สำหรับการสื่อสารกับอุปกรณ์ SPI #include "dht.h" // ไลบรารี่สำหรับ DHT #define DHT22_PIN 2 // เชื่อมต่อ data pin ของ DHT22 กับ 2 digital pin #define TFT_CS 10 // เชื่อมต่อ CS pin ของ TFT กับ 10 digital pin #define TFT_RST 9 // เชื่อมต่อ RST pin ของ TFT กับ 9 digital pin // คุณยังสามารถเชื่อมต่อสิ่งนี้กับการรีเซ็ต Arduino // ในกรณีนี้ ให้ตั้งค่า #define pin นี้เป็น 0! #define TFT_DC 8 // เชื่อมต่อ DC pin ของ TFT กับ 8 pin ดิจิตอล Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); // เริ่มต้น TFT #define TFT_SCLK 13 // เชื่อมต่อ SCLK pin ของ TFT กับ 13 digital pin #define TFT_MOSI 11 // เชื่อมต่อ MOSI pin ของ TFT กับ 11 digital pin dht DHT; Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085); // เริ่มต้น BMP180 int bmpFlag = 0; struct ( uint32_t รวม; uint32_t ตกลง; uint32_t crc_error; uint32_t time_out; uint32_t เชื่อมต่อ; uint32_t ack_l; uint32_t ack_h; uint32_t ไม่ทราบ; ) stat = ( 0,0,0,0,0,0,0,0); // struct สำหรับการตั้งค่าโมฆะสถานะ dht(โมฆะ) ( Serial.begin(9600); Serial.println("Meteo Test"); Serial.println(""); if(!bmp.begin()) // ตรวจสอบการเชื่อมต่อ สำหรับ BMP180 ( Serial.print("อ๊ะ ไม่พบ BMP180 ... ตรวจสอบสายไฟหรือ I2C ADDR!"); bmpFlag = 1; ) tft.initR(INITR_BLACKTAB); // เริ่มต้น TFT และเติมด้วย tft.fillScreen สีดำ (ST7735_BLACK); tft.setRotation(tft.getRotation() + 1); tft.setTextSize(1.5); // หน่วงเวลาเพื่อให้แน่ใจว่า TFT ได้รับการเริ่มต้นแล้ว) // ข้อมูลที่วัดได้ล่าสุด oldTemperature = 0, oldAltitude = 0, oldPressure = 0, oldDHTHumidity = 0, oldDHTTemperature; = 0 || !event.pressure) // อัปเดตข้อมูล ( tft.fillRect(0, 30, 160, 6, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED); printValue("ERROR BMP INITIALIZATION", 0 , "", จริง ) else ( if(event.pressure != oldPressure) ( tft.fillRect(0, 30, 160, 7, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED) ; printValue ("ความดัน", event.pressure, "hPa", true); oldPressure = event.pressure = true ) if(temperature != oldTemperature) ( tft.fillRect(0, 38, 160, 7, ST7735_BLACK ); tft.setCursor (0, 38); tft.setTextColor(ST7735_WHITE); printValue("อุณหภูมิ", "C", จริง); oldTemperature = อุณหภูมิ; wasUpdate; (0, 46); tft.setTextColor(ST7735_BLUE); printValue("ระดับความสูง", ระดับความสูง, "m", จริง); wasUpdate = true; 54, 160, 7, ST7735_BLACK); tft.setCursor(0, 54);

ถึงเวลาประกอบร่างกายแล้ว

เงื่อนไขหลักของรายวิชาคือต้นแบบการทำงานในรูปแบบที่ปรากฏ ดังนั้นฉันจึงต้องซื้อที่อยู่อาศัยและติดอาวุธด้วยไฟล์เพื่อใส่สถานีตรวจอากาศเข้าไปในตัวเรือนในทางใดทางหนึ่ง

เคสนี้ซื้อจากร้านขายอุปกรณ์อิเล็กทรอนิกส์ทางวิทยุในพื้นที่

กรอบ

(เคสในรูปจะแตกต่างนิดหน่อยนะคะ มีฝาปิดแบบใสค่ะ)



จากนั้น เมื่อใช้ไฟล์ เจาะรูเพื่อส่งออกเซ็นเซอร์และจ่ายไฟ ฉันตัดสินใจย้ายเซ็นเซอร์ออกไปข้างนอก เพราะขณะทดสอบระบบโดยไม่มีเคส ฉันสังเกตเห็นว่าด้านหลังของหน้าจอร้อนมาก ซึ่งจะส่งผลต่ออุณหภูมิภายในเคส

ตัวเรือนพร้อมช่องเปิดสำหรับเซ็นเซอร์และกำลังไฟ



เนื่องจากฉันต้องประสานขาเข้ากับเซ็นเซอร์ 2 ตัวและเผาแทร็กด้วยหนึ่งในนั้นฉันจึงตัดสินใจที่จะไม่ล่อลวงโชคชะตาและไม่บัดกรีสายไฟเข้ากับเซ็นเซอร์ (ฉันจะฝึกอย่างอื่น) และเพื่อการเชื่อมต่อ เพื่อให้น่าเชื่อถือไม่มากก็น้อยฉันจึงตัดสินใจกรอเทปพันสายไฟ

ระบบก่อนการ”ยัด”เข้าในตัวเครื่อง



เนื่องจากเคสมีขนาดใหญ่กว่า Arduino มาก (ไม่มีอันที่เล็กกว่านี้) ฉันจึงต้องหาส่วนรองรับเพื่อไม่ให้บอร์ดขยับเข้าไปในเคส นอกจากนี้ ยังมีการตัดฟิกเกอร์ออกจากโฟม และในนั้นมีสี่เหลี่ยมสำหรับหน้าจอเพื่อซ่อนด้านในของเคส ฉันไม่มีกาวซุปเปอร์กาวอยู่ในมือ ดังนั้นฉันจึงต้องใช้เทปกาวสองหน้า

ปาฏิหาริย์-ยุดา-วาฬ



ขันฝาให้แน่น เชื่อมต่อไฟแล้วรอ

สร้างสถานีตรวจอากาศในอาคารเสร็จแล้ว



หลังจากแสดงผลลัพธ์บนหน้าจอ เราพบข้อผิดพลาดอันไม่พึงประสงค์ในการวัดความชื้น: DHT22 ขยันสร้างตัวเลข 99.90% (1.00% นั้นหายากมาก) เรามาเริ่มกันว่าปัญหาคืออะไร สิ่งแรกที่เราทำคือดูที่ผลลัพธ์ของค่าไปยังพอร์ต COM ทุกอย่างดูเหมือนจะดี หลังจากการเติม การแยกชิ้นส่วน และการประกอบกลับหลายครั้ง แนวคิดนี้ก็เกิดขึ้นในใจที่จะค้นหาคำตอบใน Google ตามที่คาดไว้ Google ภาษารัสเซียไม่ได้พูดอะไรที่เป็นประโยชน์ ตกลง. เราเริ่มค้นหาเป็นภาษาอังกฤษและในฟอรัมหนึ่งที่เราพบผู้ชายที่มีปัญหาคล้ายกัน การสนทนาสี่หน้าแรกไม่ได้ให้ประโยชน์อะไร แต่ในหน้าห้าเราพบคำตอบสำหรับคำถามของเรา:
เซ็นเซอร์ความชื้นอาจได้รับผลกระทบจากก๊าซที่ไม่ถูกต้องหรือการสัมผัสกับ IIRC ที่มีความชื้นสูงเป็นเวลานานมาก ในแผ่นข้อมูลมีขั้นตอนวิธี "รีเซ็ต" เซ็นเซอร์ คุณสามารถลองดูได้

คำถามเดียวที่ยังคงอยู่คือฉันจะจัดการสร้างความเสียหาย DHT22 เมื่อใดและอย่างไร แต่ใกล้จะถึงเวลาเข้าเรียนแล้ว ฉันก็เลยทิ้งวิธีแก้ปัญหาไว้ไว้ใช้ทีหลัง

คำหลัง

วิชาเรียนผ่านไปแล้ว สถานีตรวจอากาศถูกเลื่อนออกไปไม่มีกำหนดจนกว่าหางแร่ในมหาวิทยาลัยจะปิดทั้งหมด อย่างไรก็ตามเราต้องกลับสถานีตรวจอากาศเร็วกว่าที่คิด มันเกิดขึ้นในช่วงกลางเดือนพฤศจิกายน ฉันเปลี่ยนที่ทำงาน และได้พบกับผู้ที่สนใจแพลตฟอร์ม Arduino และอื่นๆ ในทีมใหม่ ดังนั้นความสนใจของฉันในแพลตฟอร์มนี้จึงพุ่งขึ้นมาอีกครั้งโดยไม่มีเวลาให้ใจเย็นลง ฉันนำสถานีตรวจอากาศออกมา เชื่อมต่อกับคอมพิวเตอร์ และจำได้ว่าฉันใช้การถ่ายโอนข้อมูลจาก Arduino ผ่านทางพอร์ต COM แล้วเกิดไอเดียมาให้ฉันเขียนโปรแกรมที่รับข้อมูลผ่านพอร์ต COM จาก Arduino และส่งข้อมูลนี้ไปยังการตรวจสอบสาธารณะ
  • อาร์ดูโน่
  • เพิ่มแท็กเช่นเดียวกับคนทำงานส่วนใหญ่ การทำโปรเจ็กต์ของคุณเองจะใช้เวลาว่างเพียงอย่างเดียวที่คุณมีอยู่ นั่นเป็นเหตุผลว่าทำไมฉันไม่ได้สร้างอะไรเลยมาเป็นเวลานานและฉันก็อยากจะทำอะไรสักอย่าง น่าแปลกที่โอกาสนี้ปรากฏที่มหาวิทยาลัย เป็นเดือนกันยายนนอกหน้าต่าง ปีที่ 4 และหลักสูตรการออกแบบวงจรที่กำลังจะมีขึ้น เราได้รับแจ้งว่าการเรียนในหลักสูตรสามารถทำได้สองรูปแบบ: กระดาษและฮาร์ดแวร์

    เป็นเวลา 5 ปีแล้วที่มหาวิทยาลัยของเราจัดทำรายวิชากระดาษตามหลักการ “เอาอันเก่ามารวมเข้าด้วยกัน” แนวทางนี้ไม่เหมาะกับฉันเนื่องจากเป็นกิจวัตรประจำวัน ฉันจึงเลือกรายวิชาวิชาฮาร์ดแวร์ทันที ไมโครคอนโทรลเลอร์ Arduino ได้รับการเสนอให้เป็นหัวใจสำคัญของรายวิชาเนื่องจากง่ายต่อการเรียนรู้ หลังจากพิจารณาประเภทของรายวิชาแล้ว ยังมีคำถามอีกข้อหนึ่งคือ จะต้องทำอะไรกันแน่ เนื่องจากฉันไม่เคยมีประสบการณ์ในการเขียนโปรแกรมไมโครคอนโทรลเลอร์ ฉันจึงเปิด Google ทันทีและเริ่มศึกษาโครงการที่มีอยู่ มีหลายโครงการ บางโครงการค่อนข้างเรียบง่าย บางโครงการมีความคิดสร้างสรรค์ (เช่น สแกนเนอร์ 3 มิติ) แต่ส่วนใหญ่ไม่มีการใช้งานจริง และฉันแค่อยากได้ของที่ไม่วางบนชั้นวางและสะสมฝุ่น หลังจากเที่ยวชมโลกของ Arduino เป็นเวลาครึ่งชั่วโมง ฉันก็เริ่มสนใจหัวข้อสถานีตรวจอากาศในบ้าน และโครงการต่างๆ ดูเหมือนจะทำได้ไม่ยากนัก (ซึ่งเป็นสิ่งที่ดึงดูดผู้มาใหม่เป็นหลัก)

    นี่คือวิธีการเลือกหัวข้อสำหรับรายวิชาและเมื่อเวลาผ่านไปก็ดูเหมือนจะไม่มีปัญหาใดๆ

    การเลือกส่วนประกอบ

    เมื่อดูโปรเจ็กต์ต่างๆ แล้ว ฉันพบว่า Nano หรือแม้แต่ Pro Mini ก็เพียงพอแล้วสำหรับฉัน แต่ฉันยังคงเลือก Arduino Uno ด้วยความหวังว่าฉันจะอยากเขียนโปรแกรมสำหรับ Arduino และจะนำโปรเจ็กต์อื่นๆ ไปใช้ในอนาคต ฉันไม่เคยถือหัวแร้งไว้ในมือมาก่อน ดังนั้นเพื่อให้การพัฒนาง่ายขึ้น ฉันจึงตัดสินใจซื้อ Sensor Shield v4 ด้วย

    รายละเอียดเพิ่มเติม

    บอร์ดนี้อำนวยความสะดวกในการเชื่อมต่อเซ็นเซอร์ โมดูล เซอร์โวมอเตอร์ อินเทอร์เฟซแบบอนุกรมและ I2C ได้อย่างรวดเร็ว และยังแสดงพอร์ตทั้งหมดของตัวควบคุมของฟอร์มแฟคเตอร์ Duemilanova/Uno (สามารถเชื่อมต่อกับซีรีส์ mega ได้ด้วย แต่มีข้อจำกัดและผลที่ตามมา) . รองรับโล่อื่น ๆ ที่อยู่ด้านบนของตัวมันเอง


    ฉันเลือกเซ็นเซอร์ต่อไปนี้เป็นแหล่งข้อมูลอุตุนิยมวิทยา:


    ฉันตัดสินใจเลือกเซนเซอร์แล้ว แต่จะทำอย่างไรกับข้อมูลที่มาจากเซ็นเซอร์? ฉันตัดสินใจที่จะแสดงมัน ฉันต้องการภาพสี ดังนั้นฉันจึงทิ้งโซลูชันขาวดำทันที หลังจากค้นหาหลายนาที จอแสดงผล TFT ST7735 1.8 นิ้วก็ถูกเลือก

    รายละเอียดเพิ่มเติม

    เนื่องจากจอแสดงผลใช้โปรโตคอล SPI 4 สายสำหรับการสื่อสาร และมีบัฟเฟอร์เฟรมระบุตำแหน่งพิกเซลได้ จึงสามารถใช้กับไมโครคอนโทรลเลอร์ทุกประเภทได้ จอแสดงผลขนาด 1.8 นิ้วมีพิกเซลสี 128x160 นอกจากนี้ยังมีช่องเสียบการ์ด microSD ดังนั้นคุณจึงสามารถโหลดภาพบิตแมปสีเต็มรูปแบบจากระบบไฟล์การ์ด microSD FAT16/FAT32 ได้อย่างง่ายดาย

    ข้อมูลจำเพาะ:

    • จอแสดงผลในแนวทแยง - 1.8 นิ้ว, ความละเอียด 128x160 พิกเซล, สี 18 บิต (262,144 สี)
    • คอนโทรลเลอร์พร้อมการกำหนดแอดเดรสพิกเซลในตัวของบัฟเฟอร์หน่วยความจำวิดีโอ
    • ช่องเสียบ microSD ในตัว - ใช้สายดิจิตอลมากกว่า 2 เส้น
    • เข้ากันได้กับ 3.3 และ 5V
    • ขนาด: 34 มม. x 56 มม. x 6.5 ม


    การเขียนโปรแกรมคอนโทรลเลอร์ Arduino

    หลังจากที่เราตัดสินใจเกี่ยวกับส่วนประกอบสำหรับสถานีตรวจอากาศแล้ว เราจะเริ่มตั้งโปรแกรมคอนโทรลเลอร์ Arduino IDE ใช้เพื่อแฟลชเฟิร์มแวร์ Arduino ใช้ไลบรารี่จาก Adafruit ด้วย

    ก่อนที่จะไปยังภาพร่าง มาดูฟังก์ชันการทำงานกันก่อน:

    • การอ่านจะถูกนำมาจากเซ็นเซอร์ทุกๆ 10 วินาที และเฉพาะตัวบ่งชี้ที่เปลี่ยนแปลงเมื่อเทียบกับการวัดครั้งก่อนเท่านั้นที่จะได้รับการอัปเดตบนหน้าจอ
    • ดำเนินการถ่ายโอนข้อมูลผ่านพอร์ต COM

    ร่าง

    #รวม // ไลบรารีสำหรับการสื่อสารกับอุปกรณ์ I2C #include // ไลบรารีหลักสำหรับเซ็นเซอร์ทั้งหมด #include // ไลบรารีสำหรับ BMP180 #include // ไลบรารีกราฟิกหลัก #include // ไลบรารี่เฉพาะฮาร์ดแวร์ #include // ไลบรารี่สำหรับการสื่อสารกับอุปกรณ์ SPI #include "dht.h" // ไลบรารี่สำหรับ DHT #define DHT22_PIN 2 // เชื่อมต่อ data pin ของ DHT22 กับ 2 digital pin #define TFT_CS 10 // เชื่อมต่อ CS pin ของ TFT กับ 10 digital pin #define TFT_RST 9 // เชื่อมต่อ RST pin ของ TFT กับ 9 digital pin // คุณยังสามารถเชื่อมต่อสิ่งนี้กับการรีเซ็ต Arduino // ในกรณีนี้ ให้ตั้งค่า #define pin นี้เป็น 0! #define TFT_DC 8 // เชื่อมต่อ DC pin ของ TFT กับ 8 pin ดิจิตอล Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); // เริ่มต้น TFT #define TFT_SCLK 13 // เชื่อมต่อ SCLK pin ของ TFT กับ 13 digital pin #define TFT_MOSI 11 // เชื่อมต่อ MOSI pin ของ TFT กับ 11 digital pin dht DHT; Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085); // เริ่มต้น BMP180 int bmpFlag = 0; struct ( uint32_t รวม; uint32_t ตกลง; uint32_t crc_error; uint32_t time_out; uint32_t เชื่อมต่อ; uint32_t ack_l; uint32_t ack_h; uint32_t ไม่ทราบ; ) stat = ( 0,0,0,0,0,0,0,0); // struct สำหรับการตั้งค่าโมฆะสถานะ dht(โมฆะ) ( Serial.begin(9600); Serial.println("Meteo Test"); Serial.println(""); if(!bmp.begin()) // ตรวจสอบการเชื่อมต่อ สำหรับ BMP180 ( Serial.print("อ๊ะ ไม่พบ BMP180 ... ตรวจสอบสายไฟหรือ I2C ADDR!"); bmpFlag = 1; ) tft.initR(INITR_BLACKTAB); // เริ่มต้น TFT และเติมด้วย tft.fillScreen สีดำ (ST7735_BLACK); tft.setRotation(tft.getRotation() + 1); tft.setTextSize(1.5); // หน่วงเวลาเพื่อให้แน่ใจว่า TFT ได้รับการเริ่มต้นแล้ว) // ข้อมูลที่วัดได้ล่าสุด oldTemperature = 0, oldAltitude = 0, oldPressure = 0, oldDHTHumidity = 0, oldDHTTemperature; = 0 || !event.pressure) // อัปเดตข้อมูล ( tft.fillRect(0, 30, 160, 6, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED); printValue("ERROR BMP INITIALIZATION", 0 , "", จริง ) else ( if(event.pressure != oldPressure) ( tft.fillRect(0, 30, 160, 7, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED) ; printValue ("ความดัน", event.pressure, "hPa", true); oldPressure = event.pressure = true ) if(temperature != oldTemperature) ( tft.fillRect(0, 38, 160, 7, ST7735_BLACK ); tft.setCursor (0, 38); tft.setTextColor(ST7735_WHITE); printValue("อุณหภูมิ", "C", จริง); oldTemperature = อุณหภูมิ; wasUpdate; (0, 46); tft.setTextColor(ST7735_BLUE); printValue("ระดับความสูง", ระดับความสูง, "m", จริง); wasUpdate = true; 54, 160, 7, ST7735_BLACK); tft.setCursor(0, 54);

    ถึงเวลาประกอบร่างกายแล้ว

    เงื่อนไขหลักของรายวิชาคือต้นแบบการทำงานในรูปแบบที่ปรากฏ ดังนั้นฉันจึงต้องซื้อที่อยู่อาศัยและติดอาวุธด้วยไฟล์เพื่อใส่สถานีตรวจอากาศเข้าไปในตัวเรือนในทางใดทางหนึ่ง

    เคสนี้ซื้อจากร้านขายอุปกรณ์อิเล็กทรอนิกส์ทางวิทยุในพื้นที่

    กรอบ

    (เคสในรูปจะแตกต่างนิดหน่อยนะคะ มีฝาปิดแบบใสค่ะ)



    จากนั้น เมื่อใช้ไฟล์ เจาะรูเพื่อส่งออกเซ็นเซอร์และจ่ายไฟ ฉันตัดสินใจย้ายเซ็นเซอร์ออกไปข้างนอก เพราะขณะทดสอบระบบโดยไม่มีเคส ฉันสังเกตเห็นว่าด้านหลังของหน้าจอร้อนมาก ซึ่งจะส่งผลต่ออุณหภูมิภายในเคส

    ตัวเรือนพร้อมช่องเปิดสำหรับเซ็นเซอร์และกำลังไฟ



    เนื่องจากฉันต้องประสานขาเข้ากับเซ็นเซอร์ 2 ตัวและเผาแทร็กด้วยหนึ่งในนั้นฉันจึงตัดสินใจที่จะไม่ล่อลวงโชคชะตาและไม่บัดกรีสายไฟเข้ากับเซ็นเซอร์ (ฉันจะฝึกอย่างอื่น) และเพื่อการเชื่อมต่อ เพื่อให้น่าเชื่อถือไม่มากก็น้อยฉันจึงตัดสินใจกรอเทปพันสายไฟ

    ระบบก่อนการ”ยัด”เข้าในตัวเครื่อง



    เนื่องจากเคสมีขนาดใหญ่กว่า Arduino มาก (ไม่มีอันที่เล็กกว่านี้) ฉันจึงต้องหาส่วนรองรับเพื่อไม่ให้บอร์ดขยับเข้าไปในเคส นอกจากนี้ ยังมีการตัดฟิกเกอร์ออกจากโฟม และในนั้นมีสี่เหลี่ยมสำหรับหน้าจอเพื่อซ่อนด้านในของเคส ฉันไม่มีกาวซุปเปอร์กาวอยู่ในมือ ดังนั้นฉันจึงต้องใช้เทปกาวสองหน้า

    ปาฏิหาริย์-ยุดา-วาฬ



    ขันฝาให้แน่น เชื่อมต่อไฟแล้วรอ

    สร้างสถานีตรวจอากาศในอาคารเสร็จแล้ว



    หลังจากแสดงผลลัพธ์บนหน้าจอ เราพบข้อผิดพลาดอันไม่พึงประสงค์ในการวัดความชื้น: DHT22 ขยันสร้างตัวเลข 99.90% (1.00% นั้นหายากมาก) เรามาเริ่มกันว่าปัญหาคืออะไร สิ่งแรกที่เราทำคือดูที่ผลลัพธ์ของค่าไปยังพอร์ต COM ทุกอย่างดูเหมือนจะดี หลังจากการเติม การแยกชิ้นส่วน และการประกอบกลับหลายครั้ง แนวคิดนี้ก็เกิดขึ้นในใจที่จะค้นหาคำตอบใน Google ตามที่คาดไว้ Google ภาษารัสเซียไม่ได้พูดอะไรที่เป็นประโยชน์ ตกลง. เราเริ่มค้นหาเป็นภาษาอังกฤษและในฟอรัมหนึ่งที่เราพบผู้ชายที่มีปัญหาคล้ายกัน การสนทนาสี่หน้าแรกไม่ได้ให้ประโยชน์อะไร แต่ในหน้าห้าเราพบคำตอบสำหรับคำถามของเรา:
    เซ็นเซอร์ความชื้นอาจได้รับผลกระทบจากก๊าซที่ไม่ถูกต้องหรือการสัมผัสกับ IIRC ที่มีความชื้นสูงเป็นเวลานานมาก ในแผ่นข้อมูลมีขั้นตอนวิธี "รีเซ็ต" เซ็นเซอร์ คุณสามารถลองดูได้

    คำถามเดียวที่ยังคงอยู่คือฉันจะจัดการสร้างความเสียหาย DHT22 เมื่อใดและอย่างไร แต่ใกล้จะถึงเวลาเข้าเรียนแล้ว ฉันก็เลยทิ้งวิธีแก้ปัญหาไว้ไว้ใช้ทีหลัง

    คำหลัง

    วิชาเรียนผ่านไปแล้ว สถานีตรวจอากาศถูกเลื่อนออกไปไม่มีกำหนดจนกว่าหางแร่ในมหาวิทยาลัยจะปิดทั้งหมด อย่างไรก็ตามเราต้องกลับสถานีตรวจอากาศเร็วกว่าที่คิด มันเกิดขึ้นในช่วงกลางเดือนพฤศจิกายน ฉันเปลี่ยนที่ทำงาน และได้พบกับผู้ที่สนใจแพลตฟอร์ม Arduino และอื่นๆ ในทีมใหม่ ดังนั้นความสนใจของฉันในแพลตฟอร์มนี้จึงพุ่งขึ้นมาอีกครั้งโดยไม่มีเวลาให้ใจเย็นลง ฉันนำสถานีตรวจอากาศออกมา เชื่อมต่อกับคอมพิวเตอร์ และจำได้ว่าฉันใช้การถ่ายโอนข้อมูลจาก Arduino ผ่านทางพอร์ต COM จากนั้นฉันก็มีความคิดที่จะเขียนโปรแกรมที่รับข้อมูลผ่านพอร์ต COM จาก Arduino และส่งข้อมูลนี้ไปยังการตรวจสอบสาธารณะ แต่นั่นเป็นเรื่องราวที่แตกต่างไปจากเดิมอย่างสิ้นเชิง

    ฉันยังอยากมีเซ็นเซอร์ไร้สายและยังคงติดตั้งสถานีตรวจอากาศบน Arduino Pro Mini ดังนั้นฉันจึงสั่งซื้อ Arduino Pro Minis 4 ตัวพร้อมแหล่งจ่ายไฟ 3.3V, โมดูลวิทยุ nRF24L01+ 4 ตัว และเซ็นเซอร์เพิ่มเติมบางตัว ซึ่งฉันจะลองพูดถึงในครั้งต่อไปด้วย ในระหว่างนี้ฉันกำลังรอพัสดุมีแผนที่จะใช้การเชื่อมต่อนาฬิกาเรียลไทม์เพื่อให้สามารถประหยัดเวลาในการอัพเดตข้อมูลและข้อมูลในการ์ด microSD โดยที่ไม่มีการเชื่อมต่อกับ ลูกค้าผ่านทางพอร์ต COM

    คุณสามารถช่วยเหลือและโอนเงินบางส่วนเพื่อการพัฒนาเว็บไซต์ได้