نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی پرتال اطلاعاتی
  • خانه
  • خطاها
  • ایستگاه هواشناسی داخلی با پلت فرم سخت افزاری آردوینو ساعت. ایستگاه هواشناسی آردوینو با سنسور دمای بی سیم

ایستگاه هواشناسی داخلی با پلت فرم سخت افزاری آردوینو ساعت. ایستگاه هواشناسی آردوینو با سنسور دمای بی سیم

ما به توسعه ایستگاه هواشناسی خود ادامه می دهیم.

قبل از رفتن به به روز رسانی، می خواهم کمی توضیح دهم.

یکی از همکاران ما به من نامه نوشت که چرا سگ نگهبان معرفی شده است؟

تایمر نگهبان در مواقع اضطراری است. همانطور که تمرین نشان می دهد، ENC28J60 4 اتصال همزمان را بیشتر نمی کشد (اگر حافظه خراب نشود). با توجه به تعداد اتصالات سرویس، دائماً برای حفظ عملکرد خود شبکه اتفاق می افتد، و فقط ترافیک ایجاد شده توسط انواع اسباب بازی های خانگی (به عنوان مثال، تلویزیون های مدرن میزبان های موجود در شبکه را اسکن می کنند و پورت ها را برای آنها باز می کنند)، طراحی به سادگی وارد حالت گیجی می شود ENC28J60 نمی داند چگونه به طور مستقل با پروتکل های شبکه کار کند و همه چیز در کتابخانه ها پیاده سازی می شود. شاید در آنها باشد.
تمام کتابخانه‌های موجود و ماژول‌های مختلف (ناگهان ازدواج) را بررسی کردم، اما برای مدت طولانی نتوانستم به کار پایدار برسم. حداکثر دوره حدود 3-4 هفته بود.
برای این است که "سگ" در آنجا می چرخد ​​و اگر اتفاقی بیفتد ، کنترل کننده تکان می خورد. بعد از آن مشکل برطرف شد.
همچنین منکر این نیستم که ممکن است در شبکه خانگی من ظرافت ها یا مشکلات خاصی وجود داشته باشد. اما از آنجایی که من یک مشکل داشتم، ممکن است برای شخص دیگری پیش بیاید. من تا الان فقط چنین راه حلی پیدا کردم.
تا اونجایی که من میدونم چیپ های Wiznet (W5100 و بالاتر) این رو ندارند یا فقط ظاهر بدی داشتند.

حرکت به سمت به روز رسانی

مهمتر از همه، ما تراشه را ترک می کنیم ENC28J60و برو به W5100... من سعی کردم همه چیز را روی یک تراشه قدیمی پیاده سازی کنم، اما به دلیل کتابخانه های بسیار بزرگ، حافظه میکروکنترلر کافی وجود ندارد ENC28J60... هنگام استفاده از یک تراشه جدید، استانداردکتابخانه ها از توسعه دهنده و تمام تغییرات ایجاد شده، حتی بیشتر وجود دارد 20% حافظه میکروکنترلر رایگان ATMega328... و این، نان های جدید!

این نسخه (بیایید آن را دومی بنامیم) قابلیت انتقال قرائت از حسگرها به صورت بی سیم با استفاده از فرکانس را اضافه کرد. 433 مگاهرتز... من خود ماژول ها را از چینی ها گرفتم و علامت گذاری کردم XY-MK-5V... من می خواهم توجه داشته باشم که کیفیت انتقال بسیار عالی است. از دست دادن سیگنال، نویز، عدم توانایی در انتقال همزمان و غیره و غیره امکان پذیر است. اما قیمت آنها (کمتر از 1 دلار در هر مجموعه) این معایب را جبران می کند. رازی را به شما می گویم که این (ارزان ترین) ماژول ها در بسیاری از ایستگاه های هواشناسی مارک دار برای استفاده خانگی هستند. وای، غیر منتظره؟

بیایید با ایستگاه پایه شروع کنیم

ما در حال حرکت به سمت آردوینو UNOو سپر اترنت(نسخه اول) بر اساس تراشه W5100... این یک ساندویچ است و هیچ فایده ای برای توصیف آن ندارد. من فقط مخاطبین استفاده شده اضافی برای ماژول ها را شرح خواهم داد XY-MK-5V.

ماژول فرستنده از برق استفاده می کند 5 ولت, GND(جایی که بدون مادر پس) و D2سنجاق روی کنترلر تغییر تماس D2 (DATA)می توانید از تابع استفاده کنید vw_set_tx_pinاز کتابخانه vw

برخلاف طرح قبلی، این شامل دو کتابخانه اضافی است:

#عبارتند از #عبارتند از

خود طرح

متن پنهان

#عبارتند از #عبارتند از #عبارتند از #عبارتند از #عبارتند از #عبارتند از #عبارتند از #عبارتند از #define DHTTYPE DHT22 #define DHTPIN 5 DHT dht (DHTPIN, DHTTYPE); بایت مک = (0x54، 0x34، 0x31، 0x31، 0x31، 0x31)؛ سرور char = "narodmon.ru"; پورت int = 8283; IPaddress ip (192,168,0,201); مشتری EthernetClient؛ BMP085 dps = BMP085 (); درجه حرارت طولانی = 0، فشار = 0; شناور H، dP، dPt. فاصله bool = درست; EasyTransferVirtualWire ET. ساختار SEND_DATA_STRUCTURE (شناسه بایت؛ // شناسه دستگاه int دما؛ // فشار شناور دما؛ // رطوبت شناور فشار؛ // نقطه شبنم شناور رطوبت؛ // شبنم / نقطه یخ زدگی); پخش SEND_DATA_STRUCTURE. void setup () (// راه اندازی تایمر Watchdog wdt_disable ()؛ تاخیر (8000)؛ wdt_enable (WDTO_8S)؛ // راه اندازی کنسول Serial.begin (9600)؛ // راه اندازی سنسور DHT dht.begin ()؛ / / اولیه سازی ماژول 433 مگاهرتز ET.begin (جزئیات (پخش)؛ vw_set_ptt_inverted (درست)؛ vw_set_tx_pin (2)؛ vw_setup (2000)؛ // شبکه را راه اندازی کنید، اگر منتظر داده های سرور DHCP نبودیم ، سپس // یک آدرس به خود اختصاص می دهیم اگر (Ethernet.begin (mac) == 0) Ethernet.begin (mac, ip)؛ // Initialize 1-Wire Wire.begin (); delay (200)؛ // Initialize BMP180 با تصحیح ارتفاع // dps.init (MODE_STANDARD، 3200، درست)؛ // راه اندازی BMP180 dps.init ()؛ Serial.println (Ethernet.localIP ())؛ // ارسال اولین داده بلافاصله پس از روشن کردن دستگاه send_info (درست؛) // تابع نقطه شبنم NOAA / / مرجع (1): http://wahiduddin.net/calc/density_algorithms.htm // مرجع (2): http://www.colorado.edu/geography/weather_station /Geog_site/about.htm دو ​​نقطه شبنم (دوبرابر سانتیگراد، رطوبت دو برابر) (// (1) فشار بخار اشباع = ESGG (T) دو برابر نسبت = 373.15 / (273.15 + سلسیوس); دو برابر RHS = -7.90298 * (نسبت - 1)؛ RHS + = 5.02808 * log10 (نسبت)؛ RHS + = -1.3816e-7 * (Pow (10، (11.344 * (1 - 1 / RATIO))) - 1). RHS + = 8.1328e-3 * (Pow (10، (-3.49149 * (نسبت - 1))) - 1). RHS + = log10 (1013.246)؛ // فاکتور -3 برای تنظیم واحدها است - فشار بخار SVP * رطوبت دو برابر VP = pow (10، RHS - 3) * رطوبت. // (2) DEWPOINT = F (فشار بخار) دو برابر T = ورود (VP / 0.61078)؛ // بازگشت موقت var (241.88 * T) / (17.558 - T); ) void send_info (bool eth) (bool fail = true; while (fail) (// سعی می کنیم داده ها را از حسگر رطوبت DHT بخوانیم تا زمانی که // نتیجه را بگیریم. در 90٪ موارد همه چیز خوب کار می کند، اما ما نیاز داریم 100% اگر ((H = dht.readHumidity ())> = 0) (// دریافت رطوبت و دما از حسگر BMP180 dps.getPressure (& Pressure)؛ dps.getTemperature (& Temperature)؛ // محاسبه شبنم اگر دما در خارج از 0 درجه سانتیگراد // باشد نقطه گذاری کنید و انتظار نتیجه بالاتر از 0 را داشته باشید، در غیر این صورت خروجی 0 باشد. این لازم است // برای اینکه در فصل زمستان گمراه نشوید. // dP = دما> 0؟ ((dPt = نقطه شبنم (دما * 0.1، H))<0?0:dPt):0; dP = dewPoint(Temperature*0.1, H); // Отправляем данные в эфир 433 мГц broadcast.ID = 1; broadcast.Temperature = floor(Temperature*0.1); broadcast.Pressure = floor(Pressure/133.3*10)/10; broadcast.Humidity = floor(H*10)/10; broadcast.dewPoint = floor(dP*10)/10; ET.sendData(); delay(250); if(eth) { // Подключаемся к серверу "Народный мониторинг" if(client.connect(server, port)) { // Начинаем передачу данных // адрес_устройства_в_проекте, имя_устройства, GPS широта, GPS долгота client.print(F("#fe-31-31-0e-5a-3b#Arduino Uno#71.344699#27.200014\n")); // Температура client.print(F("#T0#")); client.print(Temperature*0.1); client.print(F("#Температура\n")); // Давление client.print("#P1#"); client.print(Pressure/133.3); client.print(F("#Давление\n")); // Влажность client.print("#H1#"); client.print(H); client.print(F("#Влажность\n")); // Точка росы\инея client.print("#T1#"); client.print(dP); client.print((dP <= 0)? F("#Точка инея\n"):F("#Точка росы\n")); //client.print(F("#Точка росы\n")); // Отправляем конец телеграммы client.print("##"); // Даем время отработать Ethernet модулю и разрываем соединение delay(250); client.stop(); } } // Останавливаем цикл, если передача завершена fail = !fail; break; } delay(250); } } void loop() { // Каждые 4 секунды сбрасываем сторожевой таймер микроконтроллера // Каждые 6 минут отправляем данные на "Народный мониторинг" // Каждые 30 секунд отсылаем данные в эфир 433 if(!(millis()%1000)) wdt_reset(); if(!(millis()%360000)) send_info(true); if(!(millis()%30000)) send_info(false); }

یک آنتن باید به خود ماژول ها اضافه شود. برای 433 مگاهرتزیک سیم مسی بلند معمولی کافی است 17 سانتی متر... بدون آنتن، می توانید عملکرد عادی را فراموش کنید.

در حال حرکت به مهمترین بخش این به روز رسانی - ایستگاه بی سیم محلی است

برای اجرای آن (روی زانویم) از آنالوگ استفاده کردم آردوینو نانو(روی پایه ATMega328) و TFTنمایش بر روی تراشه ST7735Sبا اجازه 128*160

متن پنهان



نمایشگر Pinout -> کنترلر

============================== LED | 3.3 ولت SCK | SCK (13) SDA | MOSI (11) A0 | DC (9) RESET | RST (8) CS | CS (10) GND | GND VCC | 5 ولت ==============================

ماژول گیرنده فقط به همان روشی که فرستنده است متصل می شود داده هاسنجاق کردن D7.

چند عکس از ظاهر آن:

متن پنهان

طرح گیرنده

متن پنهان

#عبارتند از #عبارتند از #عبارتند از #عبارتند از int x, y; int w = 128, h = 160; اندازه int; // 433 EasyTransferVirtualWire ET; ساختار SEND_DATA_STRUCTURE (شناسه بایت؛ // شناسه دستگاه int دما؛ // فشار شناور دما؛ // رطوبت شناور فشار؛ // نقطه شبنم شناور رطوبت؛ // شبنم / نقطه یخ زدگی); پخش SEND_DATA_STRUCTURE. int Log_Temperature = -1; float Log_Pressure = -1; float Log_Humidity = -1; float Log_dewPoint = -1; // TFT #define cs 10 #define dc 9 #define rst 8 char دما، فشار، رطوبت، نقطه شبنم. اطلاعات رشته؛ TFT TFTscreen = TFT (cs، dc، rst)؛ void setup () (Serial.begin (9600)؛ // راه اندازی ماژول 433 مگاهرتز ET.begin (جزئیات (پخش شده))؛ vw_set_ptt_inverted (true)؛ vw_set_rx_pin (7)؛ vw_setup (2000)؛ vw_rx_st. / مقداردهی اولیه و تنظیمات صفحه نمایش اولیه TFTscreen.begin ()؛ TFTscreen.setRotation (2)؛ TFTscreen.background (0، 0، 0)؛ // رسم عناصر استاتیک // 1. TFTscreen.stroke (255, 255, 255)؛ TFTscreen.setTextSize (1)؛ TFTscreen.text (""، 10، 10)؛ // 2. شرح قرائت از حسگرهای TFTscreen.text ("mmHg"، w / 2 + 5، 80)؛ TFTscreen. متن ("%"، w / 2 + 5، 100)؛ TFTscreen.text ("C"، w / 2 + 5، 120)؛ پخش. دما = 0؛ پخش. فشار = 0؛ پخش. رطوبت = 0. radio . println (broadcast.Pressure)؛ Serial.println (پخش. رطوبت)؛ Serial.println (broadcast.dewPoint)؛ Serial.println (); * /)) تغییرات خالی (اندازه int، int x , int y, bool up, bool clear = false) (if (clear) TFTscreen.stroke (0, 0, 0); else (تغییر می کند (اندازه، x، y،! بالا، درست)؛ TFTscreen.stroke ((بالا)؟ 0: 255، 0، (بالا)؟ 255: 0؛) اگر ((اندازه% 2) == 0 ) اندازه ++; while (اندازه> 0) (TFTscreen.line (x، y، x + (اندازه--)، y؛ ++ x، (بالا)؟ - y: ++ y، --size;) / * در حالی که ( اندازه> 0) (TFTscreen.line (x، y، (بالا)؟ x + اندازه-1: x، (بالا)؟ y: y + اندازه-1؛ ++ x، ++ y، --size; ) * /) int x_center (int w, int طول, int size) (طول برگشتی ((w-length * (اندازه * 5) + اندازه * 2) / 2)؛) int x_alignment_right (int w, int length, int اندازه) (سقف برگشتی (طول w * (اندازه * 5) + اندازه * 2)؛) خالی TFTPprint () (اندازه = 3; // ================= ================================================== =============== // نمایش قرائت دما // ============================ ================================================== ==== if (broadcast.Temperature! = Log_Temperature) (TFTscreen.setTextSize (اندازه)؛ // پاک کردن داده های قدیمی اطلاعات رشته = رشته (Log_Temperature)؛ info.concat ("C")؛ if (Log_Temperature> 0) اطلاعات = "+" + اطلاعات؛ info.toCharArray (دما، info.length () + 1؛ TFTscreen.stroke (0، 0، 0)؛ TFTscreen.text (دما، x_center (w، info.length () + 1 ، اندازه)، 35)؛ // نمایش قرائت های جدید i info = رشته (پخش شده. درجه حرارت)؛ info.concat ("C")؛ if (broadcast.Temperature> 0) info = "+" + info; info.toCharArray (دما، info.length () + 1)؛ // تغییر رنگ مقدار دما بسته به خود دما int r, g = 0, b; if (broadcast.temperature> 0) (r = map (broadcast.temperature, 0, 40, 255, 150)؛ // قرمز b = map (broadcast.temperature, 0, 40, 30, 0)؛ // تغییر رنگ برای انتقال بصری بیشتر از صفر) other (r = نقشه (پخش. دما، -40، 0، 0، 30)؛ // تغییر رنگ برای انتقال بصری بیشتر از صفر b = نقشه (پخش. دما، - 40، 0، 150، 255)؛ // آبی) TFTscreen.stroke (b، g، r); // اخطار: موقعیت های رنگی در کتابخانه مخلوط شده اند، فضای RGB توسط BGR استفاده می شود! TFTscreen.text (دما، x_center (w، info.length () + 1، اندازه)، 35); ) اندازه = 1; // =============================================== ==================================// نمایش خوانش فشار // ========= ================================================== ======================= if (broadcast.Pressure! = Log_Pressure) (TFTscreen.setTextSize (اندازه)؛ // رونویسی اطلاعات منسوخ شده = رشته (Log_Pressure) info.toCharArray (Pressure, info.length ())؛ TFTscreen.stroke (0, 0, 0)؛ TFTscreen.text (Pressure, x_alignment_right (w / 2-5, info.length (), اندازه), 80 // نمایش اطلاعات قرائت جدید = رشته (پخش. فشار)؛ info.toCharArray (فشار، info.length ())؛ TFTscreen.stroke (255، 255، 255)، TFTscreen.text (Pressure، x_alignment_right (w / 2-5، info.length ()، اندازه)، 80)؛ تغییرات (10، 106، 85، (پخش. فشار> Log_Pressure)؟ درست: نادرست؛) else (تغییرها (10، 106، 85، درست، درست)؛ تغییرات (10، 106، 85، نادرست، درست؛) // =============================== ================================================== = // نمایش قرائت رطوبت // ================== ================================================== ============== اگر (پخش.رطوبت! = Log_Humidity) (TFTscreen.setTextSize (اندازه); // پاک کردن اطلاعات منسوخ شده = رشته (Log_Humidity); info.toCharArray (رطوبت، info.length ()); TFTscreen.stroke (0، 0، 0); TFTscreen.text (رطوبت، x_alignment_right (w / 2-5، info.length ()، اندازه)، 100); // چاپ اطلاعات خواندنی جدید = رشته (پخش.رطوبت); info.toCharArray (رطوبت، info.length ()); TFTscreen.stroke (255، 255، 255); TFTscreen.text (رطوبت، x_alignment_right (w / 2-5، info.length ()، اندازه)، 100); تغییرات (10, 106, 105, (پخش.رطوبت> Log_Humidity)? true: false); ) else (تغییر می کند (10، 106، 105، درست، درست)؛ تغییرات (10، 106، 105، نادرست، درست)؛) // ================== ================================================== ============== // نمایش قرائت های نقطه شبنم / یخبندان // ========================= ================================================== ====== اگر (broadcast.dewPoint! = Log_dewPoint) (TFTscreen.setTextSize (اندازه)؛ // پاک کردن اطلاعات داده های قدیمی = رشته (Log_dewPoint)؛ info.toCharArray (dewPoint، info.length ())؛ TFTscreen.stroke (0، 0، 0)؛ TFTscreen.text (dewPoint، x_alignment_right (w / 2-5، info.length ()، اندازه)، 120؛ // نمایش اطلاعات قرائت جدید = رشته (broadcast.dewPoint)؛ info.toCharArray (dewPoint، info.length ()); TFTscreen.stroke (255، 255، 255)؛ TFTscreen.text (dewPoint، x_alignment_right (w / 2-5، info.length ()، اندازه)، 120؛ تغییرات (10، 106، 125، (broadcast.dewPoint> Log_dewPoint)؟ True: false);) else (تغییر می کند (10، 106، 125، true، true)؛ تغییرات (10، 106، 125، false، true);) // مقادیر موجود در گزارش ها را برای موارد بعدی به روز کنید مقایسه قرائت Log_Temperature = Broadcast.Temperature; Log_Pressure = پخش. فشار; Log_Humidity = پخش.رطوبت; Log_dewPoint = broadcast.dewPoint; )

نشانه ها نسبتاً فشرده نمایش داده می شوند ، اما همانطور که تمرین نشان می دهد (و توصیه رفقای من) - "از نظر طعم و رنگ ، حتی همسر من دوست نیست." من به یک سری توصیه ها و پیشنهادها گوش داده ام، اما آنها با یکدیگر تناقض دارند. پس آن را به دلخواه خود انجام دهید.

به نظر من طراحی بخشی از پروژه است که بیشتر زمان را به خود اختصاص می دهد!

متن پنهان

برخی از داده ها برای نمایش برخی از عناصر طراحی ساخته شده اند.

مصنوعات روی نمایشگر، اینها گرد و غبار و کثیفی های دیگری هستند که در مدت طولانی انباشته شده اند. بزار تو حال خودم باشم!

طرح دارای عملکردهای موقعیت یابی است. آنها کاملاً ابتدایی هستند، اما به شما اجازه می دهند تا به اثرات خاصی برسید.

  1. x_center
  2. x_alignment_right

اولی متن را در مرکز قرار می دهد و دومی آن را در سمت راست منطقه مشخص شده تراز می کند. تمام محاسبات نسبت به اندازه متن مشخص شده بر اساس عبارت انجام می شود 1 سایز = 1PX x 1PXبخش فونت

صفحه نمایش همچنین عناصر مربوط به افزایش یا کاهش این یا آن مقدار قرائت ها را نشان می دهد. آنها به صورت مثلث نمایش داده می شوند. اما در کد تابع تغییر می کندیک صفحه نمایش جایگزین به شکل مثلث هایی وجود دارد که 45 درجه می چرخند. اگر قرائت ها افزایش یابد، عنصر قرمز و در غیر این صورت آبی است.

به هر حال، رنگ و سایه دمای اصلی بسته به خود دما تغییر می کند. یک تصمیم کاملا بحث برانگیز، اما به نظر من، از نظر بصری راحت است. مدتی بر سر آن دعوا کردم و متوجه شدم که مقادیر موجود در تابع هستند سکته، اشیاء نمایشگر TFT به ترتیب اشتباه فهرست شده اند. BGRجایی RGB... این اشتباه یک توسعه دهنده است یا چیزی که من نمی فهمم.

PS: همه چیز بسیار جالب است، اما به نظر من سزاوار توسعه بیشتر است. کاری که بعد از مدتی انجام خواهیم داد.

اخیرا یکی از همکارانم میزبان یک نمایشگاه علمی کوچک بود.
معلمم از من خواست که یک پروژه الکترونیک را به دانشجویان معرفی کنم. دو روز فرصت داشتم تا به یک چیز جالب و به اندازه کافی ساده برسم.



از آنجایی که شرایط آب و هوایی اینجا کاملاً متغیر است و دما در محدوده 30-40 درجه سانتیگراد در نوسان است، تصمیم گرفتم یک ایستگاه هواشناسی خانگی بسازم.

وظایف ایستگاه هواشناسی خانگی چیست؟
آردوینو Weather Station با نمایشگر دستگاهی است که با استفاده از انواع سنسورها اطلاعات مربوط به آب و هوا و شرایط محیطی را جمع آوری می کند.

معمولاً اینها سنسورهای زیر هستند:

  • باد
  • رطوبت
  • باران
  • درجه حرارت
  • فشار
  • ارتفاعات

هدف من ساختن یک ایستگاه هواشناسی رومیزی قابل حمل با دستان خودم است.

او باید بتواند پارامترهای زیر را تعیین کند:

  • درجه حرارت
  • رطوبت
  • فشار
  • ارتفاع

مرحله 1: قطعات لازم را بخرید







  • DHT22، سنسور دما و رطوبت.
  • سنسور فشار BMP180
  • لحیم کاری
  • کانکتور 40 طرفه تک ردیف

از تجهیزاتی که نیاز دارید:

  • آهن لحیم کاری
  • پنس پد بینی
  • سیم ها

مرحله 2: سنسور دما و رطوبت DHT22







برای اندازه گیری دما از سنسورهای مختلفی استفاده می شود. DHT22، DHT11، SHT1x محبوب هستند

من توضیح خواهم داد که چگونه آنها با یکدیگر تفاوت دارند و چرا از DHT22 استفاده کردم.

سنسور AM2302 از سیگنال دیجیتال استفاده می کند. این سنسور از یک سیستم کدگذاری منحصر به فرد و فناوری حسگر استفاده می کند، بنابراین داده های آن قابل اعتماد است. عنصر حسگر آن به یک کامپیوتر تک تراشه 8 بیتی متصل است.

هر سنسور این مدل با جبران دما و کالیبراسیون دقیق، ضریب کالیبراسیون در یک حافظه قابل برنامه ریزی یکبار مصرف (حافظه OTP) ذخیره می شود. هنگام خواندن قرائت ها، سنسور ضریب را از حافظه به یاد می آورد.

اندازه کوچک، مصرف برق کم، فاصله انتقال طولانی (100 متر) AM2302 را برای تقریباً همه برنامه ها مناسب می کند و 4 خروجی در یک ردیف نصب را بسیار آسان می کند.

بیایید نگاهی به مزایا و معایب سه مدل سنسور بیاندازیم.

DHT11

مزایا: بدون نیاز به لحیم کاری، ارزان ترین مدل از سه مدل، سیگنال پایدار سریع، برد بیش از 20 متر، تداخل قوی.
معایب: کتابخانه! بدون گزینه وضوح، خطای اندازه گیری دما +/- 2 ° C، خطای اندازه گیری سطح رطوبت نسبی +/- 5٪، محدوده نامناسب دماهای اندازه گیری شده (0-50 ° C).
کاربرد: باغبانی، کشاورزی.

DHT22

مزایا: بدون نیاز به لحیم کاری، هزینه کم، منحنی های صاف، خطاهای اندازه گیری کوچک، محدوده اندازه گیری بزرگ، برد بیش از 20 متر، تداخل قوی.
معایب: حساسیت می تواند بیشتر باشد، ردیابی کند تغییرات دما، کتابخانه مورد نیاز است.
کاربرد: مطالعات محیطی.

SHT1x

مزایا: بدون نیاز به لحیم کاری، منحنی های صاف، خطاهای اندازه گیری کوچک، پاسخ سریع، مصرف انرژی کم، خواب خودکار، پایداری بالا و ثبات داده ها.
معایب: دو رابط دیجیتال، خطا در اندازه گیری سطح رطوبت، محدوده دمای اندازه گیری شده 0-50 درجه سانتیگراد است، یک کتابخانه مورد نیاز است.
کاربردها: عملکرد در شرایط سخت و در نصب طولانی مدت. هر سه سنسور نسبتاً ارزان هستند.

ترکیب

  • Vcc - 5 ولت یا 3.3 ولت
  • گند - با گند
  • داده - به پین ​​دوم آردوینو

مرحله 3: سنسور فشار BMP180



BMP180 یک سنسور فشار هوا با رابط I2C است.
سنسورهای فشار هوا قدر مطلق هوای محیط را اندازه گیری می کنند. این رقم به شرایط آب و هوایی خاص و ارتفاع بستگی دارد.

ماژول BMP180 یک رگولاتور 3.3 ولت 662 کیلو اهم داشت که من از روی حماقت خودم به طور تصادفی آن را منفجر کردم. من مجبور شدم ردیابی نیرو را مستقیماً روی تراشه انجام دهم.

به دلیل عدم وجود تثبیت کننده، من در انتخاب منبع تغذیه محدود هستم - ولتاژ بالاتر از 3.3 ولت سنسور را از بین می برد.
مدل های دیگر ممکن است تثبیت کننده نداشته باشند، حتما یکی را بررسی کنید.

نمودار اتصال سنسور و گذرگاه I2C با آردوینو (نانو یا uno)

  • SDA - A4
  • SCL - A5
  • VCC - 3.3 ولت
  • GND - GND

بیایید کمی در مورد فشار و رابطه آن با دما و ارتفاع صحبت کنیم.

فشار اتمسفر در هر نقطه ثابت نیست. فعل و انفعالات پیچیده بین چرخش زمین، شیب زمین، منجر به بسیاری از مناطق با فشار بالا و پایین می شود که به نوبه خود منجر به تغییر روزانه شرایط آب و هوایی می شود. با مشاهده تغییر فشار می توانید پیش بینی کوتاه مدتی از آب و هوا داشته باشید.

به عنوان مثال، افت فشار معمولاً به معنای هوای بارانی یا رعد و برق قریب الوقوع است (نزدیک شدن به یک منطقه کم فشار، طوفان). افزایش فشار معمولاً به معنای هوای خشک و صاف است (یک منطقه با فشار بالا، یک آنتی سیکلون از روی شما می گذرد).

فشار اتمسفر نیز با افزایش ارتفاع تغییر می کند. فشار مطلق در کمپ اصلی در اورست (5400 متر بالاتر از سطح دریا) کمتر از فشار مطلق در دهلی (216 متر بالاتر از سطح دریا) است.

از آنجایی که خوانش فشار مطلق در هر مکان تغییر می کند، به فشار نسبی یا فشار سطح دریا اشاره خواهیم کرد.

اندازه گیری قد

فشار متوسط ​​در سطح دریا 1013.25 GPa (یا میلی بار) است. اگر بالاتر از جو قرار بگیرید، این مقدار به صفر می رسد. منحنی این افت کاملاً قابل درک است، بنابراین می توانید ارتفاع را خودتان با استفاده از معادله زیر محاسبه کنید: alti = 44330 *

اگر فشار سطح دریا 1013.25 گیگا پاسکال را p0 در نظر بگیرید، راه حل معادله ارتفاع فعلی شما است.

اقدامات پیشگیرانه

به یاد داشته باشید که سنسور BMP180 برای اینکه بتواند فشار هوا را بخواند نیاز به دسترسی به جو اطراف دارد، سنسور را در محفظه بسته قرار ندهید. یک سوراخ کوچک تهویه باید کافی باشد. اما آن را خیلی باز نگذارید - باد فشار و ارتفاع را پایین می آورد. حفاظت از باد را در نظر بگیرید.

از گرما محافظت کنید. برای اندازه گیری فشار، خوانش دقیق دما مورد نیاز است. سعی کنید سنسور را در برابر دمای شدید محافظت کنید و آن را در نزدیکی منابع دمای بالا قرار ندهید.

از رطوبت محافظت کنید. سنسور BMP180 به سطوح رطوبت حساس است، سعی کنید از ورود آب احتمالی به سنسور جلوگیری کنید.

سنسور را کور نکنید یک شگفتی حساسیت سیلیکون موجود در سنسور به نور بود که می تواند از طریق سوراخ در پوشش تراشه وارد آن شود. برای دقیق ترین اندازه گیری ها، سعی کنید سنسور را از نور محیط محافظت کنید.

مرحله 4: مونتاژ دستگاه







نصب کانکتورهای تک ردیفی برای آردوینو نانو. راستی اونها رو به اندازه مناسب برش زدیم و کمی سمباده زدیم تا مثل خودش بشه. سپس آنها را لحیم می کنیم. پس از آن، ما کانکتورهای تک ردیفی را برای سنسور DHT22 نصب می کنیم.

یک مقاومت 10 کیلو اهم از پین داده به زمین (Gnd) نصب کنید. ما همه چیز را لحیم می کنیم.
سپس به همین ترتیب یک کانکتور تک ردیفی برای سنسور BMP180 نصب می کنیم، منبع تغذیه 3.3 ولت است. ما همه چیز را به اتوبوس I2C وصل می کنیم.

در نهایت نمایشگر LCD را به همان باس I2C سنسور BMP180 متصل می کنیم.
(من قصد دارم بعداً یک ماژول RTC (ساعت واقعی) را به کانکتور چهارم وصل کنم تا دستگاه هم زمان را نشان دهد).

مرحله 5: رمزگذاری




بارگذاری کتابخانه ها

برای نصب کتابخانه ها در آردوینو، لینک را دنبال کنید

#عبارتند از
#include #include #include "DHT.h" #include

فشار SFE_BMP180;

#define ALTITUDE 20.56 #define I2C_ADDR 0x27 //<<- Add your address here. #define Rs_pin 0 #define Rw_pin 1 #define En_pin 2 #define BACKLIGHT_PIN 3 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7

#define DHTPIN 2 // به چه پین ​​دیجیتالی وصل شده ایم

// هر نوع را که استفاده می‌کنید لغو نظر کنید! // # define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 DHT dht (DHTPIN, DHTTYPE, Enterprises, 2, LiquidCrystal_DR, LiquidCrystal_Dr Rs_pin، D4_pin، D5_pin، D6_pin، D7_pin؛ float t1، t2.

تنظیم void () (Serial.begin (9600)؛ lcd.begin (16,2)؛ //<<-- our LCD is a 20x4, change for your LCD if needed // LCD Backlight ON lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.home (); // go home on LCD lcd.print("Weather Station"); delay(5000); dht.begin(); pressure.begin(); } void loop() { char status; double T,P,p0,a; status = pressure.startTemperature(); if (status != 0) { delay(status);

status = press.getTemperature (T); if (وضعیت! = 0) (Serial.print ("1")؛ lcd.clear (); lcd.setCursor (0,0)؛ lcd.print ("Baro Temperature:")؛ lcd.setCursor (0,1 lcd.print (T, 2)؛ lcd.print ("درجه C")؛ t1 = T؛ تاخیر (3000).

status = press.startPressure (3); if (وضعیت! = 0) (// منتظر بمانید تا اندازه گیری کامل شود: تاخیر (وضعیت);

status = press.getPressure (P, T); if (وضعیت! = 0) (lcd.clear (); lcd.print ("mb")؛ تاخیر (3000);

p0 = فشار. sealevel (P، ALTITUDE)؛ // ما در 1655 متر هستیم (بولدر، CO)

a = فشار. ارتفاع (P، p0)؛ lcd.clear (); lcd.setCursor (0,0); lcd.print ("ارتفاع:"); lcd.setCursor (0،1); lcd.print (a, 0); lcd.print ("متر")؛ تاخیر (3000); )))) float h = dht.readHumidity (); // خواندن دما به صورت سلسیوس (پیش فرض) float t = dht.readTemperature (); t2 = t; lcd.clear (); lcd.setCursor (0,0); // به شروع خط 2 lcd.print بروید ("رطوبت:"); lcd.setCursor (0,1)؛ lcd.print (h); lcd.print ("%"); تاخیر (3000); lcd.clear (); lcd.setCursor (0,0); // به شروع خط 2 lcd.print بروید ("DHT Tempurature:"); lcd.setCursor (0،1); lcd.print (t); lcd.print ("درجه C")؛ تاخیر (3000); lcd.clear (); lcd.setCursor (0,0); // رفتن به ابتدای خط 2nd lcd.print ("Mean Tempurature:"); lcd.setCursor (0،1); lcd.print ((t1 + t2) / 2); lcd.print ("درجه C")؛ تاخیر (3000); )

من از نسخه آردوینو 1.6.5 استفاده کردم، کد دقیقاً با آن مطابقت دارد، همچنین می تواند برای نسخه های بعدی مناسب باشد. اگر کد به دلایلی مناسب نیست، از نسخه 1.6.5 به عنوان پایه استفاده کنید.

مانند بسیاری از افراد شاغل، انجام پروژه های خود تنها زمان آزاد باقی مانده را می گیرد. بنابراین، من برای مدت طولانی خلق نکردم و برای انجام کاری "دست هایم را خارش کردم". این فرصت به اندازه کافی عجیب در دانشگاه ظاهر شد. خارج از پنجره، سپتامبر، سال چهارم و دوره های قریب الوقوع مداری است. به ما گفته شد که کار درسی را می توان در دو نوع انجام داد: کاغذی و سخت افزاری.

به مدت 5 سال، دروس کاغذی در دانشگاه ما بر اساس اصل "قدیمی ها را بگیرید و کنار هم بگذارید" ساخته می شد. این رویکرد با روال معمولش مناسب من نبود، بنابراین بلافاصله درس سخت افزار را انتخاب کردم. به عنوان قلب این دوره، میکروکنترلر آردوینو به دلیل سهولت یادگیری آن پیشنهاد شد. پس از تعیین نوع دوره، یک سوال دیگر وجود داشت: دقیقاً چه باید کرد. از آنجایی که هیچ تجربه ای در برنامه نویسی میکروکنترلرها وجود نداشت، بلافاصله گوگل را باز کردم و شروع به مطالعه پروژه های موجود کردم. پروژه های زیادی وجود دارد، برخی از آنها بسیار ساده هستند، برخی مبتکرانه هستند (مثلاً اسکنر سه بعدی)، اما اکثریت قریب به اتفاق هیچ کاربرد عملی نداشتند. و من دقیقاً چیزی را می خواستم که بعداً در قفسه قرار نگیرد و گرد و غبار را در آنجا جمع کند. پس از نیم ساعت گشت و گذار در دنیای آردوینو، به موضوع ایستگاه های هواشناسی خانگی علاقه مند شدم و اجرای پروژه ها چندان دشوار به نظر نمی رسید (که اساساً به تازه کار رشوه می داد).

موضوع مقاله ترم اینگونه انتخاب شد و با گذشت زمان به نظر می رسید مشکلات برنامه ریزی نشده باشند.

انتخاب جزء

با بررسی پروژه های مختلف متوجه شدم که Nano یا حتی Pro Mini برای من کافی است، اما با این وجود آردوینو Uno را انتخاب کردم به این امید که دوست دارم برای آردوینو برنامه نویسی کنم و در آینده چند پروژه دیگر را اجرا کنم. من قبلاً هرگز آهن لحیم کاری در دستانم نگرفته بودم، بنابراین برای توسعه آسان تر تصمیم گرفتم Sensor Shield v4 را نیز خریداری کنم.

جزئیات بیشتر

این برد اتصال سریع سنسورها، ماژول ها، موتورهای سروو، رابط های سریال و I2C را تسهیل می کند و همچنین تمام پورت های کنترل کننده فرم فاکتور Duemilanova / Uno را نمایش می دهد (همچنین می توان آن را به سری مگا متصل کرد، اما با محدودیت ها و موارد متعاقب آن عواقب). از سپرهای دیگر در بالای خود پشتیبانی می کند.


من حسگرهای زیر را به عنوان منابع داده های هواشناسی انتخاب کردم:


من در مورد سنسورها تصمیم گرفتم. اما با داده های دریافتی از سنسورها چه باید کرد. تصمیم گرفتم آن را نمایش دهم. من یک عکس رنگی می‌خواستم، بنابراین بلافاصله راه‌حل‌های تک رنگ را کنار گذاشتم. پس از چند دقیقه جستجو، صفحه نمایش 1.8 اینچی ST7735 TFT انتخاب شد.

جزئیات بیشتر

از آنجایی که نمایشگر از یک پروتکل 4 سیمی SPI برای ارتباط استفاده می کند و دارای فریم بافر قابل آدرس دهی پیکسلی خاص خود است، می توان از آن با هر نوع میکروکنترلر استفاده کرد. صفحه نمایش 1.8 اینچی دارای پیکسل های رنگی 128x160 است. همچنین یک اسلات برای کارت حافظه microSD وجود دارد، از این رو به راحتی می توان بیت مپ های تمام رنگی را از سیستم فایل FAT16 / FAT32 کارت microSD بارگیری کرد.

مشخصات فنی:

  • صفحه نمایش مورب - 1.8 اینچ، وضوح 128x160 پیکسل، رنگ 18 بیتی (262144 رنگ)
  • کنترل‌کننده با آدرس‌دهی پیکسلی داخلی بافر حافظه ویدیویی
  • اسلات microSD داخلی - از بیش از 2 خط دیجیتال استفاده می کند
  • سازگار با ولتاژ 3.3 و 5 ولت
  • ابعاد: 34 میلی متر × 56 میلی متر × 6.5 متر


برنامه نویسی کنترلر آردوینو

بعد از اینکه در مورد اجزای ایستگاه هواشناسی تصمیم گرفتیم، برنامه نویسی کنترلر را شروع می کنیم. آردوینو IDE برای فلش آردوینو استفاده شد. همچنین از کتابخانه های Adafruit استفاده شده است.

قبل از رفتن به طرح، اجازه دهید نگاهی به عملکرد بیندازیم:

  • قرائت ها از سنسورها هر 10 ثانیه یکبار گرفته می شود و فقط آن شاخص هایی که در مقایسه با اندازه گیری قبلی تغییر کرده اند روی صفحه نمایش به روز می شوند.
  • انتقال داده ها از طریق پورت COM انجام شده است

طرح

#عبارتند از // کتابخانه برای ارتباط با دستگاه های I2C #شامل // کتابخانه هسته برای همه حسگرها #شامل // کتابخانه برای BMP180 #include // کتابخانه هسته گرافیکی #شامل // کتابخانه مخصوص سخت افزار #include // کتابخانه برای ارتباط با دستگاه‌های SPI #شامل "dht.h" // کتابخانه برای DHT #تعریف DHT22_PIN 2 // پین داده DHT22 را به دو پایه دیجیتال متصل کنید #define TFT_CS 10 // اتصال پین CS TFT به 10 پین دیجیتال #define TFT_RST 9 // اتصال پین RST TFT به 9 پین دیجیتال // می توانید این را به ریست آردوینو هم وصل کنید // در این صورت این پین #define را روی 0 قرار دهید! #define TFT_DC 8 // اتصال پین DC TFT به 8 پایه دیجیتال Adafruit_ST7735 tft = Adafruit_ST7735 (TFT_CS، TFT_DC، TFT_RST); // مقدار دهی اولیه TFT #define TFT_SCLK 13 // اتصال پین SCLK TFT به 13 پایه دیجیتال #define TFT_MOSI 11 // وصل کردن پین MOSI TFT به 11 پایه دیجیتال dht DHT. Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified (10085); // مقداردهی اولیه BMP180 int bmpFlag = 0; ساختار (uint32_t مجموع؛ uint32_t ok؛ 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); // ساختار برای وضعیت dht تنظیم void (void) (Serial.begin (9600)؛ Serial.println ("Test Meteo")؛ 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)؛ تأخیر (500)؛ // تأخیر به منظور اطمینان از اینکه TFT اولیه شده است) // آخرین شناور داده اندازه گیری شده دمای قدیمی = 0 ، ارتفاع قدیمی = 0، فشار قدیمی = 0، رطوبت قدیمی DHTH = 0، دمای قدیمیDHTT; bool wasUpdate = false; حلقه خالی (از درجه اعتبار ساقط) (اگر (Serial.available ()> 0) // داده داریم پورت سریال است (Serial.read ()؛ // خواندن بایت از پورت سریال و ارسال آخرین داده اندازه گیری شده printValue ("Pressure", OldPressure , "hPa"، false)؛ printValue ("دما"، oldTemperature، "C"، false)؛ printValue ("Altitude"، oldAltitude، "m"، false)؛ printValue ("رطوبت"، oldDHTH رطوبت، "%"، false)؛ printValue ("DHT_temperature"، oldDHTTtemperature، "C"، false); Serial.println ("END_TRANSMISSION");) sensors_event_t رویداد؛ دمای شناور، ارتفاع؛ if (bmpFlag == 0) (bmp.getEvent (& event ) ؛ // دریافت داده از BMP180 if (event.pressure) (bmp.getTemperature (& دما)؛ شناور seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA؛ ارتفاع = bmp.pressureToAltitude (فشار سطح دریا، رویداد. فشار، دما) (چاپ دیگر) "خطای حسگر"؛)) uint32_t start = micros (); int chk = DHT.read22 (DHT22_PIN)؛ // دریافت داده از DHT22 uint32_t stop = micros (); stat.total ++؛ switch (chk) // بررسی وضعیت DHT22 (مورد DHTLIB_OK: stat.ok ++; زنگ تفريح؛ مورد DHTLIB_ERROR_CHECKSUM: stat.crc_error ++; Serial.print ("خطای جمع بررسی، \ t"); زنگ تفريح؛ مورد DHTLIB_ERROR_TIMEOUT: stat.time_out ++; Serial.print ("خطای زمان اتمام، \ t"); زنگ تفريح؛ مورد DHTLIB_ERROR_CONNECT: stat.connect ++; Serial.print ("خطای اتصال، \ t"); زنگ تفريح؛ مورد DHTLIB_ERROR_ACK_L: stat.ack_l ++; Serial.print ("Ack Low error, \ t"); زنگ تفريح؛ مورد DHTLIB_ERROR_ACK_H: stat.ack_h ++; Serial.print ("Ack High error, \ t"); زنگ تفريح؛ پیش فرض: stat.unknown ++; Serial.print ("خطای ناشناخته، \ t"); زنگ تفريح؛ ) if (bmpFlag! = 0 || ! event.pressure) // به روز رسانی داده ها (tft.fillRect (0, 30, 160, 6, ST7735_BLACK)؛ tft.setCursor (0, 30)؛ tft.setTextColor (ST7735_RED)؛ printValue ("ERROR BMP INITIALIZATION"، 0 , "" true);) else (if (event.pressure! = oldPressure) (tft.fillRect (0, 30, 160, 7, ST7735_BLACK)؛ tft.setCursor (0, 30)؛ tft.setTextColor (ST7735_RED) ؛ printValue ("Pressure", event.pressure, "hPa", true); oldPressure = event.pressure; wasUpdate = true;) if (دما! = oldTemperature) (tft.fillRect (0, 38, 160, 7, ST7735_BLACK tft.setCursor (0, 38)؛ tft.setTextColor (ST7735_WHITE)؛ printValue ("دما"، دما، "C"، درست)؛ oldTemperature = دما؛ wasUpdate = true؛) if (ارتفاع! = oldAltitude) ( tft.fillRect (0, 46, 160, 7, ST7735_BLACK)؛ tft.setCursor (0, 46)؛ tft.setTextColor (ST7735_BLUE)؛ printValue ("ارتفاع"، ارتفاع، "m"، درست)؛ oldAltitude = ارتفاع. wasUpdate = true;)) if (DHT.humidity! = oldDHTHhumidity) (tft.fillRect (0, 54, 160, 7, ST7735_BLACK)؛ t ft.setCursor (0, 54); tft.setTextColor (ST7735_GREEN)؛ printValue ("رطوبت"، DHT.humidity، "%"، درست)؛ oldDHTHhumidity = DHT.humidity; wasUpdate = true; ) if (DHT.temperature! = oldDHTTtemperature) (tft.fillRect (0, 80, 160, 7, ST7735_BLACK)؛ tft.setCursor (0, 80)؛ tft.setTextColor (ST7735_YELLOW)؛ printValue ("DHT.Temperature"،"DHT_te دما، "C"، true)؛ oldDHTTtemperature = DHT.temperature؛ wasUpdate = true؛) if (wasUpdate) (Serial.println ("END_TRANSMISSION")؛) wasUpdate = false. تاخیر (10000); ) void printValue (char * عنوان، مقدار دو برابر، char * اندازه گیری، bool tftPrint) (if (tftPrint) // چاپ داده ها به TFT (tft.print (عنوان)؛ tft.print (":")؛ tft.print ( مقدار؛ tft.println (اندازه گیری)؛) سریال.چاپ (عنوان)؛ // ارسال داده ها به پورت سریال Serial.print (":"؛ Serial.print (مقدار); Serial.println (اندازه گیری)؛)

زمان مونتاژ کیس فرا رسیده است

شرط اصلی دوره یک نمونه اولیه کار به شکل قابل ارائه بود. بنابراین، مجبور شدم یک کیس بخرم و با یک پرونده، ایستگاه هواشناسی را به هر نحوی داخل کیس فرو کنم.

یک مسکن از یک فروشگاه لوازم الکترونیکی محلی خریداری شد.

قاب

(در عکس مورد کمی متفاوت است. من یک جلد شفاف دارم)



سپس با استفاده از یک فایل، سوراخ هایی برای خروجی سنسورها و تامین برق ایجاد شد. تصمیم گرفتم سنسورها را بیرون ببرم، زیرا در حین تست سیستم بدون کیس، متوجه شدم که پشت صفحه بسیار داغ می شود که بر دمای داخل کیس تأثیر می گذارد.

محفظه با سوراخ برای سنسورها و منبع تغذیه



از آنجایی که مجبور شدم پاها را به 2 سنسور لحیم کنم و مسیر را روی یکی از آنها سوزاندم، تصمیم گرفتم سرنوشت را وسوسه نکنم و سیم ها را به سنسورها لحیم نکنم (روی چیز دیگری تمرین خواهم کرد) و برای اتصال برای اینکه کم و بیش قابل اعتماد باشم، تصمیم گرفتم نوار برق را به عقب برگردانم.

سیستم قبل از "هل دادن" به داخل محفظه



از آنجایی که کیس بسیار بزرگتر از آردوینو است (کوچکتر از آن وجود نداشت)، مجبور شدم یک ساپورت بیاورم تا برد داخل کیس حرکت نکند. همچنین یک فیگور از پارالون و در آن یک مستطیل برای صفحه نمایش بریده شد تا قسمت های داخلی قاب پنهان شود. هیچ چسب فوق العاده ای در دست نبود، بنابراین مجبور شدم روی نوار دو طرفه بنشینم.

ماهی نهنگ یودا شگفت انگیز



درب را می بندیم، منبع تغذیه را وصل می کنیم و منتظر می مانیم.

ایستگاه هواشناسی تکمیل شده در ساختمان



پس از نمایش نتایج روی صفحه، یک خطای ناخوشایند را در اندازه گیری رطوبت آشکار می کنیم: DHT22 با دقت 99.90٪ را نشان می دهد (برای 1.00٪ بسیار نادر است). ما شروع به کشف مشکل می کنیم. اولین کاری که انجام می دهیم این است که به خروجی مقادیر پورت COM نگاه کنیم. حس خوبی داره پس از چندین بار شارژ، جداسازی و مونتاژ کیس، این فکر به ذهنم خطور می کند که در گوگل به دنبال پاسخ باشم. همانطور که انتظار می رفت، گوگل روسی حرف معقولی نزد. خوب. ما شروع به جستجو به زبان انگلیسی می کنیم و در یکی از انجمن ها با بچه هایی با مشکل مشابه روبرو می شویم. چهار صفحه اول بحث هیچ چیز عملی ارائه نمی دهد، اما در صفحه پنجم پاسخ سوال خود را می یابیم:
سنسورهای رطوبت به راحتی می توانند تحت تأثیر گازهای اشتباه یا قرار گرفتن طولانی مدت در معرض رطوبت بالا IIRC قرار گیرند. در برگه اطلاعات روشی وجود دارد که چگونه حسگر را "تنظیم مجدد" کنید، می توانید آن را امتحان کنید.

تنها سوال این بود که چه زمانی و چگونه توانستم به DHT22 آسیب برسانم. اما زمان گذراندن دوره فرا رسیده بود و بنابراین راه حل این مشکل را برای بعد گذاشتم.

پس گفتار

درس تحویل داده شد. ایستگاه هواشناسی برای مدت نامعلومی به تعویق افتاد تا تمام دم های دانشگاه بسته شود. با این حال، مجبور شدیم زودتر از آنچه فکر می کردم به ایستگاه هواشناسی برگردیم. این اتفاق افتاد که در اواسط نوامبر محل کارم را تغییر دادم و در تیم جدید با افرادی آشنا شدم که به پلتفرم آردوینو و مواردی از این دست علاقه داشتند. بنابراین، علاقه من به این پلت فرم، نداشتن زمان برای خنک شدن، دوباره شعله ور شد. ایستگاه هواشناسی خود را بیرون آوردم، آن را به رایانه وصل کردم و به یاد آوردم که در حال اجرای انتقال داده از آردوینو از طریق پورت COM هستم. و سپس این ایده به ذهنم خطور کرد که برنامه ای بنویسم که داده ها را از طریق پورت COM از آردوینو دریافت کند و این داده ها را به نظارت عمومی منتقل کند، اما این داستان کاملاً متفاوت است.

من همچنین می‌خواهم سنسورهای بی‌سیم داشته باشم و همچنان یک ایستگاه هواشناسی روی آردوینو پرو مینی اجرا کنم. بنابراین، من 4 عدد آردوینو پرو مینی با منبع تغذیه 3.3 ولت، 4 عدد ماژول رادیویی nRF24L01 + و چند سنسور اضافی دیگر سفارش دادم که در دفعات بعدی نیز سعی خواهم کرد در مورد آنها صحبت کنم. در ضمن، من منتظر بسته هستم، قصد دارم یک اتصال ساعت واقعی را پیاده سازی کنم تا بتوانم زمان به روز رسانی داده ها و خود داده ها را در کارت microSD ذخیره کنم، البته به شرط عدم اتصال به مشتری. از طریق پورت COM

شما می توانید کمک کنید و مقداری سرمایه برای توسعه سایت انتقال دهید



زمانی که در شهر قدم می زدم، یک فروشگاه لوازم الکترونیکی جدید را دیدم که باز شده بود. با ورود به آن، تعداد زیادی سپر برای آردوینا پیدا کردم. من یک آردوینو Uno در خانه داشتم و یک آردوینو نانو فوراً به این فکر افتادم که با فرستنده‌های سیگنال از راه دور بازی کنم. تصمیم گرفتم ارزان ترین فرستنده و گیرنده 433 مگاهرتز را بخرم:

فرستنده سیگنال.


گیرنده سیگنال

با نوشتن ساده ترین طرح انتقال داده (نمونه ای از اینجا گرفته شده است) ، مشخص شد که دستگاه های انتقال می توانند برای انتقال ساده ترین داده ها مانند دما ، رطوبت کاملاً مناسب باشند.

فرستنده دارای مشخصات زیر است:
1. مدل: MX -FS - 03V
2. شعاع عمل (بستگی به وجود اشیاء مانع دارد): 20-200 متر
3. ولتاژ کاری: 3.5 -12 ولت
4. ابعاد ماژول: 19 * 19 میلی متر
5. مدولاسیون سیگنال: AM
6. قدرت فرستنده: 10mW
7. فرکانس: 433 مگاهرتز
8. طول آنتن خارجی مورد نیاز: 25cm
9. اتصال آسان (فقط سه سیم): DATA; VCC; زمین.

ویژگی های ماژول دریافت:
1. ولتاژ کاری: DC 5V
2. جریان: 4 میلی آمپر
3. فرکانس کاری: 433.92 مگاهرتز
4. حساسیت: - 105dB
5. ابعاد ماژول: 30 * 14 * 7 میلی متر
6. آنتن خارجی مورد نیاز: 32 سانتی متر.

در وسعت اینترنت، گفته می شود که محدوده انتقال اطلاعات با سرعت 2 کیلوبایت بر ثانیه می تواند تا 150 متر برسد. من خودم چک نکردم اما در یک آپارتمان دو اتاقه همه جا قبول می کند.

سخت افزار ایستگاه هواشناسی خانگی

پس از چند آزمایش، تصمیم گرفتم یک سنسور دما، رطوبت و یک فرستنده را به آردوینو نانو وصل کنم.


سنسور دمای DS18D20 به صورت زیر به آردوینو متصل می شود:

1) GND به منهای میکروکنترلر.
2) DQ از طریق یک مقاومت کششی به زمین و به پایه D2 آردوینو
3) Vdd به + 5V.

ماژول فرستنده MX-FS - 03V با ولتاژ 5 ولت تغذیه می شود، خروجی داده (ADATA) به پایه D13 متصل می شود.

به Arduino Uno یک صفحه نمایش LCD و یک فشارسنج BMP085 متصل شد.


نمودار اتصال به arduino uno

گیرنده سیگنال به پایه D10 متصل است.

ماژول BMP085 یک سنسور دیجیتال فشار اتمسفر است. سنسور به شما امکان می دهد دما، فشار و ارتفاع را اندازه گیری کنید. رابط اتصال: I2C. ولتاژ تغذیه سنسور 1.8-3.6 V

ماژول به همان روشی که سایر دستگاه های I2C به آردوینو متصل می شود:

  • VCC - VCC (3.3V);
  • GND - GND;
  • SCL - به پین ​​آنالوگ 5.
  • SDA - به پین ​​آنالوگ 4.
  • هزینه بسیار کم
  • برق و ورودی / خروجی 3-5 ولت
  • تعیین رطوبت 20-80 درصد با دقت 5 درصد
  • تعیین درجه حرارت 0-50 درجه. با دقت 2 درصد
  • نرخ نمونه برداری بیش از 1 هرتز نیست (بیش از یک بار در هر 1 ثانیه).
  • ابعاد 15.5mm x 12mm x 5.5mm
  • فاصله 4 پین 0.1 اینچ

DHT دارای 4 پین است:

  1. Vcc (منبع تغذیه 3-5 ولت)
  2. خروجی داده - خروجی داده
  3. استفاده نشده
  4. عمومی

به D8 آردوین متصل می شود.

بخش نرم افزاری ایستگاه هواشناسی منزل

ماژول فرستنده هر 10 دقیقه دما را اندازه گیری و انتقال می دهد.

در زیر برنامه آمده است:

/ * طرح نسخه 1.0 ارسال دما هر 10 دقیقه. * / #include #include #include #define ONE_WIRE_BUS 2 // پین برای اتصال سنسور OneWire OneWire دالاس (ONE_WIRE_BUS)؛ سنسورهای دما دالاس (و oneWire)؛ آدرس دستگاه درون دماسنج؛ void setup (void) (//Serial.begin(9600); vw_set_ptt_inverted (true); // مورد نیاز برای DR3100 vw_setup (2000)؛ // تنظیم نرخ باود (bps) sensors.begin (); if (! sensors .getAddress (درون دماسنج، 0)؛ printAddress (درون دماسنج)؛ sensors.setResolution (درون دماسنج، 9)؛) void printTemperature (DeviceAddress deviceAddress) (float tempC = sensors.getTempC (DeviceAddress); //Serial.print(Temp C : ") . . ما منتظر تاخیر پایان انتقال هستیم (200)؛) حلقه خالی (باطل) (برای (int j = 0؛ j<= 6; j++) { sensors.requestTemperatures(); printTemperature(insideThermometer); delay(600000); } } //Определение адреса void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16); //Serial.print("0"); //Serial.print(deviceAddress[i], HEX); } }

دستگاه دریافت کننده داده ها را دریافت می کند، فشار و دمای اتاق را اندازه گیری می کند و به نمایشگر ارسال می کند.

#شامل #شامل ال سی دی LiquidCrystal (12، 10، 5، 4، 3، 2); #شامل سنسور dht11؛ #define DHT11PIN 8 #include #include BMP085 dps = BMP085 (); درجه حرارت طولانی = 0، فشار = 0، ارتفاع = 0. void setup () (Serial.begin (9600)؛ vw_set_ptt_inverted (true)؛ // مورد نیاز برای DR3100 vw_setup (2000)؛ // تنظیم نرخ دریافت vw_rx_start ()؛ // شروع به نظارت بر پخش lcd.begin (16، 2) Wire.begin ()؛ تاخیر (1000)؛ dps.init ()؛ //lcd.setCursor(14,0)؛ //lcd.write(byte(0))؛ //lcd.home (); ) حلقه خالی () (uint8_t buf; // بافر برای پیام uint8_t buflen = VW_MAX_MESSAGE_LEN؛ // طول بافر اگر (vw_get_message (buf, & buflen)) // اگر پیامی دریافت شد (// شروع تجزیه int i; // اگر پیام خطاب به ما نیست، اگر (buf! = "z") (بازگشت؛) char دستور = buf؛ // فرمان در شاخص 2 است خارج شوید // پارامتر عددی از شاخص 4 شروع می شود i = 4؛ int عدد = 0؛ // از آنجایی که انتقال کاراکتر به کاراکتر است، پس باید مجموعه کاراکتر را به عدد تبدیل کنید while (buf [i]! = "") (عدد * = 10؛ عدد + = buf [i] - "0"؛ i ++;) dps.getPressure (& Pressure)؛ dps.getAltitude (& Altitude)؛ dps.getTemperature (& Temperature)؛ //Serial.print(command); Serial.print (""); Serial.println (شماره); lcd.print ("T ="); lcd.setCursor (2.0); lcd.print (شماره); lcd.setCursor (5.0); lcd.print ("P ="); lcd.print (Pressure / 133.3); lcd.print ("mmH")؛ lcd.setCursor (0،1); lcd.print ("T ="); lcd.print (دما 0.1)؛ lcd.print ("H ="); lcd.print (حسگر. رطوبت); lcd.home (); // تاخیر (2000)؛ int chk = sensor.read (DHT11PIN); سوئیچ (chk) (مورد DHTLIB_OK: //Serial.println("OK")؛ شکست؛ مورد DHTLIB_ERROR_CHECKSUM: //Serial.println("خطای جمع بررسی")؛ شکست؛ مورد DHTLIB_ERROR_TIMEOUT: //Serial.println("Time out خطا ")؛ شکست؛ پیش فرض: //Serial.println("خطای ناشناخته")؛ شکست؛)))

P.S. در آینده قصد دارم موارد زیر را اضافه کنم:
- سنسور رطوبت به فرستنده، الگوریتم انتقال داده را دوباره کار کنید
- سنسوری برای اندازه گیری سرعت و جهت باد.
- نمایشگر دیگری را به دستگاه گیرنده اضافه کنید.
- گیرنده و فرستنده را به یک میکروکنترلر جداگانه منتقل کنید.

در زیر عکسی از اتفاق افتاده را پیوست می کنم:

فهرست عناصر رادیویی

تعیین نوعی از فرقه تعداد توجه داشته باشیدخرید کنیددفترچه من
بخش انتقال دهنده
برد آردوینو

آردوینو نانو 3.0

1 داخل دفترچه یادداشت
حسگر دما

DS18B20

1 داخل دفترچه یادداشت
مقاومت

220 اهم

1 داخل دفترچه یادداشت
ماژول فرستندهMX-FS-03V (433 مگاهرتز)1 داخل دفترچه یادداشت
بخش دریافت رادیو
برد آردوینو

آردوینو اونو

1 داخل دفترچه یادداشت
مقاومت تریمر 1 داخل دفترچه یادداشت
مقاومت

پروژه ایستگاه هواشناسی از کتاب وی. ما از Arduino IDE 1.8.5 در ویندوز 10 استفاده کردیم.
هنگام راه اندازی طرح با خطا مواجه شدم

در اینترنت می‌توانید کتابخانه‌هایی را برای آردوینو دانلود کنید که نام‌های مشابهی دارند، اما محتوای متفاوتی دارند. اگر از کتابخانه اشتباهی استفاده می کنید، طرح ممکن است کار نکند. ظاهراً به کتابخانه های اشتباهی برخورد کردم. این پروژه یک سنسور BMP180 برای اندازه گیری فشار اتمسفر اضافه کرد و طرح را دوباره کار کرد.

نمودار اتصال

اسکن آدرس ها

ابتدا سنسور BMP180 و نشانگر LCD1602 را به آردوینو وصل کنید. طرح اسکنر I2C را کامپایل کرده و آن را اجرا کنید تا آدرس دستگاه های موجود در گذرگاه I2C را مشخص کنید.

هر 5 ثانیه برنامه دستگاه ها را اسکن می کند و آدرس های مربوط به پورت COM را نشان می دهد. من دو دستگاه با آدرس های 0x3F و 0x77 پیدا کردم. BMP180 به طور پیش فرض دارای آدرس 0x77 است، بنابراین نشانگر LCD دارای آدرس 0x3F است.
در برخی از نمودارها، کتاب ها با مکان هایی که سیگنال های SDA و SCL به برد آردوینو وصل می شوند مخلوط شده اند. باید: SDA - به A4، SCL - به A5 باشد. اگر BMP180 دارای پنج پایه باشد، پایه VIN با +5 ولت عرضه می شود.

نمودار سیم کشی

اکنون کل مدار را مونتاژ کنید. من از یک LED RGB کاتدی معمولی که روی یک برد به همراه مقاومت های 150 اهم نصب شده بود استفاده کردم. کاتد مشترک به کنتاکت GND متصل می شود، بقیه پین ​​ها طبق طرح وصل می شوند. نیازی به تغییر در طرح نیست، زیرا روشنایی LED ها به صورت چرخه ای تغییر می کند.
نمودار اتصال یک LED RGB با یک آند مشترک را مانند کتاب نشان می دهد.
اگر هیچ کاراکتری در صفحه LCD1602 قابل مشاهده نیست، کنترل روشنایی را بچرخانید. نور پس زمینه نشانگر جریان بسیار زیادی مصرف می کند، بنابراین از منبع تغذیه با جریان حداقل 2 آمپر استفاده کنید. من از هاب USB با منبع تغذیه خارجی 2 آمپر استفاده کردم.
در این طرح، من از زنگ پیزو ZP-22 استفاده کردم. مقاومت متصل به زنگ 100 اهم است. فرکانس صدا را می توان در برنامه تغییر داد. فرکانس 1000 هرتز را انتخاب کردم. اگر با یک زنگ با فرکانس صدای ثابت مواجه شدید، می‌توانید آن را با اعمال و حذف ولتاژ، مانند یک LED معمولی، روشن و خاموش کنید. با شروع طرح، یک بوق کوتاه به صدا در می آید. شما می توانید سیگنال دهی دوره ای را در حین اجرای برنامه با حذف نظر خط // bzz (100) فعال کنید. در طرح
در پروژه، من از یک سنسور DHT11 به شکل یک ماژول با یک مقاومت 4.7 کیلو اهم استفاده کردم. مقاومت می تواند از 4.7 تا 10 کیلو اهم باشد.
پایه Vcc ماژول ساعت DS1302 را به باس +5 ولت وصل کنید. این باعث کاهش تخلیه باتری می شود، در واقع فقط زمانی کار می کند که آردوینو خاموش باشد.

برنامه (طرح)

کتابخانه bmp085 برای سرویس BMP180 استفاده شد. مقدار فشار بستگی به ارتفاع زمین دارد. برای مقدار صحیح فشار اتمسفر، باید ارتفاع را انتخاب کنید. برای انجام این کار، خط dps.init (MODE_STANDARD، 10000، true) را ویرایش کنید. قد من 100 متر (10000 سانتی متر) است. بخشی از محاسبه فشار از نمونه BMP085_test2.ino از کتابخانه bmp085 گرفته شده است.

طرح Meteo_P

#عبارتند از
#عبارتند از
#عبارتند از
#include "DHT.h"
#عبارتند از
BMP085 dps = BMP085 ();
فشار طولانی = 0، ارتفاع = 0;
زمان طولانی بدون علامت 1 = 0;

#تعریف DHTPIN 10
#define DHTTYPE 11 // 11 - DHT11, 22 - DHT22
DHT dht (DHTPIN، DHTTYPE)؛

int kCePin = 4; // RST DS1302
int kIoPin = 3; // داده DS1302
int kSclkPin = 2; // CLK DS1302
DS1302 rtc (kCePin، kIoPin، kSclkPin)؛

int REDpin = 9;
int GREENpin = 6;
int BLUEpin = 11;

ال سی دی LiquidCrystal_I2C (0x3f, 16, 2); // آدرس خود را 0x20 ... آدرس 0xff وارد کنید
طولانی memTime بدون امضا.
int bzzPin = 8;

void HumTempRead () (
float hum = dht.readHumidity ();
float temp = dht.readTemperature ();
اگر (اسنان (هوم) || سنت (دم)) (
Serial.println ("خواندن از حسگر DHT ناموفق بود!");
lcd.setCursor (0, 1);
lcd.print ("H = -% T = ---");
lcd.setCursor (11, 1);
lcd.print ((char) 223);
lcd.setCursor (12, 1);
lcd.print ("C")؛
) دیگر (
lcd.setCursor (0, 1);
lcd.print ("H =");
lcd.setCursor (2، 1);
lcd.print (Hum);
lcd.setCursor (4، 1);
lcd.print ("% T = +");
lcd.setCursor (9، 1);
lcd.print (دمای);
lcd.setCursor (11, 1);
lcd.print ((char) 223);
lcd.setCursor (12, 1);
lcd.print ("C")؛
}
}

void setup_bzz () (
pinMode (bzzPin، OUTPUT)؛
}

void bzz (int _bzzTime) (
تن (bzzPin، 1000، _bzzTime)؛ // فرکانس 1000 هرتز
}

تنظیم خالی () (
Serial.begin (9600);
Wire.begin ();
تاخیر (1000);

dps.init (MODE_STANDARD، 10000، true)؛ // 100 متر (ارتفاع از سطح دریا بر حسب سانتی متر)

dht.begin ();
setup_bzz ();
bzz (100)؛

LCD.init ();
lcd.backlight ();
lcd.home ();
// lcd.setCursor (0، 0);

rtc.halt (نادرست)؛
rtc.writeProtect (نادرست)؛

//rtc.setDOW(جمعه)؛ // روز هفته را به FRIDAY تنظیم کنید روز هفته را تنظیم کنید
//rtc.setTime(4, 58, 0); // زمان را روی 12:00:00 (قالب 24 ساعته) تنظیم کنید
//rtc.setDate(6, 8, 2010); // تاریخ را روی 6 آگوست 2010 تنظیم کنید تاریخ را تنظیم کنید (روز، ماه، سال)
}

lcd.setCursor (8, 0);
lcd.print (rtc.getTimeStr ());

if ((millis () - memTime> 2000) یا (millis ()< memTime)) { // DHT11/22 1 time each 2 seconds
HumTempRead ();
memTime = میلیس ();
}
تاخیر (100)؛

if (((millis () - time1) / 1000.0)> = 1.0) (
dps.calcTrueTemperature ();
time1 = میلی‌لیتر ();
}
dps.getPressure (& Pressure)؛
Serial.print ("Pressure (Pa):");
Serial.println (فشار);

طولانی p2;
int pi;
p2 = (فشار / 133.3224)؛ // Pa بر حسب mmHg
pi = trunc (p2)؛ // قسمت کسری عدد را کنار بگذارید

lcd.setCursor (0, 0);
lcd.print ("P =");
lcd.setCursor (2, 0);
lcd.print (pi); // خروجی اتمسفر. فشار روی LCD
lcd.setCursor (5, 0);
lcd.print ("mm");
// تاخیر (3000);
// bzz (100)؛ // اگر می‌خواهید به سیگنال‌ها گوش دهید، نظر را لغو کنید
{
برای (int value = 0; مقدار<= 255; value += 1) {
analogWrite (REDpin، مقدار)؛
analogWrite (GREENpin، 255 - مقدار)؛
analogWrite (BLUEpin, 255)؛
تاخیر (5)؛
}

برای (int value = 0; مقدار<= 255; value += 1) {
analogWrite (REDpin, 255)؛
analogWrite (GREENpin، مقدار)؛
analogWrite (BLUEpin، 255 - مقدار)؛
تاخیر (5)؛
}

برای (int value = 0; مقدار<= 255; value += 1) {
analogWrite (REDpin، 255 - مقدار)؛
analogWrite (GREENpin, 255)؛
analogWrite (BLUEpin، مقدار)؛
تاخیر (5)؛
}
}
}

در فهرست فایل، می توانید طرح و کتابخانه های مورد استفاده در پروژه را دانلود کنید.

کتابخانه های LiquidCrystal_I2C.zip، bmp085.zip، DS1302.zip و DHT.zip را از بایگانی دانلود شده به Arduino IDE وارد کنید. به منو بروید طرح اتصال کتابخانه افزودن کتابخانه .ZIP...و در پنجره، آرشیو فشرده کتابخانه را انتخاب کنید.
طرح meteo_P را آپلود کنید. آدرس LCD1602 را در طرح با مقدار بدست آمده با اسکن گذرگاه I2C جایگزین کنید. اسکچ را کامپایل و اجرا کنید.
اگر طرح کار کرد، مانیتور پورت را باز کنید و پیام‌هایی را که ظاهر می‌شوند را مشاهده کنید. ارتفاع را در عبارت dps.init تنظیم کنید (MODE_STANDARD، 10000، true)؛ برای بدست آوردن مقادیر واقعی فشار
ساعت را تنظیم کنید. لغو نظر خط //rtc.setTime(4, 58, 0); و در پرانتز زمان فعلی را مشخص کنید (ساعت، دقیقه و ثانیه با کاما از هم جدا شده اند) و طرح را دوباره در کنترلر بارگذاری کنید. پس از اتمام زمان، دوباره این خط را نظر دهید و طرح را دوباره راه اندازی کنید.
اگر روشنایی نور شب شما را آزار می دهد، می توانید با تغییر طول تاخیر در حلقه های for در انتهای طرح، آن را سفارشی کنید. با تاخیر (2)؛ چرخه 2-3 ثانیه طول می کشد، با تاخیر (5)؛ - از 4 تا 5 ثانیه، با تاخیر (30)؛ - حداکثر 15-16 ثانیه. اطلاعات نشانگر با همان فاصله به روز می شود.
هنگام استفاده از ایستگاه هواشناسی به طور مستقل، به عنوان مثال. بدون اتصال به پورت USB کامپیوتر، خطوط را با عبارت Serial ... در طرح کامنت کنید تا خروجی اطلاعات به مانیتور پورت COM غیرفعال شود.

PS. در طرح کتاب و در مثال های کتابخانه DHT، خط تعریف مشخص شده است #تعریف DHTTYPE DHT 11... طرح شروع می شود، اما پس از چند ساعت خراب می شود. ساعت متوقف می شود، صفحه نمایش تغییر نمی کند. یک پیام مبهم در مانیتور پورت با پیوند به dht ظاهر می شود.
من حروف DHT را در این خط حذف کردم، یعنی. انجام داد #define DHTTYPE 11... پس از آن، طرح به طور پایدار شروع به کار کرد.

این مطلب در تاریخ 1397/06/25 به روز شد.

منابع مورد استفاده
1. پتین وی.آ. پروژه ها با استفاده از کنترل کننده آردوینو (Electronics) ویرایش دوم، سنت پترزبورگ. BHV-Petersburg, 2015 464 p.
2. Petin V. A., Binyakovsky A. A. دایره المعارف عملی آردوینو. - M., DMK Press, 2017 .-- 152 ص.
3.http: //arduinolearning.com/code/i2c-scanner.php
4.http: //arduino.ru/forum/programmirovanie/ds1302lcd1602
5.http: //robotekhnika18.rf/how-connect-lcd-1602-k-arduino-po-i2c/
6.example BMP085_test2.ino از کتابخانه bmp085.zip
7.http: //proginfo.ru/round/
8.http: //homes-smart.ru/index.php?id=14&Itemid=149&option=com_content&view=article
9.http: //iarduino.ru/lib/datasheet%20bmp180.pdf
10.http: //it-donnet.ru/hd44780_dht11_arduino/

مقالات مرتبط برتر