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

آردوینو حسگرها را از اولین ایستگاه های هواشناسی می خواند. ایستگاه هواشناسی خانه در آردوینو و ارسال داده ها به "People's Monitoring"

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

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

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

تایمر نگهبان در مواقع اضطراری در محل قرار دارد. همانطور که تمرین نشان می دهد، 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. struct SEND_DATA_STRUCTURE( شناسه بایت؛ // شناسه دستگاه int دما؛ // فشار شناور دما؛ // رطوبت شناور فشار؛ // رطوبت شناور نقطه شبنم؛ // شبنم/نقطه یخ زدگی); پخش SEND_DATA_STRUCTURE. void setup() (// راه اندازی تایمر Watchdog wdt_disable(); delay(8000)؛ wdt_enable(WDTO_8S)؛ // راه اندازی کنسول Serial.begin(9600)؛ // راه اندازی سنسور DHT dht.begin();/ / راه اندازی ماژول 433 مگاهرتز ET.begin(details(broadcast)); vw_set_ptt_inverted(true); vw_set_tx_pin(2); vw_setup(2000)؛ // شبکه را راه اندازی کنید، اگر منتظر داده های سرور DHCP نبوده ایم، سپس // به خودمان یک آدرس اختصاص دهیم اگر (Ethernet.begin(mac) == 0) Ethernet.begin(mac, ip); // Initializing 1-Wire Wire.begin(); delay(200)؛ // Initializing 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 = log(VP/0.61078); // بازگشت موقت var (241.88 * T) / (17.558 - T); ) void send_info(bool eth) ( bool fail = true; while(fail) ( // سعی می کنیم داده ها را از حسگر رطوبت DHT بخوانیم تا زمانی که // نتیجه را بگیریم. در 90٪ موارد همه چیز خوب کار می کند، اما ما نیاز داریم 100% if((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

متن پنهان



صفحه نمایش پینوت -> کنترلر

============================= 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; struct 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(details(broadcast)); 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 .text ("%"، w/2+5، 100)؛ TFTscreen.text("C"، w/2+5، 120)؛ پخش. دما = 0؛ پخش. فشار = 0؛ پخش. رطوبت = 0 پخش .dewPoint = 0؛ TFTPrint(); ) void loop())( if(ET.receiveData())( if(broadcast.ID == 1) TFTPrint(); /* Serial.println(broadcast.Temperature) ؛ سریال. println(پخش. فشار؛ سریال.println(پخش. رطوبت؛ سریال.println(broadcast.dewPoint)؛ سریال.println(); */) ) تغییرات خالی (int size, 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؛ ) if((اندازه%2) == 0 ) اندازه ++; while(size > 0) ( TFTscreen.line(x, y, x+(size--), y); ++x, (up)?--y:++y, --size; ) /* while( اندازه > 0) ( TFTscreen.line(x, y, (بالا)?x+size-1:x, (بالا)?y:y+size-1); ++x, ++y, --size; ) */ ) int x_center(int w, int طول, int size) ( کف برگشتی ((w-length*(size*5)+size*2)/2); ) int x_alignment_right(int w, int length, int اندازه) (ceil return(w-length*(size*5)+size*2); ) void TFTPrint() (اندازه = 3; // ================ ================================================== === =============== // نمایش قرائت دما // ======================== ================================================================================ اگر (پخش. دما != Log_Temperature) ( TFTscreen.setTextSize(اندازه)؛ // بازنویسی داده های منسوخ شده String info = String(Log_Temperature); info.concat("C"); if(Log_Temperature > 0) info = "+"+info; info .toCharArray(Temperature, info.length()+1)؛ TFTscreen.stroke(0, 0, 0); TFTscreen.text(Temperature, x_center(w, info.length()+1 , size), 35); / / نمایش اطلاعات قرائت جدید = رشته (پخش شده. درجه حرارت)؛ 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); // تغییر رنگ برای انتقال بصری بیشتر از صفر ) else (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(size); / / رونویسی اطلاعات منسوخ شده = String (Log_Pressure)؛ info.toCharArray (Pressure, info.length()؛ TFTscreen.stroke(0, 0, 0)؛ TFTscreen.text(Pressure, x_alignment_right(w/2-5, info .length()، اندازه)، 80)؛ // خروجی اطلاعات قرائت جدید = String(broadcast.Pressure); info.toCharArray(Pressure, info.length()); TFTscreen.stroke(255, 255, 255)؛ TFTscreen .text(Pressure, x_alignment_right (w/ 2-5, info.length(, size), 80); changes(10, 106, 85, (broadcast.Pressure > Log_Pressure)?true:false); ) else (تغییرات (10، 106، 85، درست، درست)؛ تغییرات (10، 106، 85، نادرست، درست)؛ ) // ====================== ================================================== =========== = // قرائت رطوبت خروجی // =============================== ================================================== ================== if(broadcast.Humidity != Log_Humidity) ( TFTscreen.setTextSize(size); // بازنویسی اطلاعات منسوخ شده = String(Log_Humidity); info.toCharArray(رطوبت، info.length()); TFTscreen.stroke(0, 0, 0); TFTscreen.text(رطوبت، x_alignment_right(w/2-5، info.length()، اندازه)، 100); // نمایش اطلاعات قرائت جدید = String(broadcast.Humidity); info.toCharArray(رطوبت، info.length()); TFTscreen.stroke(255, 255, 255); TFTscreen.text(رطوبت، x_alignment_right(w/2-5، info.length()، اندازه)، 100); تغییرات(10, 106, 105, (پخش. رطوبت > ورود_رطوبت)؟درست:نادرست); ) else ( تغییرات (10، 106، 105، درست، درست)؛ تغییرات (10، 106، 105، نادرست، درست)؛ ) // ================== ================================================== === ==============// خروجی خوانش نقطه شبنم/نقطه یخبندان // ===================== ================================================== if(broadcast.dewPoint ! = Log_dewPoint) ( TFTscreen.setTextSize(اندازه)؛ // بازنویسی اطلاعات منسوخ شده = String(Log_dewPoint)؛ info.toCharArray(dewPoint, info.length()؛ TFTscreen.stroke(0, 0, 0)؛ TFTscreen.text (dewPoint، x_alignment_right(w/2-5، info.length()، اندازه)، 120؛ // خروجی اطلاعات قرائت جدید = String(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، درست، درست)؛ تغییرات (10، 106، 125، نادرست، درست)؛ ) // مقادیر موجود در گزارش ها را برای موارد بعدی به روز کنید مقایسه خوانش Log_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 درجه سانتیگراد در نوسان است، تصمیم گرفتم یک ایستگاه هواشناسی خانگی بسازم.

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

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

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

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

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

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

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







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

تجهیزاتی که نیاز خواهید داشت:

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

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







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

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

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

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

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

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

DHT11

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

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, LiquidCrystal_DHTYPE,LiquidCrystal_DHTYPE,LiquidCrystal_d Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin؛ float t1,t2;

void setup() ( 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("deg C");t1=T; delay(3000);

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

status = press.getPressure(P,T); if (وضعیت != 0) (lcd.clear()؛ lcd.setCursor(0,0)؛ lcd.print("absltpress:")؛ lcd.setCursor(0,1)؛ lcd.print(P,2 lcd.print(" mb "); delay(3000);

p0 = press.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); // رفتن به شروع خط 2nd lcd.print("DHT Tempurature:"); lcd.setCursor(0,1); lcd.print(t); lcd.print(" deg C"); تاخیر (3000); lcd.clear(); lcd.setCursor(0,0); // رفتن به شروع خط 2nd lcd.print("Mean Tempurature:"); lcd.setCursor(0,1); lcd.print((t1+t2)/2); lcd.print(" deg C"); تاخیر (3000); )

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

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

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


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

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

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

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


نمودار اتصال به آردوینو Uno

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

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

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

  • VCC - VCC (3.3 V);
  • GND - GND;
  • SCL - به پین ​​آنالوگ 5؛
  • SDA - به پین ​​آنالوگ 4.
  • هزینه بسیار کم
  • برق و I/O 3-5 ولت
  • تعیین رطوبت 80-20 درصد با دقت 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 دقیقه دما را اندازه گیری و انتقال می دهد.

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

/* Sketch version 1.0 دما را هر 10 دقیقه ارسال کنید. */ #include #include #include #define ONE_WIRE_BUS 2 //Pin for connecting the Dallas OneWire sensor oneWire(ONE_WIRE_BUS); سنسورهای دمای دالاس (&oneWire)؛ آدرس دستگاه درون دماسنج. void setup(void) (//Serial.begin(9600); vw_set_ptt_inverted(true)؛ // لازم برای DR3100 vw_setup(2000)؛ // تنظیم نرخ باود (bit/s) sensors.begin(); if (! sensors.getAddress(insideThermometer, 0))؛ printAddress(insideThermometer); sensors.setResolution(insideThermometer, 9)؛ ) void printTemperature(DeviceAddress deviceAddress) (float tempC = sensors.getTempC(deviceAddress); C : ")؛ //Serial.println(tempC)؛ //تشکیل داده برای ارسال عدد int = tempC؛ نماد کاراکتر = "c"؛ //نماد سرویس برای تعیین اینکه این یک حسگر است String strMsg = "z" strMsg += نماد؛ strMsg += " "؛ strMsg += شماره؛ strMsg += " "؛ char msg; strMsg.toCharArray(msg, 255); vw_send((uint8_t *)msg, strlen(msg))؛ vx_wait_ (); / / صبر کنید تا انتقال کامل شود تاخیر(200)؛ ) void loop(void) ( for (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); } }

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

#include #include LiquidCrystal lcd(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(); delay(1000); dps.init(); //lcd.setCursor(14,0); //lcd.write(byte(0)); //lcd.home();) void loop() (uint8_t buf; // بافر برای پیام uint8_t buflen = VW_MAX_MESSAGE_LEN؛ // طول بافر if (vw_get_message(buf, &buflen)) // اگر پیام دریافت شد ( // شروع تجزیه int i; // اگر پیام خطاب به ما نیست، اگر (buf != "z") (return; ) char command = 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(sensor.humidity); 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 دارای پنج پایه باشد، 5+ ولت به پایه VIN عرضه می شود.

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

حالا مدار را به طور کامل جمع کنید. من از یک 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 گرفته شده است.

Sketch meteo_P

#عبارتند از
#عبارتند از
#عبارتند از
#شامل "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(temp);
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 هرتز
}

void setup() (
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(false);
rtc.writeProtect(false);

//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 = millis();
}
تاخیر (100);

if (((millis() - time1) / 1000.0) >= 1.0) (
dps.calcTrueTemperature();
time1 = millis();
}
dps.getPressure(&Pressure);
Serial.print("Presure(Pa):");
Serial.println(Pressure);

طولانی 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 ; value<= 255; value += 1) {
analogWrite (REDpin، مقدار)؛
analogWrite (GREENpin، 255 - مقدار)؛
analogWrite(BLUEpin, 255);
تاخیر (5);
}

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

برای (int value = 0; value<= 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. پس از این، طرح به طور پایدار شروع به کار کرد.

مقاله به روز شده در 25 ژوئن 2018

منابع مورد استفاده
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://robotehnika18.rf/how-to-connect-lcd-1602-to-arduino-via-i2c/
6. مثال 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/

من بخش های جداگانه سیستم را در Arduino UNO تست کردم. آن ها ماژول ESP را به uno وصل کردم و مطالعه کردم و قطع کردم سپس nRF24 و غیره را وصل کردم. برای اجرای نهایی سنسور پنجره، Arduino Pro Mini را به عنوان نزدیکترین مینیاتور به Uno انتخاب کردم.



از نظر مصرف انرژی، آردوینو پرو مینی نیز خوب به نظر می رسد:

  • هیچ مبدل USB-TTL وجود ندارد، که خود بسیار "می خورد"،
  • LED از طریق یک مقاومت 10k متصل می شود.

برای حفظ انرژی پیشرفته برنامه ریزی شده بود:

  • LED - نشانگر قدرت آردوینو پرو مینی را بردارید (پشیمان شدم، به برد آسیبی ندیدم)
  • یا از یک مجموعه "لخت" در ریزپردازنده Atmel ATmega328 استفاده کنید (استفاده نشد)
  • از کتابخانه کم مصرف یا JeeLib استفاده کنید.

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


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


شما می توانید آردوینو مگا را با قیمت حدود 8 دلار خریداری کنید.

توان و مصرف انرژی

حالا در مورد مصرف برق و انرژی.


Arduino Pro Mini در دو نوع ارائه می شود:

  • برای ولتاژ تغذیه 5 ولت و فرکانس 16 مگاهرتز
  • برای ولتاژ تغذیه 3.3 ولت و فرکانس 8 مگاهرتز.

از آنجایی که ماژول رادیویی nRF24L01+ برای منبع تغذیه به 3.3 ولت نیاز دارد و سرعت در اینجا مهم نیست، پس آردوینو پرو مینی با 8 مگاهرتز و 3.3 ولت بخرید.


در این مورد، محدوده ولتاژ تغذیه آردوینو پرو مینی:

  • 3.35-12 ولت برای مدل 3.3 ولت
  • 5-12 ولت برای مدل 5 ولت.

من قبلا یک آردوینو پرو مینی در 5 ولت داشتم، به همین دلیل از آن استفاده کردم. شما می توانید Arduino Pro Mini را با قیمت حدود 4 دلار خریداری کنید.


واحد مرکزی از یک شبکه 220 ولتی از طریق یک منبع تغذیه کوچک با خروجی 12 ولت، 450 میلی آمپر، 5 وات تغذیه می شود. مانند این برای 5 دلار. همچنین یک پایه 5 ولت جداگانه نیز وجود دارد.



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


بنابراین، آردوینو پرو مینی و ماژول رادیویی nRF24 با یک دسته از 4 باتری Ni-Mh تغذیه خواهند شد.


و بخاطر داشته باش حداکثر ظرفیت یک باتری مدرنتقریباً 2500-2700 میلی‌آمپر ساعت، هر چیزی بیشتر یا ترفندهای بازاریابی (Ansmann 2850) یا فریب (UltraFire 3500) است.


من به چند دلیل از باتری های Li-Ion استفاده نمی کنم:

  • بسیار گران قیمت
  • هنگامی که دمای محیط به زیر 0 درجه سانتیگراد کاهش می یابد، قدرت باتری لیتیوم یونی به 40-50٪ کاهش می یابد.
  • آنهایی که ارزان هستند بدون محافظ تولید می شوند و ناامن هستند (در طول اتصال کوتاه یا تخلیه می توانند منفجر شوند و بسوزند، یک سری ویدیو را در YouTube ببینید)
  • آنها پیر می شوند، حتی اگر از آنها استفاده نشود (با این حال، این را می توان در مورد همه عناصر شیمیایی گفت)، پس از 2 سال باتری Li-Ion حدود 20٪ از ظرفیت خود را از دست می دهد.

برای نمونه اولیه، می توان با باتری های Ni-MH AA یا AAA با کیفیت بالا کنار آمد. علاوه بر این، ما نیازی به جریان های بزرگ نداریم. تنها نقطه ضعف باتری های Ni-MH، زمان شارژ طولانی آنها است.

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

بیایید خلاصه کنیم. در اینجا یک نمودار کلی از نحوه کار همه آن وجود دارد.



ادامه دارد.

برچسب ها: اضافه کردن برچسب

بهترین مقالات در این زمینه