Arduino-da uy ob-havo stantsiyasi va ma'lumotlarni "Xalq monitoringi" ga yuborish. Arduino Nano-dagi uy qurilishi ob-havo stantsiyasi Ishni yig'ish vaqti keldi

O'z qo'llaringiz bilan ob-havo stantsiyasi.

Kechqurun edi, yangi yildan keyin qiladigan hech narsa yo'q edi. Odatdagidek, qishki Yangi yil bayramlarida men ham boshimni va qo'limni foydali va ijodiy narsa bilan band qilmoqchiman. Ushbu Yangi yil bayramlarida men o'z qo'llarim bilan ob-havo stantsiyasini yasashga qaror qildim. Oldindan tayyorgarlik ko'rishni boshladim, yangi yil oldidan barcha komponentlarni sotib oldim va yig'dim va bayramlarda asosiy dasturlashni amalga oshirdim.

(Kesim ostida ko'plab fotosuratlar!)

Birinchidan, men komponentlarni ko'rib chiqaman, havolalar bermayman, chunki eBay-dagi tovarlar (mening hisobimdagi) arxivga o'tgan. Men eBay-da bemalol ko'plab komponentlarni sotib oldim. Kim oshdi savdosini birinchi marta sinab ko'rdim, har doim "hozir sotib ol" ni sotib olardim. Nima deyishim mumkin, agar siz sotib olishga shoshilmasangiz, unda ba'zi komponentlarni arzonroq sotib olish mumkin (ba'zida farq ikki barobar).

Bosim sensori BMP085
Bu asosiy sensor. Uni eBay-da ko'rganimda, men uy ob-havo stantsiyasini qurmoqchi ekanligimni angladim.
Sensor oddiy konvertda keldi, ichiga ozgina pufakchali o'ram qo'yilgan.

Konvert ichida sotuvchining tashrif qog'ozi va sensori antistatik paketga o'ralgan va boshqa qatlamli pufakchaga o'ralgan edi.

Parvoz paytida namlik sensorga tahdid solmasligi uchun antistatik sumka muhrlangan

Sensorni olamiz. Bir tomondan, aloqa chizig'i lehimlangan, ular egilmasligi uchun ko'pikka kiritilgan. Boshqa tomonda sensorning o'zi va kontaktlarning belgisi mavjud.




Har bir narsa yaxshi bo'lar edi, lekin kontaktlarning belgisi oyna tasvirida qo'llaniladi.
Sensor I2C shinasi orqali ulanadi va 3,3 V quvvatga ega. Ya'ni normal ishlash uchun 4 ta sim kerak (+, -, SDA, SCL)
Sensorni ikki usulda so'roq qilishingiz mumkin: kutubxona orqali yoki to'g'ridan-to'g'ri eskizdagi funktsiyalardan foydalanish.
Dastur misoli:

#o'z ichiga oladi

#BMP085_ADDRESS 0x77 ni aniqlang // BMP085 ning I2C manzilini

Const unsigned char OSS = 0; // Haddan tashqari namuna olish sozlamalari

// Kalibrlash qiymatlari
int ac1;
intac2;
intac3;
unsigned int ac4;
unsigned int ac5;
unsigned int ac6;
int b1;
intb2;
intmb;
int mc;
intmd;

qisqa harorat;
uzoq bosim;

O'rnatishni bekor qilish()
{
Serial.begin(9600);
Wire.begin();
bmp085Kalibrlash();
}

Void loop()
{
harorat = bmp085GetTemperature(bmp085ReadUT());
bosim = bmp085GetPressure(bmp085ReadUP());
Serial.print("harorat:");
Serial.print(harorat/10,0, DEC);
Serial.println("C");
Serial.print("Bosim: ");
Serial.print(bosim/133.322, DEC);
Serial.println("mm Hg");
Serial.println();
kechikish (1000);
}

bekor bmp085Calibration()
{
ac1 = bmp085ReadInt(0xAA);
ac2 = bmp085ReadInt(0xAC);
ac3 = bmp085ReadInt(0xAE);
ac4 = bmp085ReadInt(0xB0);
ac5 = bmp085ReadInt(0xB2);
ac6 = bmp085ReadInt(0xB4);
b1 = bmp085ReadInt(0xB6);
b2 = bmp085ReadInt(0xB8);
mb = bmp085ReadInt(0xBA);
mc = bmp085ReadInt (0xBC);
md = bmp085ReadInt(0xBE);
}

Qisqa bmp085GetTemperature (imzosiz int ut)
{
uzun x1, x2;
x1 = (((uzun)ut - (uzun)ac6)*(uzun)ac5) >> 15;
x2 = ((uzun) mc<< 11)/(x1 + md);
b5 = x1 + x2;

Qaytish ((b5 + 8)>>4);
}

Uzoq bmp085GetPressure (uzoq vaqtdan beri imzolanmagan)
{
uzun x1, x2, x3, b3, b6, p;
imzosiz uzun b4, b7;
b6 = b5 - 4000;
// B3 ni hisoblang
x1 = (b2 * (b6 * b6)>>12)>>11;
x2 = (ac2 * b6)>>11;
x3 = x1 + x2;
b3 = (((((uzun)ac1)*4 + x3)<>2;
// B4 ni hisoblang
x1 = (ac3 * b6)>>13;
x2 = (b1 * ((b6 * b6)>>12))>>16;
x3 = ((x1 + x2) + 2)>>2;
b4 = (ac4 * (imzosiz uzun)(x3 + 32768))>>15;
b7 = ((imzosiz uzun)(yuqoriga - b3) * (50000>>OSS));
agar (b7< 0x80000000)
p = (b7<<1)/b4;
boshqa
p = (b7/b4)<<1;
x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>>16;
x2 = (-7357 * p)>>16;
p += (x1 + x2 + 3791)>>4;
qaytish p;
}

// "manzil" da BMP085 dan 1 baytni o'qing
char bmp085Read (imzosiz belgi manzili)
{
imzolanmagan belgilar ma'lumotlari;

tel.write(manzil);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 1);
while(!Wire.available())
;
qaytish Wire.read();
}

Int bmp085ReadInt (imzosiz belgilar manzili)
{
imzosiz belgilar msb, lsb;
Wire.beginTransmission(BMP085_ADDRESS);
tel.write(manzil);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 2);
while(Wire.available()<2)
;
msb = Wire.read();
lsb = Wire.read();
qaytish (int) msb<<8 | lsb;
}

// Kompensatsiyalanmagan harorat qiymatini o'qing
unsigned int bmp085ReadUT()
{
imzosiz int ut;
// 0xF4 registriga 0x2E yozing
// Bu haroratni o'qishni talab qiladi
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x2E);
Wire.endTransmission();
// Kamida 4,5 ms kuting
kechikish (5);
// 0xF6 va 0xF7 registrlaridan ikki baytni o'qing
ut = bmp085ReadInt(0xF6);
utni qaytarish;
}

// Kompensatsiyalanmagan bosim qiymatini o'qing
imzosiz uzun bmp085ReadUP()
{
imzosiz belgilar msb, lsb, xlsb;
unsigned long up = 0;
// 0x34+ yozing (OSS<<6) into register 0xF4
// Haddan tashqari namuna olish sozlamalari bilan bosim ko'rsatkichini so'rash
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write (0x34 + (OSS<<6));
Wire.endTransmission();
// Konvertatsiyani kuting, kechikish vaqti OSS ga bog'liq
kechikish (2 + (3<// 0xF6 (MSB), 0xF7 (LSB) va 0xF8 (XLSB) registrlarini o'qish
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF6);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 3);
// Ma'lumotlar mavjud bo'lishini kuting
while(Wire.available()< 3)
;
msb = Wire.read();
lsb = Wire.read();
xlsb = Wire.read();
yuqoriga = (((imzosiz uzun) msb<< 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
qaytish;
}


Bundan tashqari, sensorda bosimni qoplash uchun o'z termal sensori va altimetr mavjud.

Arduino Nano v3.0
Bu butun ob-havo stantsiyasining yuragi. Oddiy qilib aytganda, boshqaruvchi miniatyura o'lchamida.
Sotib oldi
Men nazoratchi haqida batafsil gapirmayman, chunki bu mendan oldin qilingan:


Lightake o'rnatilgan paket oldindan tayyorlangan, kontroller USB kabeli va muhrlangan antistatik sumkada Arduino bilan paketlangan.

O'lchamini hisoblash uchun Arduino yoniga 1 rubl nominalli tanga qo'ying.

Tekshirish paneli yaqin



USB kabeli yaxshi, ferrit halqali. USB kabel orqali Arduino tomonidan quvvatlanadi. Rivojlanish muhitini yuklab olish mumkin (yuklab olish sahifasi). Til "C"ga o'xshaydi, uni o'zlashtirishda hech qanday muammo yo'q edi, chunki men ishda juda ko'p dasturlashdim.

LCD displey
Axlat qutilarida ishlayotganda men mos keluvchi LCD 1602 ekranini topdim. Men ulanish bilan shug'ullanishim kerak edi, chunki men buning uchun ma'lumotlar jadvalini topa olmadim. Natijada LCD daromad oldi.

Ammo qisqa operatsiyadan so'ng, men bu ekran men uchun etarli emasligini va men ko'proq ma'lumotlarni ko'rsata olmasligimni payqadim, chunki uning har birida 16 belgidan iborat atigi 2 qator bor. Avvaliga bu parametrlar etarli bo'lib tuyuladi, lekin dasturlashni boshlaganingizda, siz maksimal 3-4 parametrni siqish mumkinligini tushunasiz. Va agar siz menyu yaratsangiz (men ushbu ekranda menyu yaratish haqida o'ylardim), u holda parametrlar uchun 1-2 bo'sh joy qoladi.
Natijada men boshqa ekranni qidira boshladim. Avvaliga Nokia 3310 dan grafik ekranga qaradim va hatto uni sotib olish uchun eBay auktsionida qatnashdim, lekin u ish bermadi (budan juda xursandman), shuning uchun men bu ekrandan voz kechishga majbur bo'ldim. Endi men bu mening maqsadlarim uchun juda kichik ekanligini tushunaman, chunki solishtirish uchun biror narsa bor.
Arduino-da qalqonlarni ko'rib chiqayotib, tasodifan ST7920 kontrolleridagi 12864 grafik ekranga duch keldim. Ushbu ekran mening ehtiyojlarim uchun to'g'ri o'lcham va yaxshi piksellar soniga ega (128x64). Ya'ni, odatda o'qiladigan shriftda 20 belgidan iborat 6-7 qatorni xavfsiz joylashtirishingiz mumkin. Ekran grafik bo'lgani uchun, turli shriftlardagi matndan tashqari, grafikalar ham joylashtirilishi mumkin. Qisqasi, bu menga kerak bo'lgan narsa edi, bu ekranda hamma narsa bor edi, shuning uchun men bunga chiday olmadim va buyurtma berdim.
Posilka tezda yetib keldi va standart tarzda qadoqlandi: pufakchali o‘ram, ichida yana bir qatlamli pufakchali o‘ram va antistatik sumkada ekran bor edi:






O'lchamini baholash uchun LCD yoniga 1 rubl nominalli tanga qo'ying.




Ekranni Arduino-ga tezda ulash uchun men LCD pinlariga kontakt chizig'ini lehimladim. LCD seriyali avtobus va parallel orqali ulanishi mumkin. Men birinchi variantni tanladim, chunki bepul Arduino kontaktlari juda kam.
Ulanish (internetdan olingan):

- 1-pin (GND) umumiy avtobusga ulanadi
- Pin 2 (VCC) +5V quvvat avtobusiga ulangan va joriy iste'mol nisbatan kichik va displey o'rnatilgan Arduino regulyatoridan quvvatlanishi mumkin.
- 4, 5 va 6-pinlar Arduino raqamli chiqishlariga ulangan bo'lib, SPI seriyali interfeysini tashkil qiladi:
pin 4 - (RS) - CS chizig'iga mos keladi (masalan, 7)
pin 5 - (RW) - MOSI liniyasiga mos keladi (masalan, 8)
pin 6 - (E) - SCK chizig'iga mos keladi (masalan, 3)
Arduino pin raqamlari har qanday bo'lishi mumkin, asosiysi displeyni ishga tushirishda ularni keyinchalik dastur matnida to'g'ri ko'rsatishni unutmang.
- Pin 15 (PSB) umumiy avtobusga ulangan.
- 19 (A) va 20 (K) pinlari orqa yorug'lik quvvat manbai (mos ravishda +5V va GND). Orqa yorug'likning yorqinligini sozlash uchun siz quvvat relslari va GND o'rtasida ulangan 10 kŌ o'zgaruvchan rezistordan foydalanishingiz mumkin. Uning dvigatelidagi kuchlanish displeyning 19-piniga qo'llaniladi.
Ushbu ko'rsatmaga ko'ra, men orqa yorug'likdan tashqari hamma narsani uladim. Men Arduino PWM-ni orqa yorug'lik kuchi sifatida ishlatganman.
LCD-ni Arduino-ga dasturiy ravishda ulash uchun u8glib kutubxonasi ishlatiladi. Yuklab olishingiz mumkin. Yuklab olish bilan bog'liq muammolar mavjud bo'lsa, men kutubxonani narod.ru saytiga yuklashim mumkin.
Kutubxonaning o'zi murakkab emas va matnni turli shriftlarda ko'rsatish, chiziq chizish, eng oddiy geometrik shakllarni (to'rtburchak, doira) chizish, maxsus tarzda tayyorlangan rasmlaringizni namoyish qilish imkonini beradi. Aslida, ushbu vosita ko'pchilik vazifalar uchun etarli.
Mana oddiy dasturning natijasi:

Dasturning o'zi:

#o'z ichiga "U8glib.h"

U8GLIB_ST7920_128X64 u8g(3, 9, 8, U8G_PIN_YO'Q); // SPI E=3, RW=9, RS=8

// Bo'sh xotirani aniqlash uchun pastki dastur
int freeRam()(
extern int __heap_start, *__brkval;
intv;
qaytish (int) &v - (__brkval == 0? (int) &__heap_start: (int) __brkval);
}

O'rnatishni bekor qilish (bekor) (
u8g.setFont(u8g_font_6x10); // shrift
u8g.setRot180(); // Ekranni aylantiring
analogWrite(6, 115); // Ekran yorqinligini o'rnating (orqa yorug'lik anodini 6 pinga)
}

Void halqa (bo'sh) (
u8g.firstPage();
qil(

u8g.setPrintPos(1, 12); // pozitsiya
u8g.print("Salom!!!"); // matn chiqishi
u8g.drawBox(0,22,128,9); // To'rtburchakni oq rang bilan to'ldiring
u8g.setColorIndex(0); // oq siyoh, qora fon
u8g.setPrintPos(1, 30); // pozitsiya
u8g.print("So'z..."); // matn chiqishi

U8g.setColorIndex(1); // oq siyoh, qora fon
u8g.setPrintPos(1, 50); // pozitsiya
u8g.print("Boshlagandan keyin ="); // matn chiqishi
u8g.setPrintPos(85, 50); // pozitsiya
u8g.print(millis() / 1000); // ishga tushirilgandan keyingi soniyalar soni
u8g.setPrintPos(1, 64); // pozitsiya
u8g.print(freeRam()); // qancha xotira sarflanishini chiqarish
) while(u8g.nextPage());

kechikish (200);
}

Haqiqiy vaqt DS1307
Mening ob-havo stantsiyam uchun yana bir komponent. Bu qalqon real vaqt soatiga ega. Men ularni eBay-da buyurtma qildim. Sotuvchi real bo'lmagan katta qutidagi soat ro'molini yubordi


Quti ichida reklama yozilgan ikkita A4 varag'i va sellofanga o'ralgan soat ro'molchasi bor edi.


Shuni ta'kidlashni istardimki, to'lov 2 rubldan oshmaydi. tanga, quti esa 13x15x5 sm oʻlchamda edi.
Kengash antistatik sumkaga solingan

Sholni yaqindan



Men ushbu modul bilan shug'ullanishim kerak edi. Birinchidan, ulanishda qiyinchiliklar mavjud edi. Va ikkinchidan, bu taxtada kvarts yo'q. Agar men modulga ko'p vaqt sarflashimni bilganimda, ehtimol uni o'zim yig'gan bo'lardim, chunki tarmoq sxemalarga to'la. Eng oddiy sxema 4-5 ta komponentdan iborat.
Ulanish haqida. Men kutubxonani topdim, unda I2C interfeysi odatiy Arduino analog kirishlariga (A4 va A5) emas, balki har qanday diskretlarga ulanishi mumkin. Yozilganidek qildi. Avvaliga hech narsa ish bermadi, daf bilan uzoq raqsdan so'ng soat qo'ng'iroq qildi. Xo'sh, men shunday deb o'yladim, muammolar tugadi, lekin men o'sha modulni boshqa Arduino-ga ulashga urinib ko'rganimdan so'ng, daf bilan raqs davom etdi. Men ushbu muammoning echimini izlashga ko'p vaqt sarfladim va deyarli hamma joyda noto'g'ri ulanish yoki SCL va SDA pinlarida tortishish rezistorlarining yo'qligi ko'rsatilgan. Men allaqachon taxtaga lehim temir bilan kirmoqchi edim, lekin bir forumda tasodifan SCL va SDA Arduino-ning standart I2C portlariga ulanishi kerakligi aytilgan kodga qoqilib qoldim. Standart ulanishdan so'ng hamma narsa darhol ishladi.
Endi kvarts haqida. Xitoyliklar u erda qanday kvarts qo'yishganini bilmayman, lekin bunday kvartsli soatlar kuniga 10-11 soniya ishlaydi. Bu xato oyiga 5 daqiqa, yiliga 1 soat. Sizga bunday soat kerak emas. Men yana internetga kirib, bu xatoni qanday tuzatishni izlashim kerak edi. Olingan birinchi yechim kvartsni yerga qo'yish kerakligini aytadi. Buni qildi - nol natija. Men eski anakartni va u erdan soat kvartsini echishim kerakligini boshqa joydan topdim. Bajarildi - natija. Endi soat 10-11 soniyaga emas, balki kuniga 1,5 soniyaga yuguradi. Aytaylik, u yaxshilandi, lekin idealdan uzoq. Lehimlash temir bilan skripka qilishni istamaganligi sababli, soatni dasturiy ravishda sozlash, ya'ni kuniga bir marta soatni kerakli qiymatga moslashtirishga qaror qilindi. 10 kundan keyin soat bir soniyadan oshmadi. Usul yaxshi, lekin faqat Arduino vaqt qurilmasi quvvatga ulanganda, aks holda soat batareyada ishlaydi va hali ham qochib ketadi.
Kichik test dasturi:

#o'z ichiga "Wire.h"
#DS1307_I2C_ADDRESS 0x68 ni aniqlang // SDA A4, SCL A5

Bayt decToBcd(bayt val)
{
qaytish ((val/10*16) + (val% 10));
}

Bayt bcdToDec(bayt qiymati)
{
qaytish ((val/16*10) + (val% 16));
}

SetDateDs1307 bekor qilindi (bayt soniya, // 0-59
bayt daqiqa, // 0-59
bayt soat) // 0-99
{

Wire.write(0);
Wire.write(decToBcd(ikkinchi));
Wire.write(decToBcd(daqiqa));
Wire.write(decToBcd(soat));
Wire.endTransmission();
}

getDateDs1307 (bayt * soniya,
bayt*daqiqa,
bayt*soat)
{

Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 3);

*ikkinchi = bcdToDec(Wire.read());
*daqiqa = bcdToDec(Wire.read());
*soat = bcdToDec(Wire.read());
}

O'rnatishni bekor qilish()
{
bayt soniya, daqiqa, soat;
Wire.begin();
Serial.begin(9600);

Ikkinchi = 45;
daqiqa = 5;
soat = 16;

SetDateDs1307(sekund, daqiqa, soat);
}

Void loop()
{
bayt soniya, daqiqa, soat;

GetDateDs1307(&soniya, &daqiqa, &soat);
Serial.print(soat, DEC);
ketma-ket chop etish (":");
Serial.print (daqiqa, DEC);
ketma-ket chop etish (":");
Serial.println(ikkinchi, DEC);

kechikish (1000);
}


Bu erda kutubxona ishlatilmaydi va o'qish va yozish vaqti uchun funksiyalar qisqartiriladi.

Harorat va namlik sensori DHT11
Ushbu sensor haqida ko'p gapirish mumkin emas. Agar namlik kerak bo'lmasa, men undan foydalanmasdim. Afsuski, men uni olganimda uni suratga olmadim, shuning uchun hech qanday rasm bo'lmaydi. Sensorning fotosuratlarini quyida ko'rish mumkin, men uni Arduino-ga ulaganman. Sensor ulanishi oddiy (+, raqamli chiqish, -). Odatda, sensorlar to'rtta pin bilan ishlab chiqariladi. Ushbu shakl omili bilan uchinchi kontakt hech narsaga ulanmagan.
Arduino-ga ulanish uchun kutubxonadan foydalanishingiz mumkin. Yuklab olishingiz mumkin.
LCD displey 1602 ga ma'lumot chiqishi bilan kichik sinov dasturi:

// kutubxona kodini kiriting:
#o'z ichiga oladi
#o'z ichiga oladi

// Ob'ektlarni e'lon qilish
dht11 Dht11;
LiquidCrystal lcd(12, 11, 6, 5, 4, 3);

#DHT11PIN 7 ni aniqlang
int i;

O'rnatishni bekor qilish()
{
lcd.begin(16, 2);
lcd.print("Holat:");
i=0;
}

Void loop()
{
int chk = DHT11.read(DHT11PIN);
lcd.setCursor(8, 0);
almashtirish (chk)
{
0-holat: lcd.print("OK"); break;// lcd.setCursor(11, 0); lcd.print(millis()/2000); sindirish;
holat -1: lcd.print (“Tekshirish summasi xatosi”); merr(); sindirish;
holat -2: lcd.print("Vaqt tugashi xatosi"); merr(); sindirish;
sukut bo'yicha: lcd.print ("Noma'lum xato"); merr(); sindirish;
}
kechikish (500);
lcd.setCursor(15, 0);
switch(i)
{
0-holat: lcd.print("^"); lcd.setCursor(15, 1); lcd.print(" ");break;
1-holat: lcd.print("v"); lcd.setCursor(15, 1); lcd.print(" ");break;
sukut bo'yicha: lcd.setCursor(15, 1); lcd.print("E"); sindirish;
}
i=i+1;
agar (i>1) i=0;
lcd.setCursor(0, 1);
lcd.print("H=");
lcd.setCursor(2, 1);
lcd.print((float)DHT11.namlik, 0);
lcd.setCursor(4, 1);
LCD displey ("%");
lcd.setCursor(8, 1);
lcd.print("T=");
lcd.setCursor(10, 1);
lcd.print((float)DHT11.temperature, 0);
lcd.setCursor(12, 1);
lcd.print("C");

Void mErr()
{
lcd.setCursor(2, 1);
lcd.print("**");
lcd.setCursor(10, 1);
lcd.print("**");
i=5;
}


Sensorning kamchiliklari bor - sensordan olingan ma'lumotlar faqat butun sonlarda keladi va diapazon zaifdir.

U barcha komponentlar haqida yozganga o'xshaydi. Hamma narsani bir butunga yig'ish qoladi.
Voy, deyarli unutdim! Qurilmani yig'ish uchun sizga quti kerak bo'ladi. Ish Ebayda ham buyurtma qilingan. Sotuvchi Angliyadan edi. Posilka tezda keldi, lekin men uni suratga olmadim. Tananing barcha fotosuratlari quyida keltirilgan.

Birinchidan, men stol ustidagi hamma narsani maxsus simlar yordamida yig'dim. Men test dasturini yozdim va uni kontrollerga yukladim.



Aslida, orqa yorug'likning ko'k rangi ancha yorqinroq. Minimal yorqinlikda ham (Yorqin=5) ramka ochiladi.

Hamma narsani simsiz yig'ish uchun mini-anakart yasashga qaror qilindi va ulagichlarga Arduino taxtasi va qalqonlari o'rnatildi. Bunday holda, ular tezda olib tashlanishi mumkin. Men shuningdek, LCD displeyni va ulagichlardagi boshqaruv tugmachalarini ulashga qaror qildim, faqat simlardagi harorat sensorini lehimlang.
Sharf shunday chiqdi



Oxirgi fotosuratda men oqimni hali yuvmaganman. Men hech bo'lmaganda qandaydir tayanch bo'lishi uchun ulagichlar yonidagi qalqonlar ostiga gözenekli kauchukni yopishtirdim. Garchi, aslida, kontaktlardagi ulagichlardagi qalqonlar allaqachon mukammal ushlab turilgan.

Qalqonli anakart va Arduino platasi o'rnatilgan.

Anakartga to'liq ulanish shunday ko'rinadi


Tugmalar o'rniga men non taxtasida lehimlangan uy qurilishi qalqoni ishlatardim. Tugmalar sifatida men eski sichqonlarning tugmalaridan foydalanardim.
Ko'rib turganingizdek, simlar soni kamaydi.

Kassaga joylashtirishning asosiy muammosi LCD displey uchun truba bir tekisda kesishdir. Qanchalik urinmayin, baribir hammasi yaxshi chiqmadi. Ba'zi joylarda bo'shliqlar 1 mm dan bir oz ko'proq edi. Har bir narsa toza ko'rinishi uchun men akvarium uchun qora plomba oldim va barcha yoriqlarni to'ldirdim, shu bilan birga ekranni ushbu maxsus plomba bilan biriktirdim. Plomba quriganidan so'ng, tashqaridan ortiqcha qismini kesib tashladim. Yorqin nurda plomba ko'rinadi va oddiy yorug'likda hamma narsa korpus bilan birlashadi.
LCD displey va o'rnatilgan anakart bilan korpus ichkaridan shunday ko'rinadi.

Yorqin nurda tashqi tomondan shunday ko'rinadi (barmoq izlari uchun uzr so'rayman, fotosuratlarni saralayotganimda ko'rganman).

Men tugmachalarni korpusga qanday ulashni va eng muhimi, qaysi tugmalardan foydalanishni uzoq vaqt o'yladim ...
Elektron do'konlarda menga uzun pinli tugma va bu pinga qo'yilgan maslahatlar yoqdi. Ushbu tugmalar taxtaga lehimlash uchun ishlatiladi. Har bir narsa yaxshi bo'lar edi, lekin ularning minuslari bor - bosish zarbasi juda kichik va baland.
Men tugmachalarni ikki bosqichda joylashtirishim kerak edi: birinchisi, tugmachalarni taxtaga joylashtirish, ikkinchisi bu taxtani boshqa taxtaga o'rnatish edi. Va keyin bularning barchasini yo'riqnomalarda tanaga qo'ying.

Tugmali sharf shunday ko'rinadi:



Kengash shunday ko'rinadi:


Bu erda siz tugmalari bo'lgan taxta o'rnatilgan qo'llanmalarni ko'rishingiz mumkin. Men taxtani mustahkamlash uchun ba'zi elementlarni lehimladim.

Endi biz hamma narsani tanaga joylashtiramiz
Ulanish tugmalarisiz:


Tugma ulanishi bilan:

Qutini yoping va uni yoqing. Har bir narsa yaxshi ishlaydi, tugmalar kerakli tarzda ishlaydi.

Oxirida men turli xil rejimlarda qurilmaning qisqa videosini joylashtiraman:
http://www.youtube.com/watch?v=KsiVaUWkXNA&feature=youtu.be
Bu yerda videoni ko'rmaydiganlar uchun bu havola

Ko'rib chiqishni tugatish vaqti keldi.
Men dastur haqida bir oz yozaman, keyin esa qisqacha xulosalar. Men dasturni yozganimda, 30720 bayt chegarasiga juda tez tushaman deb o'ylamagan edim.


Men kodni optimallashtirishim kerak edi. Ko'pgina kod qismlarini pastki dasturlarga ko'chirildi. Kompilyatsiya qilingan shakldagi switch ... case bayonoti bir nechta bo'lsa ... ko'ra ko'proq joy egallaydi deb hech o'ylamagan bo'lardim. O'zgaruvchilarning to'g'ri e'lon qilinishi ham joyni tejaydi. Agar siz massivni uzun deb e'lon qilsangiz, garchi bayt bilan ishlash juda mumkin bo'lsa-da, xotira hajmi massiv hajmiga qarab 500 baytga etadi. Dastur yozayotganda, siz bu haqda o'ylamaysiz va faqat keyinroq, dasturni tahlil qilganingizda, siz ba'zi narsalarni noto'g'ri qilganingizni tushunasiz va kodni optimallashtirishni boshlaysiz. Dastur hajmi bilan bog'liq muammolar hal qilingandan so'ng, men RAMning cheklanishiga duch keldim. Bu dastur yuklangandan keyin osib qo'yila boshlaganida ifodalangan. Men bepul RAMni hisoblash uchun pastki dasturni kiritishim kerak edi. Natijada, men ob-havoni bashorat qilishning bitta algoritmidan voz kechishga majbur bo'ldim, chunki u ekranda piktogrammalarni ko'rsatishi kerak. Algoritmning o'zi ishlaydi, lekin piktogrammalarning chiqishi zahiraga olinishi kerak edi. Menda kodni optimallashtirish bo'yicha hali ham fikrlarim bor, lekin yaqin kelajakda men ishlashni baholash va barcha xatolarni aniqlash uchun qurilmani avvalgidek ishlayveraman.

Endi ba'zi xulosalar
Minuslar
1) Narx. Bu minusning bahonasi shundaki, sevimli mashg'ulot hech qachon arzon bo'lmaydi.

pros
1) Qurilmaning ajoyib funksionalligi
2) Funktsiyani kengaytirish faqat foydalanilgan kontroller va sizning xohishingiz bilan cheklangan
3) Tafakkurdan estetik zavq va shunga qaramay, men ushbu qurilmani yig'ib, tugatganimdan ma'naviy qoniqish.

Men +86 sotib olishni rejalashtirmoqdaman Sevimlilarga qo'shing Ko'rib chiqish yoqdi +137 +304

Ushbu maqolada biz ob-havo ma'lumotlarini taniqli "xalq monitoringi" xizmatiga uzatadigan to'liq ob-havo stantsiyasini qanday yig'ish haqida gaplashamiz.

Bizning ob-havo stantsiyamiz ikkita qurilmadan iborat bo'ladi: ob-havo ko'rsatkichlarini o'lchaydigan ixcham avtonom qurilma va bu ko'rsatkichlarni qabul qilib, ularni "xalq monitoringi" ga jo'natadigan takrorlash moslamasi. Qurilmalar simsiz aloqa kanali orqali 433 MGts chastotada muloqot qiladi. Avtonom qism uchta AA batareyasi bilan quvvatlanadi va 20 daqiqalik sensorli so'rov muddati bilan bitta batareyalar to'plamida bir yilgacha ishlay oladi.

Ushbu dizayn ko'chadan simlarni yotqizish uchun devorlarni burg'ulamaslikka imkon beradi, bu erda o'lchovlarni amalga oshirish kerak bo'ladi, bu o'lchovlar natijalarini qo'llash kerak bo'lgan xonaga.

Bu nima talab qiladi?

Mustaqil transmitter qilish uchun bizga kerak:

    x3 AA AA batareya ushlagichi

Repetitor qilish uchun bizga kerak:

Jarayonlarni ko'rsatish uchun ikkita LEDni o'rnatish ham qulay:

Avtonom qismning batareya zaryadsizlanishini ovozli ko'rsatish uchun piezo tweeterdan foydalanish qulay:

Uni qanday yig'ish kerak?

Mustaqil qismni yig'ish

Repeater yig'ilishi

Bu minimal funktsional takrorlagichni yig'ishni yakunlaydi. Agar siz LED indikatori va ovozli signalni o'rnatmoqchi bo'lsangiz, quyidagi amallarni bajaring.


Manba kodi

Oflayn qism kodi

meteo_sensor.ino #include #o'z ichiga oladi #o'z ichiga oladi #o'z ichiga oladi // Yubormalar orasidagi vaqt tugashi (65535 dan oshmasligi kerak) 60000 TIMEOUT ni #aniqlang // Paketni yuborishga urinishlar soni#URIShLARNI aniqlang 3 // Transmitter ma'lumot pin#RF_PIN-kodni aniqlang 5 // Harorat va namlik sensori pinlari#GND1_PIN 10 ni aniqlang #VCC1_PIN 11 ni aniqlang #GND2_PIN 7 ni aniqlang #VCC2_PIN 8 ni aniqlang #DATA_PINni 12 ni aniqlang #CLK_PINni 9 ni aniqlang AmperkaLine rf(RF_PIN) ; SHT1x sht1x(CLK_PIN, DATA_PIN) ; bekor halqa (bo'sh); // Doskani uyqu holatiga o'tkazish funksiyasi. Har TIMEOUT soniyada // loop_func chaqiriladi. TEENSY3_LP LP = TEENSY3_LP() ; uyqu_blok_t* LP_config; void sleep_mode(void) (LP_config = (sleep_block_t*) calloc (1,sizeof (sleep_block_t)); // Biz taymerda uyg'onamiz LP_config->modullar=(LPTMR_WAKE) ; // Taymer uchun kutish vaqtini o'rnating LP_config->lptmr_timeout=TIMEOUT; // Vaqt tugashi bilan tsikl funktsiyasi chaqiriladi LP_config->callback=loop; LP.Hibernate(LP_config) ; ) // Periferik faollashtirish funksiyasi void periferik_start(void ) ( // Ma'lumotlar liniyasini yoqing pinMode(RF_PIN, OUTPUT); // Harorat va namlik sensorlarining quvvatini va tuproqni yoqing pinMode (GND1_PIN, OUTPUT) ; pinMode (GND2_PIN, OUTPUT); pinMode(VCC1_PIN, OUTPUT); pinMode (VCC2_PIN, OUTPUT); digitalWrite (GND1_PIN, LOW) ; digitalWrite (GND2_PIN, LOW) ; digitalWrite (VCC1_PIN, YUQORI) ; digitalWrite (VCC2_PIN, YUQORI); // Transmissiyani bildirish uchun LEDni yoqing pinMode(LED_BUILTIN, OUTPUT) ; digitalWrite (LED_BUILTIN, YUQORI) ; // Ichki kuchlanishni mos yozuvlar kuchlanishi sifatida tanlang// manba (=1.2V) analogReference(INTERNAL) ; ) // Periferik o'chirish funktsiyasi void periferik_stop(void ) ( // Ma'lumotlar liniyasini o'chiring pinMode(RF_PIN, INPUT); // Harorat va namlik sensorini o'chiring pinMode(GND1_PIN, INPUT) ; pinMode (GND2_PIN, INPUT) ; pinMode(VCC1_PIN, INPUT); pinMode (VCC2_PIN, INPUT); pinMode(18 , INPUT_PULLUP) ; pinMode(19 , INPUT_PULLUP) ; // LEDni o'chiring digitalWrite (LED_BUILTIN, LOW) ; ) bekor o'rnatish (void ) ( // Biz hech narsani ishga tushirmaymiz, darhol uxlab qolamiz uyqu_rejimi(); ) // Bu funksiya har TIMEOUT soniyada bir marta bajariladi void loop(void ) ( unsigned long msg; bayt harorati, namlik, kuchlanish; // Qo'shimcha qurilmalarni yoqing peripheral_start(); // Harorat va namlik sensori yoqilishini kuting kechikish (30); // Sensorlardan ma'lumot oling temp = (bayt) (sht1x.readTemperatureC () + 40 .) * 2 ; namlik = (bayt) sht1x.readHumidity () ; kuchlanish = analogRead (A0) / 4 ; // Ma'lumotlardan paket tuzing xabar = 0; msg | = kuchlanish; msg<<= 8 ; msg | = humidity; msg <<= 8 ; msg | = temp; // Paketni bir necha marta yuboring uchun (int i = 0; i< ATTEMPTS; i++ ) rf.send (msg) ; // Qo'shimcha qurilmalarni o'chiring periferik_stop(); // Funktsiyadan chiqqandan so'ng, doska yana uxlab qoladi }

Ichki taxta kodi

receiver.ino #include #o'z ichiga oladi #o'z ichiga oladi #o'z ichiga oladi bayt mac = (0x90, 0xA7, 0xDA, 0x0F, 0xBC, 0x75); charserver = "narodmon.com" ; EthernetClient mijozi; const int rfpin = 7; AmperkaLine rf(rfpin); bekor oʻrnatish(void ) ( pinMode(rfpin, INPUT) ; pinMode(6 , OUTPUT) ; Serial.begin (9600 ) ; Serial.println (“Boshlandi.” ) ; ) void loop(void ) ( statik imzosiz uzun orqaga chiqish = 0 ; statik float temp, namlik, kuchlanish; unsigned long msg; int res; if ((res = rf.receive (& msg) ) == 0 ) ( temp = ((float ) (msg& 0xFF ) ) / 2 . - 40 .; msg >>= 8 ; namlik = (float ) (msg& 0xFF ) ; msg >>= 8 ; kuchlanish = (float ) (msg& 0xFF ) / 256 . * 1,2 * 10 * 1,1 ; digitalWrite (6 , YUKOR) ; Serial.print ("Temp: " ); Serial.print (temp) ; Serial.print (", namlik: " ) ; Serial.print (namlik) ; Serial.print (", kuchlanish: " ); Serial.println ( kuchlanish) ; digitalWrite(6 , LOW) ; ) else Serial.println ("E" ) ; if (millis() - pushtimeout > 60000 * 5 ) ( pushtimeout = millis() ; Serial.println ("Ethernet ishga tushirilmoqda... " ); agar (Ethernet.begin (mac) == 0 ) ( Serial.println ( "DHCP yordamida Ethernetni sozlab boʻlmadi"); while (1 ) ( ) ) kechikish (1000 ); Serial.println("ulanish..." ); if (client.connect (server, 8283 ) ) ( Serial.println ("ulangan" ); client.println ( "# 90-A7-DA-0F-BC-75 # Sensor # 55.751775 # 37.616856 # 0.0"); client.print("#90A7DA0FBC7501#"); client.print (temp, DEC) ; client.println("#In"); client.print("#90A7DA0FBC7502#"); client.print(namlik, DEC); client.println("#Namlik"); client.print("#90A7DA0FBC7503#" ); client.print (kuchlanish, DEC) ; client.println("#Voltaj"); client.println("##"); ) else Serial.println("ulanish muvaffaqiyatsiz tugadi" ); ( unsigned long tm = millis() ; while (millis() - tm< 5000 ) { if (client.available () ) { char c = client.read () ; Serial.print (c) ; } } } client.stop () ; } }

Meteorologiya stansiyasini “Xalq monitoringi”da ro‘yxatdan o‘tkazish

Qurilmamiz tomonidan uzatiladigan ma'lumotlar jamoatchilik monitoringida to'g'ri ko'rsatilishi uchun siz quyidagilarni bajarishingiz kerak:


Qurilmaning namoyishi

Yana nima qilish mumkin?

    Teensy bortida real vaqt soati (RTC) mavjud. Ularning ishlashi uchun faqat kvarts etarli emas. Har qanday radio elementlar do'konida 32,768 kHz chastotada kvarts sotib olishingiz va uni lehimlashingiz mumkin. Keyin siz Teensy-ni RTC signali bilan uyg'otishingiz mumkin. Afzallik shundaki, siz aniqroq ko'rsatkichlar zarur bo'lgan soatlarda qurilmani tez-tez uyg'otishingiz mumkin. Misol uchun, ish vaqtida qurilmani har 5 daqiqada, qolganlari esa har yarim soatda uyg'otadi.

Bo'sh vaqtimda va bu safar men kichik ob-havo stantsiyasini yaratish bo'yicha ko'rsatmalar yozdim. U sana ko'rsatilgan soat sifatida ishlaydi va xona ichidagi va tashqarisidagi haroratni ko'rsatadi. Biz Arduino UNO dan asosiy boshqaruvchi sifatida foydalanamiz, lekin bortida Atmega328p o'rnatilgan boshqa plata buni amalga oshiradi. Displey uchun biz WG12864B grafik ekranidan foydalanamiz. Shuningdek, biz ikkita ds18b20 harorat sensorini ulaymiz. Biri bino ichida, ikkinchisi tashqarida. Boshlaylik.

Uy qurilishi mahsulotlarini ishlab chiqarish jarayonida bizga kerak bo'ladi:

Arduino UNO (Yoki boshqa Arduino bilan mos keladigan plata)
- WG12864B grafik ekrani
- ds18b20 harorat sensori, 2 dona
- Quvvat manbai 6 - 12 V
- Rezistorlar 4,7 Kom 0,25 Vt, 2 dona.
- rezistorlar 100 ohm 0,25 Vt
- 4 ta AAA "kichkina barmoq" batareyalari uchun batareya bo'limi
- SEGA konsol kartridjidan quti
- Izolyatsiya qiluvchi lenta
- ulash simlari
- elektron plata
- Tugmalar
- Kantselyariya pichog'i
- lehimli temir
- Lehim, rozin
- Ikki tomonlama lenta

1-qadam WG12864B3 ni tayyorlang.
Ilgari ekranlar bilan ishlamaganlar bir xil ko'rinadigan ekranlarning ko'p sonli o'zgarishlaridan qo'rqishlari mumkin. Men biroz tushuntiraman. Ushbu turdagi ekranlarning aksariyati ks0107/ks0108 chiplarida ishlaydi. Barcha ekranlarni 4 turga bo'lish mumkin:

Variant A: HDM64GS12L-4, Crystalfontz CFAG12864B, Sparkfun LCD-00710CM, NKC Electronics LCD-0022, WinStar WG12864B-TML-T

Variant B: HDM64GS12L-5, Lumex LCM-S12864GSF, Futurlec BLUE128X64LCD, AZ displeylari AGM1264F, Displaytech 64128A BC, Adafruit GLCD, DataVision DG12864-818, QLDJ28, QLD128, Topway Y-1286 4F, TM12864L-2, 12864J-1

Variant C: Shenzhen Jinghua Displays Co Ltd. JM12864

Variant D: Wintek- Kaskadlar WD-G1906G, Wintek - GEN/WD-G1906G/KS0108B, Wintek/WD-G1906G/S6B0108A, TECDIS/Y19061/HD61202, Varitronix/MGLS1924

Ular deyarli bir xil ko'rinadi. Lekin ulanish pinlari boshqacha. Men WG12864B3 V2.0 ni tanladim va sizga tavsiya qilaman, lekin agar ekran boshqacha bo'lsa yoki qo'lingizda bo'lmasa, jadval yordamida buni osongina aniqlashingiz mumkin:

Qisqacha spetsifikatsiyalar:

Internetda juda ko'p turli xil ulanish sxemalari mavjud va hamma narsa ishlayotganga o'xshaydi. Gap shundaki, nafaqat turli xil ekranlar, balki ularni ulashning ikkita usuli mavjud: ketma-ket va parallel. Seriyali port ulanishidan foydalanganda bizga faqat 3 ta mikrokontroller chiqishi kerak bo'ladi. Parallel minimal bilan 13. Bu holda tanlov aniq, Arduino baribir ko'p xulosalarga ega emas. Parallel ulanish uchun ulanish sxemasi quyidagicha:

Biz foydalanadigan ketma-ket ulanish uchun sxema quyidagicha:

WG12864B - Arduino UNO 1 (GND) - GND 2 (VCC) - +5V 4 (RS) - 10 5 (R/W) - 11 6 (E) - 13 15 (PSB) - GND 19 (BLA) - qarshilik orqali 100 Ohm - +5V 20 (BLK) - GND

Kontrastni sozlash uchun ekranda potentsiometr bo'lishi kerak. Unsiz ekranlar mavjud, ammo bu hozir juda kam:

5 voltlik kuchlanish orqa yorug'lik diodlarini tasodifan yoqmasligi uchun 100 ohm qarshilik kerak.

2-qadam Vaziyatni shakllantirish.
Koson uchun qutini Sega pristavkasining kartrijidan oling. Agar siz ushbu qutini qo'lingizda topmasangiz, boshqa holatdan foydalanishingiz mumkin. Asosiysi, unga ekran va Arduino mos keladi.

Hech qanday bo'lak qolmasligi uchun qutining tepasida shaffof plyonkani kesib oling:

Keyin, ruhoniy pichoqni ishlatib, ekran uchun 37x69 oynani kesib tashlang.

Orqa tomonda, kesmaning chetida biz ikki tomonlama lentani yopishtiramiz, yaxshisi qora:

Biz himoya qog'ozni yopishqoq lentadan olib tashlaymiz va unga ekranimizni yopishtiramiz:

Tashqi tomondan u quyidagicha ko'rinishi kerak:

Ekran ostida, shuningdek, ikki tomonlama lentada biz Arduino-ni o'rnatamiz, avval USB porti va elektr rozetkasi uchun kesiklar yaratamiz:

Arduino rozetkalari erkin yopilishi uchun qutining har ikki tomonida kesilgan bo'lishi kerak:

3-qadam Harorat sensorlari.
Biz DS18B20 raqamli harorat sensorlaridan foydalanamiz. Ulardan foydalanib, biz -55 ... + 125 ° S keng harorat oralig'ida kattaroq o'lchov aniqligini, 0,5 ° S dan ortiq bo'lmagan xatolikni qo'lga kiritamiz. Bundan tashqari, sensor raqamli bo'lib, barcha hisob-kitoblarni o'zi bajaradi va Arduino shunchaki tayyor o'qishlarni oladi. Ushbu sensorni ulashda DQ va VDD pinlari orasidagi 4,7KŌ tortishish qarshiligi haqida unutmang. Bir nechta ulanish variantlari ham mumkin. Tashqi kuch bilan, menimcha, eng yaxshi variant, biz undan foydalanamiz:

Har qanday quvvat manbai bilan sensorlar parallel ravishda ulanadi:

Biz xona ichidagi harorat sensorini kichik doskaga joylashtiramiz va ikkita tugmachadan soatning vaqti va sanasini o'rnatamiz:

Ikkala tugmachadan umumiy simni GND ga ulaymiz, simni birinchi tugmachadan A0 ga, ikkinchisidan A1 ga ulaymiz.
Biz uni Arduino yonidagi ikki tomonlama lentaga o'rnatamiz:

Xonadan tashqarida joylashtirilishi kerak bo'lgan sensorni metall, chang o'tkazmaydigan korpusda tanlash yaxshidir:

Datchikni derazadan tashqariga osib qo'yish uchun kerakli uzunlikdagi simni hisoblang, asosiysi u 5 metrdan oshmasligi kerak, agar sizga uzunroq uzunlik kerak bo'lsa, tortishish qiymatini kamaytirishingiz kerak bo'ladi. yuqori rezistor.

Ikkala sensorning DQ ma'lumotlar avtobusidan simni Arduino-ning 5-piniga ulaymiz.
Vdd - +5 Arduino.
GND - GND Arduino.

4-qadam Oziqlantirish.
Quvvat uchun siz 6 dan 12 voltgacha bo'lgan kuchlanishli quvvat manbaidan foydalanishingiz mumkin. Quvvat manbai simining oxirida Arduino elektr rozetkasiga mos keladigan vilkasini lehimlang:

Yoki korpusga to'rtta "AAA", "kichkina barmoq" batareyalari uchun batareya bo'linmasini qo'yishingiz mumkin. Va ko'rfazdan musbat simni Vin Arduino-ga, salbiy simni esa GND-ga ulang.

5-qadam Dasturlash muhitini tayyorlang.
Avval Arduino IDE-ni rasmiy veb-saytdan yuklab olishingiz va o'rnatishingiz kerak

Shuningdek, eskiz uchun zarur bo'lgan ikkita kutubxonaga qo'shing. OneWire - ds18b20 sensorlari bilan aloqa qilish uchun zarur:

U8glib - ekranda ma'lumotlarni ko'rsatish uchun ishlatiladi:

Kutubxonalar yuklab olish. Keyin biz arxivlarni ochamiz va arxivlar tarkibini Arduino IDE o'rnatilgan papkada joylashgan "kutubxonalar" papkasiga o'tkazamiz. Arduino IDE orqali kutubxonalarni ham qo'shishingiz mumkin. Buning uchun arxivlarni ochmasdan, Arduino IDE-ni ishga tushiring, menyudan Sketch - Connect Library-ni tanlang. Ochiladigan ro'yxatning eng yuqori qismida "Zip kutubxonasini qo'shish" bandini tanlang. Yuklab olingan arxivlarning joylashuvini belgilang. Barcha qadamlardan so'ng siz Arduino IDE-ni qayta ishga tushirishingiz kerak.

6-qadam Eskizni tahrirlash.
Harorat sensorlari One Wire protokoli yordamida ishlaydi va har bir qurilma uchun noyob manzilga ega - 64 bitli kod. Eskizdagi sensorlarni qidirish uchun buyruqlar qo'shish tavsiya etilmaydi. Sensorlarni hiqillash uchun har safar Arduino-ni yuklashning hojati yo'q. Shuning uchun, birinchi navbatda, hamma narsani yig'ib, biz Arduino eskizini to'ldiramiz, u menyuda joylashgan Fayl - Misollar - Dallas harorati - OneWireSearch. Keyin biz Tools - Port Monitorni ishga tushiramiz. Arduino bizning sensorlarimizni topishi, manzillar va harorat ko'rsatkichlarini yozishi kerak. Ushbu manzillar yozib qo'yilishi yoki biron bir joyga ko'chirilishi kerak. Endi Ard_Tic_Tak_WG12864B_2_x_Term_Serial eskizini oching va qatorlarni qidiring:

Bayt addr1=(0x28, 0xFF, 0x75, 0x4E, 0x87, 0x16, 0x5, 0x63);// ichki bayt manzili addr2=(0x28, 0xFF, 0xDD, 0x14, 0xB4, 0x5, 0x16, sensor);

Biz manzilga mos keladigan sensorlarning manzillarini o'z manzillarimiz bilan almashtiramiz.
Bizning soatimiz RTC modulidan (real vaqt soati) foydalanmaydi, shuning uchun soatni to'g'rilash kerak. Qulaylik uchun qatorni izohdan olib tashlang (ekranda soniyalar paydo bo'ladi):

//u8g.setPrintPos(44, 50); u8g.print(sek); // Harakatning to'g'riligini nazorat qilish uchun soniyalarni chiqaring

Port monitoridan foydalanib, to'g'ri vaqtni o'rnating. Buni amalga oshirish uchun port monitorini oching, dastlabki harorat o'lchovlari tugashini kuting va joriy sana va vaqtni "kun, oy, yil, soat, daqiqa, soniya" formatida kiriting. Bo'shliqlar, raqamlar vergul yoki nuqta bilan ajratilmaydi.

Agar soat shoshayotgan bo'lsa, qiymatni kattaroqqa o'zgartiring, men 100 birlik qadam bilan tajriba o'tkazishni maslahat beraman. Agar orqada qolsa, qatordagi qiymatni kamaytirish kerak:

Agar (micro() - prevmicros >494000) ( // sozlash uchun boshqa narsaga o'zgartiring, u 500000 edi.

Empirik tarzda biz soatning etarlicha aniq ishlashini aniqlaymiz. Harakatning aniqligini aniqlash uchun sizga soniyalar chiqishi kerak. Raqamni aniq kalibrlashdan so'ng, soniyalarni sharhlash va shu bilan ekrandan olib tashlash mumkin.
Eskiz yuklanmoqda.

Meteorologiya stansiyasining loyihasi V. Petinning "Arduino kontroller yordamida loyihalar" 2-nashr kitobidan asos qilib olingan (2-ilovaning 5-loyihasi). Windows 10 da Arduino IDE 1.8.5 ishlatilgan.
Eskizni ishga tushirishda xatolik yuz berdi

Internetda Arduino uchun bir xil nomga ega, ammo turli xil tarkibga ega kutubxonalarni yuklab olishingiz mumkin. Agar siz "noto'g'ri" kutubxonadan foydalansangiz, eskiz ishlamasligi mumkin. Ko'rinishidan, men noto'g'ri kutubxonalarni oldim. Atmosfera bosimini o'lchash uchun loyihaga BMP180 sensori qo'shdim va eskizni qayta ishladim.

Ulanish diagrammasi

Manzillarni skanerlash

Birinchidan, BMP180 sensori va LCD1602 indikatorini Arduino-ga ulang. I2C skaneri eskizini kompilyatsiya qiling va I2C avtobusidagi qurilma manzillarini aniqlash uchun uni ishga tushiring.

Har 5 soniyada dastur qurilmalarni skanerlaydi va MAQOMOTI portiga manzillarni chiqaradi. Men 0x3F va 0x77 manzilli ikkita qurilma topdim. BMP180 sukut bo'yicha 0x77 manziliga ega, shuning uchun LCD indikator 0x3F manziliga ega.
Ba'zi sxemalarda kitoblar SDA va SCL signallari Arduino platasiga ulangan joyda aralashtiriladi. Bo'lishi kerak: SDA - A4 gacha, SCL - A5 gacha. Agar BMP180 modulida beshta pin bo'lsa, u holda VIN piniga +5 volt qo'llaniladi.

Ulanish diagrammasi

Endi sxemani to'liq yig'ing. Men 150 ohm rezistorlar bilan birga taxtaga o'rnatilgan umumiy katodli RGB LEDni ishlatardim. Umumiy katod GND piniga ulanadi, boshqa pinlar diagramma bo'yicha ulanadi. Eskizga o'zgartirish kiritishning hojati yo'q, chunki LEDlarning yorqinligi tsiklik qonunga muvofiq o'zgaradi.
Diagrammada kitobdagi kabi RGB LEDning umumiy anod bilan ulanishi ko'rsatilgan.
Agar LCD1602 ekranida hech qanday belgi ko'rinmasa, yorqinlikni boshqarishni aylantiring. Ko'rsatkichning orqa yorug'ligi juda ko'p oqimni iste'mol qiladi, shuning uchun kamida 2 A oqim bilan quvvat manbaidan foydalaning. Men tashqi 2 A quvvat manbai bilan USB hubdan foydalandim.
Sxemada men ZP-22 piezo chaqiruvidan foydalandim. Qo'ng'iroqqa ulangan qarshilik 100 ohm. Ovoz chastotasini dasturda o'zgartirish mumkin. Men 1000 Gts chastotani tanladim. Agar siz qattiq ovoz chastotasiga ega bo'lgan signalga duch kelsangiz, uni oddiy LED kabi kuchlanishni qo'llash va olib tashlash orqali yoqishingiz va o'chirishingiz mumkin. Eskiz boshlanganda qisqa signal eshitiladi. //bzz(100) qatoriga izohni olib tashlash orqali dastur ishlayotgan vaqtda davriy signalni yoqishingiz mumkin; eskizda.
Loyihada men allaqachon o'rnatilgan 4,7 kŌ rezistorli modul shaklida DHT11 sensoridan foydalandim. Qarshilik 4,7 dan 10 kOm gacha bo'lishi mumkin.
DS1302 soat modulining Vcc pinini +5 voltli relsga ulang. Shunday qilib, siz batareya zaryadini kamaytirasiz, aslida u faqat Arduino quvvati o'chirilganida ishlaydi.

Dastur (eskiz)

BMP085 kutubxonasi BMP180 ga xizmat ko'rsatish uchun ishlatilgan. Bosim qiymati hududning balandligiga bog'liq. Atmosfera bosimining to'g'ri qiymati uchun siz balandlikni tanlashingiz kerak. Buning uchun dps.init (MODE_STANDARD, 10000, rost) qatorini tahrirlang; Mening bo'yim 100 m (10000 sm). Bosimlarni hisoblash bo'lagi bmp085 kutubxonasining BMP085_test2.ino misolidan olingan.

meteo_P eskizi

#o'z ichiga oladi
#o'z ichiga oladi
#o'z ichiga oladi
# "dht.h" ni o'z ichiga oladi
#o'z ichiga oladi
BMP085 dps = BMP085();
uzoq Bosim = 0, Balandlik = 0;
imzosiz uzoq vaqt1 = 0;

#DHTPIN 10 ni aniqlang
#define DHTTYPE 11 // 11 - DHT11, 22 - DHT22
DHT dht(DHTPIN, DHTTYPE);

int kCePin = 4; // RST DS1302
int kIoPin = 3; // DS1302 ma'lumotlari
int kSclkPin = 2; // CLK DS1302
DS1302 rtc(kCePin, kIoPin, kSclkPin);

int REDpin = 9;
int GREEN pin = 6;
int BLUE pin = 11;

LiquidCrystal_I2C lcd(0x3f, 16, 2); // manzilingizni 0x20...0xff manzilini o'rnating
imzolanmagan uzoq memTime;
int bzzPin = 8;

bekor HumTempRead() (
float hum = dht.readHumidity();
float temp = dht.readTemperature();
if (isnan(hum) || isnan(temp)) (
Serial.println("DHT sensoridan o'qib bo'lmadi!");
lcd.setCursor(0, 1);
lcd.print("H=--% T=---");
lcd.setCursor(11, 1);
lcd.print((char)223);
lcd.setCursor(12, 1);
lcd.print("C");
) boshqa (
lcd.setCursor(0, 1);
lcd.print("H=");
lcd.setCursor(2, 1);
lcd bosib chiqarish (g'o'l);
lcd.setCursor(4, 1);
lcd.print("%T=+");
lcd.setCursor(9, 1);
LCD displey (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) (
ohang (bzzPin, 1000, _bzzTime); // chastota 1000 Hz
}

bekor o'rnatish()(
Serial.begin(9600);
Wire.begin();
kechikish (1000);

dps.init (MODE_STANDARD, 10000, rost); // 100 metr (balandlik sm)

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

lcd.init();
lcd.backlight();
lcd.home();
// lcd.setCursor(0, 0);

rtc.halt(noto'g'ri);
rtc.writeProtect(noto'g'ri);

//rtc.setDOW(Juma); // Haftaning kunini JUMA ga o'rnating, haftaning kunini belgilang
//rtc.setTime(4, 58, 0); // Vaqtni 12:00:00 ga o'rnating (24 soat formati)
//rtc.setDate(6, 8, 2010); // Sanani 2010-yil 6-avgustga belgilang (kun, oy, yil)
}

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

agar ((millis() - memTime > 2000) yoki (millis()< memTime)) { // DHT11/22 1 time each 2 seconds
HumTempRead();
memTime = millis();
}
kechikish (100);

agar (((millis() - vaqt1) / 1000,0) >= 1,0) (
dps.calcTrueTemperature();
vaqt1 = millis();
}
dps.getPressure(&Bosim);
Serial.print("Bosim(Pa):");
Serial println(Bosim);

longp2;
intpi;
p2 = (Bosim / 133.3224); // Pa mmHg da
pi = trunc (p2); // sonning kasr qismini olib tashlash

lcd.setCursor(0, 0);
lcd.print("P=");
lcd.setCursor(2, 0);
LCD displey (pi); // chiqish atm. bosim LCD-da
lcd.setCursor(5, 0);
lcd.print("mm");
// kechikish (3000);
//bzz(100); // signallarni tinglashni istasangiz izohni olib tashlang
{
uchun (int qiymati = 0; qiymat<= 255; value += 1) {
analogWrite(REDpin, qiymat);
analogWrite(GREENpin, 255 - qiymat);
analogWrite (BLUEpin, 255);
kechikish (5);
}

uchun (int qiymati = 0; qiymat<= 255; value += 1) {
analogWrite (REDpin, 255);
analogWrite(GREENpin, qiymat);
analogWrite(BLUEpin, 255 - qiymat);
kechikish (5);
}

uchun (int qiymati = 0; qiymat<= 255; value += 1) {
analogWrite(REDpin, 255 - qiymat);
analogWrite (GREENpin, 255);
analogWrite(BLUEpin, qiymat);
kechikish (5);
}
}
}

Fayllar katalogida siz loyihada foydalanilgan eskiz va kutubxonalarni yuklab olishingiz mumkin.

Yuklab olingan arxivdan LiquidCrystal_I2C.zip, bmp085.zip, DS1302.zip va DHT.zip kutubxonalarini Arduino IDE-ga import qiling. Menyuga o'ting Eskiz Kutubxonaga ulanish .zip kutubxonasini qoʻshish... va oynada kutubxona zip arxivini tanlang.
meteo_P eskizini yuklab oling. Eskizdagi LCD1602 manzilini I2C avtobusini skanerlash natijasida olingan qiymat bilan almashtiring. Eskizni kompilyatsiya qiling va ishga tushiring.
Agar eskiz ishlayotgan bo'lsa, port monitorini oching va chiqish xabarlarini ko'ring. dps.init bayonotidagi balandlikni moslang (MODE_STANDARD, 10000 , rost); haqiqiy bosim qiymatlarini olish uchun.
Soatingizni sozlang. //rtc.setTime(4, 58, 0) qatorini izohdan olib tashlang; Qavslar ichida joriy vaqtni belgilang (vergul bilan ajratilgan soat, daqiqa va soniyalar) va eskizni boshqaruvchiga qayta yuklang. Vaqt o'rnatilgandan so'ng, ushbu qatorni yana izohlang va eskizni qayta ishga tushiring.
Agar tungi yorug'likning yoritilishi sizni bezovta qiladigan bo'lsa, siz eskiz oxiridagi for looplarida kechikish uzunligini o'zgartirib, uni sozlashingiz mumkin. Kechikish bilan (2); loop 2-3 soniya davom etadi, kechikish bilan (5); — 4 dan 5 sekundgacha, kechikish bilan(30); - 15-16 soniyagacha. Indikator bo'yicha ma'lumotlar bir xil vaqt oralig'ida yangilanadi.
Ob-havo stantsiyasidan avtonom foydalanilganda, ya'ni. kompyuterning USB portiga ulanmasdan, MAQOMOTI port monitoriga ma'lumot chiqishini o'chirish uchun eskizdagi Serial ... so'zlari bilan chiziqlarni izohlang.

PS. Kitobning eskizida va DHT kutubxonasi uchun misollarda ta'rif chizig'i ko'rsatilgan #DHTTYPEni aniqlang DHT 11. Eskiz ishlaydi, lekin bir necha soatdan keyin buziladi. Soat to'xtaydi, displey o'zgarmaydi. Port monitorida noaniq xabar paydo bo'ladi, unda dht ga havola mavjud.
Ushbu qatorda men DHT harflarini olib tashladim, ya'ni. qildi #DHTTYPE 11 ni aniqlang. Shundan so'ng, eskiz barqaror ishlay boshladi.

Maqola 25/06/2018 yangilangan

Ishlatilgan resurslar
1. Petin V.A. Arduino boshqaruvchisi (Elektronika) 2-nashrdan foydalangan holda loyihalar, Sankt-Peterburg. BHV-Peterburg, 2015 yil 464 p.
2. Petin V. A., Binyakovskiy A. A. Amaliy Arduino entsiklopediyasi. - M., DMK Press, 2017. - 152 b.
3.http://arduinolearning.com/code/i2c-scanner.php
4. http://arduino.ru/forum/programmirovanie/ds1302lcd1602
5. http://robotics18.rf/how-to-connect-lcd-1602-to-arduino-by-i2c/
6. bmp085.zip kutubxonasidan BMP085_test2.ino misoli
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/

Kengash ishlayotganiga ishonch hosil qilish uchun komponentlarni ulashdan oldin proshivkani yuklab olish tavsiya etiladi. Yig'ishdan so'ng siz yana miltillashingiz mumkin, taxta tinchgina miltillashi kerak. Kengashning 5V quvvat pallasida (manzilli LED tasmasi, servolar, motorlar va boshqalar) yuqori quvvat iste'molchilari bo'lgan loyihalarda Arduino-ni kompyuterga ulashdan oldin kontaktlarning zanglashiga olib keladigan tashqi 5V quvvatni qo'llash kerak, chunki USB quvvatni ta'minlamaydi. zarur oqim, agar, masalan, chiziq uni talab qilsa. Bu Arduino platasidagi himoya diyotini yoqib yuborishi mumkin. Mikrodasturni yuklab olish va yuklash bo'yicha qo'llanmani keyingi qatordagi spoyler ostida topish mumkin.

Arxivdagi papkalarning mazmuni

  • kutubxonalar- loyiha kutubxonalari. Mavjud versiyalarni almashtiring
  • proshivka- Arduino uchun proshivka
  • sxemalar- komponentlarning ulanish sxemalari

Qo'shimcha

  • Tajriba shuni ko'rsatdiki, korpusdan tashqarida harorat sensori ichkariga qaraganda 0,5 daraja kamroq ko'rsatadi! Elektronikani yanada muvaffaqiyatli tartibga solish, isitish elementlaridan issiqlikni olib tashlash va himoya qilish kerak ...

  • Displey juda xira/oq bo'lsa
    Displey drayveri platasida (simlar ulangan) kontrast tugmasi mavjud bo'lib, uning yordami bilan siz kontrastni kerakliga moslashingiz mumkin. Bundan tashqari, kontrast displeyning ko'rish burchagiga bog'liq (bu LCD) va siz displeyni "displey kindik darajasida, biz yuqoridan qaraymiz" burchak ostida ham aniq displey uchun sozlashingiz mumkin. Va kontrast kuchli quvvat manbaiga bog'liq: 5V dan boshlab displey iloji boricha aniq va yorqin ko'rinadi, Arduino orqali USB-dan quvvatlanganda kuchlanish taxminan 4,5V ni tashkil qiladi (uning bir qismi USB bo'ylab himoya diyotiga to'g'ri keladi) chiziq) va displey unchalik yorqin emas. Chiqishni 5V dan tashqi quvvat manbai bilan tugma bilan sozlang!

  • Agar CO2 sensori to'g'ri ishlamasa (Evgeniy Ivanovdan infa)
    Xo'sh, misollarda sensor kutubxonasi papkasida kalibrlash uchun eskizlar mavjud. shuningdek, "HD" ulagichini erga 7+ soniya davomida qisqartirish orqali soqovni ishga tushirish mumkin.
    Albatta, sovuqda ko'chada buni qilish shart emas ... siz shunchaki shishani ichidagi sensori bilan toza havo bilan to'ldirishingiz va uni yopishingiz mumkin. kalibrlash kamida 20 daqiqa davom etadi.
    Odatiy bo'lib, sensor avtomatik kalibrlash yoqilgan bo'lib, u har kuni sodir bo'ladi va agar sensor ventilyatsiya qilinmagan xonada ishlatilsa, bu kalibrlash tezda ufqdan tashqari normadan qiymatlarni oladi, shuning uchun uni o'chirib qo'yish kerak. .
    Hujjatlar.

  • Sensorni avtomatik kalibrlash Eskizda CO2 o'chirilgan!

  • Agar bor bo'lsa BME280 sensori ishlamayapti, ehtimol u boshqa manzilga ega. Loyiha Adafruit_BME280 kutubxonasidan foydalanadi, unda alohida manzilni o'zgartirish funksiyasi yo'q, shuning uchun manzil Adafruit_BME280.h kutubxona faylida deyarli faylning boshida qo'lda o'rnatiladi ( kutubxonalar jildingizdagi Adafruit_BME280 jildida boʻlsa, uni oʻsha yerda oʻrnatishingiz kerak edi.), mening modulimda 0x76 manzili bor edi. BME280 modulim manzilini qanday bilsam bo'ladi? I2c skaneri deb nomlangan maxsus eskiz mavjud. Siz uni Google'da topishingiz mumkin, mumkin. Ushbu eskizni yoqing, portni oching va i2c avtobusiga ulangan qurilmalarning manzillari ro'yxatini oling. Boshqa modullar sizni bezovta qilmasligi uchun siz ularni o'chirib, faqat BME280 ni qoldirishingiz mumkin. Biz kutubxonada qabul qilingan manzilni belgilaymiz, faylni saqlaymiz va ob-havo soati proshivkasini yuklaymiz. Hammasi!

  • Agar soat orqada bo'lsa, muammo katta ehtimollik bilan quvvat pallasida. Elektr ta'minotini yaxshiroq o'zgartirishda muammo davom etsa, RTC modulini quvvatlantirish uchun kondansatkichni osib qo'ying (to'g'ridan-to'g'ri platada VCC va GND ga lehim): keramika ekanligiga ishonch hosil qiling, 0,1-1 uF (103 yoki 104 belgisi, belgilar jadvaliga qarang). Shuningdek, siz elektrolitni (6,3V, 47-100 uF) qo'yishingiz mumkin.

Mikrodastur sozlamalari

#define RESET_CLOCK 0 // proshivka yuklanayotganda soatni tiklang (olinmaydigan batareyali modul uchun). 0 qo'yishni va yana miltillashni unutmang! #define SENS_TIME 30000 // ekrandagi sensor ko'rsatkichlarini yangilash vaqti, millisekundlar #define LED_MODE 0 // RGB LED turi: 0 - asosiy katod, 1 - asosiy anod #define LED_BRIGHT 255 // CO2 LED yorqinligi (0 - 255) # BLUE_YELLOW 1ni belgilang // ko'k o'rniga sariq rang (1 ha, 0 yo'q), lekin ulanish xususiyatlari tufayli sariq unchalik yorqin emas #define DISP_MODE 1 // yuqori o'ng burchakda ko'rsatish: 0 - yil, 1 - haftaning kuni , 2 - soniya #define WEEK_LANG 1 // hafta kunining tili: 0 - ingliz, 1 - rus (transliteratsiya) #define DEBUG 0 // ishga tushirilganda sensorni ishga tushirish jurnalini ko'rsatish #bosim 1 ni aniqlang // 0 - bosim grafik, 1 - yomg'ir prognozi grafigi (bosim o'rniga ). Diagramma chegaralarini tuzatishni unutmang // grafiklar uchun chegaralarni ko'rsatish #TEMP_MIN 15 ni aniqlang #TEMP_MAX 35 ni aniqlang #HUM_MIN 0 ni aniqlang #HUM_MAX 100 ni aniqlang #PRESS_MIN -100 ni aniqlang #PRESS_MAX 100 ni belgilang COX02 #define COX302

Maqola yoqdimi? Do'stlaringizga ulashing: