BMP085 Модул на сензор за барометрично налягане за arduino (или как да направите метеорологична станция със собствените си ръце). Основен набор от компоненти

10.09.2021

Като част от тях се използват температурни сензори охранителни алармиили системи като " Умен дом". Основната им функция е да контролират температурата в помещението. Трябва да закупите GSM сензор за температура, когато има нужда да събирате информация и да я изпращате до централно алармено устройство. В системите Smart Home устройството ви позволява да разберете информация за вътрешния климат, който влияе автоматично включванеили изключване на електрически уреди. GSM контролът на помещенията, неразделна част от който е алармена система с температурни сензори, позволява на собственика да спести време и пари възможно най-ефективно. Всичко, което трябва да направите, е да закупите и инсталирате SIM карта и да свържете сензора към електрически контакт.

За какво са GSM термометрите?

  • За дистанционно управлениевсички видове отоплителни уреди (котли на ток, газ или твърдо гориво);
  • За управление на нагреватели (климатик, инфрачервени нагреватели, подово отопление и други);
  • Да събира информация за температурата и влажността на въздуха.

Ако вярвате на прегледите на експертите за GSM термометри и аларми с температурни сензори, тогава можем да заключим, че системите за контрол и регулиране на температурата са най-модерните начини за контрол на климата в помещението. Това не е само отопление или климатизация, но и възможност за филтриране на въздуха и овлажняване.

Защо си струва да закупите GSM термометър и алармена система с температурни сензори?

  • Възможност за получаване на цялата информация за температурните условия по всяко време. Повечето модели могат да се управляват чрез Android/iOS приложения, което дава възможност за събиране на данни в реално време и тяхното използване;
  • Устройството може да изпълнява десетки задачи в автоматичен или полуавтоматичен режим, освобождавайки потребителя от необходимостта ръчно да контролира температурата и климатичните променливи;
  • Цената на GSM сензор за температура изглежда много ниска, ако вземете предвид всички възможни начини за пестене на електричество, вода и газ, които могат да бъдат постигнати чрез използването на устройството;
  • Ако температурата достигне критична точка (която сами задавате), сензорът ще ви уведоми чрез изпращане на SMS съобщение. Освен това устройството може да се конфигурира и управлява с помощта на SMS команди.

Метеорологичната станция е предназначена предимно за наблюдение на времето, гледане на текущата температура, влажност и атмосферно налягане. Нещото е много удобно за рибарите. Реших да направя моя собствена метеорологична станция, базирана на Arduino, но с включен дисплей за данни мобилен телефон.


Принципът на работа на приложението е да го стартирате на телефон с Android OS, свържете се с ардуино платкачрез Bluetooth и като щракнем върху иконите, получаваме дисплей на различни данни.

Принципът на работа на метеорологичната станция е прост. При получаване от телефон 1 запитваме температурния сензор DS18B20, който се намира отвън и изпращаме данните към телефона, при получаване 2 запитваме температурния датчик DS18B20, който се намира в стаята и изпращаме данните към телефона. Когато получим 3, анкетираме сензора BMP085, а когато получим 4, анкетираме сензора за влажност и също изпращаме данните.

Веднага ще отговоря на въпроса „защо да показвам данни на мобилен телефон?“ За мен е по-удобно, особено след като спестявам от закупуване на дисплей, купуване на бутони и вътрешна паметмикроконтролер. Мързелът все още е двигател на прогреса.

Екранни снимки от екрана на мобилен телефон

Измерване на външна температура в градуси по Целзий:

Измерване на стайна температура в градуси по Целзий:

Измерване на външното атмосферно налягане в mm. rt. чл.:

Измерване на влажност на въздуха в %

Е, сега след това малък прегледДа преминем към техническата част на проекта.

Схеми на свързване на сензора

Схема на свързване на температурни сензори DS18B20

Температурните сензори трябва да бъдат свързани паралелно.

Схема на свързване на сензор BMP085:

Схема на свързване на сензор DHT11:

Схема на свързване на bluetooth модул HC-05:


След успешно свързване на всички сензори, качете скицата,

Скица

#включи #включи #включи #включи #включи #включи #включи #define ONE_WIRE_BUS 4 OneWire oneWire(ONE_WIRE_BUS); Далас Температурни сензори (&oneWire); DeviceAddress Thermometer1 = (0x28, 0x00, 0x54, 0xB6, 0x04, 0x00, 0x00, 0x92); DeviceAddress Thermometer3 = (0x28, 0x94, 0xAC, 0xDF, 0x02, 0x00, 0x00, 0xB5);


BMP085 dps = BMP085();

дълга температура = 0, налягане = 0, надморска височина = 0;

DHT dht (8, DHT11);

char incomingByte;

int x=0; void setup() (sensors.begin(); sensors.setResolution(Thermometer1, 10); sensors.setResolution(Thermometer3, 10); Wire.begin(); dps.init(MODE_ULTRA_HIGHRES, 21000, true); dht.begin( ); Serial.begin(9600); void printTemperature(DeviceAddress deviceAddress) ( float tempC = sensors.getTempC(deviceAddress); Serial.println(tempC,1); ) void loop() (sensors.requestTemperatures(); dps. getPressure(&Pressure); int h = dht.readHumidity(); if (Serial.available() > 0) (incomingByte = Serial.read(); if(incomingByte == "1" ) ( x=2; ) if(incomingByte == "2") ( x=1; ) if(incomingByte == "3") ( x=3; ) if(incomingByte == "4") ( x=4 ; ) ) забавяне (x) ( случай 1: printTemperature(Thermometer1); break; case 2: printTemperature(Thermometer3); case 3: Serial.println(Pressure/133.3,1); break; case 4: Serial.println(h);
Телефонното приложение WSAB работи на Android OS 2.3 и по-нова версия,
Принцип на действие

Събраните данни от сензора за скорост и посока на вятъра и други датчици се предават от контролера безжично през GPRS мрежата до нашия или вашия сървър в Интернет, където могат да се преглеждат в реално време и да се изтеглят като пълен архив.

Основни функции
Събиране, натрупване и предаване на метеорологични данни към сървър в Интернет всяка минута.
Събиране и предаване на нивото на входното напрежение към сървъра.

Вход за свързване на нормално затворен вграден алармен датчик / сирена за събитие.

Разходи за експлоатация


Цената на GPRS трафик на месец е около 100 рубли.

Контролерът не изисква поддръжка. Има две нива на защита срещу повреда.

Контролерът има индустриален стандарт за дизайн и качество на производство, като се вземат предвид устойчивостта на влага, прах и температура.
Измерени количества
GPRS анемометър:
- температура (без радиационна защита от слънцето)

GPRS метеорологична станция:

Скорост и посока на вятъра
- температура
- атмосферно налягане
- влажност
точност

Посока на вятъра - 16 сектора

Работна температура от -40 до +60 градуса по Целзий.
Уредите са предназначени за външен или вътрешен монтаж.

Захранване

Два приоритетни захранващи входа:

Вход - 5 волта от външно захранване или USB.

Техническа поддръжка

На всички клиенти се предоставя пълна техническа и гаранционна поддръжка.

1 година гаранция

Оборудване

1. Сензор за скорост и посока на вятъра Davis с монтаж на мачта.
2. Устройство за събиране и предаване на данни със сензори.
3. Захранване 220/USB
4. Всички необходими кабели.
5. Място на сървъра за преглед и съхранение на данни.
6. Съдействие при настройка и пускане в експлоатация.
7. Съдействие при създаване на вашия уеб сайт за събиране и съхранение на данни.

Допълнителни функции (не са включени като стандарт)

2-ри вход 5 - 30 волта от соларен панел или външна батерия/ захранване. (ОПЦИЯ)

Дублиране на събраната информация върху вградената micro SD карта памет.

Прехвърляне на данни към компютър чрез кабел на големи разстояния.
Стандартът за свързване към компютър е RS232 или USB интерфейси.

Свързване на втори анемомер към контролера.
Свързване към контролера на датчик за скорост и вграден оборотомер.

Конфигуриране на контролерни входове като честотни метри и волтметри за свързване на друго оборудване, например професионални анемометри с аналогови изходи.

Вградено отопление за разширяване на долния диапазон на работна температура.

С уважение,
екип на компанията.

Тази статия представя проект за автономна метеорологична станция, работеща в реално време. Устройството събира аналогови или цифрови данни и ги изпраща към уеб сървъра чрез GPRS комуникационен канал. Ако използвате слънчев панел и батерия за него, станцията може да бъде напълно автономна. Устройството поддържа 3 аналогови или цифрови входа. Сърцето на веригата е микроконтролерът PIC16F877A. Микроконтролерът взаимодейства и с GSM/GPRS модула SIM900или SIM300, който се намира на гърба на печатната платка.
Първоначално устройството е проектирано да измерва вятърния поток, за да събере впоследствие база данни за мощността на вятърния поток за различни места. В бъдеще това ще ви позволи да изберете най-оптималното местоположение на вятърния генератор.

Данните се предават към уеб сървъра с помощта на обикновена GET заявка. Това е най-простият метод за прехвърляне на данни. Източниците на кода са в github, няма нищо сложно в тях.

Принципна схема на GSM модула:

Избрах популярния SIM900/300 като GSM модул. Той е свързан с помощта на UART и взаимодействието с него се осъществява с помощта на AT команди. Захранващото напрежение на модула е 3.6V. Свързва се към модула външна антена. Модулът е с вграден контролер зарядно устройство, което е много полезно при използване на батерии и слънчев панел или вятърен генератор за презареждането им.
Веригата използва индикатор LED LED1, който показва състоянието на GSM (мига). Модулът се включва/изключва с бутон S3.

Бележка 1: По време на разработването на проекта модулът SIM300 беше прекратен и заменен от по-новия SIM900. Горната диаграма е предназначена за SIM300 за модула SIM900, някои елементи между модула и SIM картата ще бъдат премахнати (вижте таблиците с данни).

Забележка 2. Превключвателят S3 е предназначен за включване/изключване на GSM модула, но може да бъде заменен от транзистор, свързан към щифта на микроконтролера. Това ще ви позволи да включите или изключите GSM модула с помощта на команда от MK. Това е по-правилно схемно решение.

Бележка 3: Модулът работи правилно, когато напрежение >4V е приложено към щифта Vbat.

Схема на метеорологична станция с MK PIC 16F877A:

И така, основният е микроконтролерът PIC 16F877A, работещ на честота 16 MHz. MK се захранва от Vbat точно като GSM модула. Изводите RA0,1,2 се използват като аналогови входове. Входно напрежениеот тези щифтове се преобразува с помощта на вътрешен. ADC с Vref=3.1V, който се получава с помощта на ценеров диод 3.1V. Входните конектори също извеждат Vbat и GND за захранване на външни сензори (ако е необходимо). Транзисторът Q3 (BC547) се използва за ШИМ контрол на яркостта на LCD екрана. Бутон S4 се използва за нулиране на микроконтролера, а R1 се използва като издърпващ резистор. Устройството също така използва PIC-ICSP конектор, за да осигури възможности за програмиране в схемата.

16×2 LCD екран HD44780:

LCD екран се използва за показване на информация за състоянието. Веригата използва превключвател Power-LCD за изключване на подсветката на екрана, което спестява консумация на енергия на веригата. Освен това изходът от превключвателя е свързан към LCD-INT микроконтролера, така че MK да знае кога LCD се включва (микроконтролерът извършва процедура за инициализация на LCD, за да изведе информация към него). Благодарение на това можете да изключите и свържете LCD модула, докато основната верига на метеорологичната станция работи.

Малко снимки на устройството:

Проект в github ( най-новата версияфърмуер, файлове печатни платки, PDF и др.)

Направи си сам метеорологична станция.

Беше вечер, нямаше какво да се прави след Нова година. Както обикновено, през зимните новогодишни празници искам да заема главата и ръцете си с нещо полезно и креативно. По време на тези новогодишни празници реших да направя метеорологична станция със собствените си ръце. Започнах да се подготвям предварително, закупих и сглобих всички компоненти преди Нова година и направих основното програмиране през празниците.

(има много снимки под изрезката!)

Първо, ще прегледам компонентите; няма да давам връзки, тъй като в eBay (в личен акаунт) стоките отидоха в архива. Купих много компоненти спокойно от eBay. Опитах търг за първи път; преди винаги купувах „купете го сега“. Какво мога да кажа, ако не бързате да пазарувате, можете да закупите някои компоненти по-евтино (разликата понякога е два пъти по-голяма).

Сензор за налягане VMR085
Това е основният сензор. Когато го видях в eBay, разбрах, че искам да построя домашна метеорологична станция.
Сензорът пристигна в обикновен плик, покрит с мехурче отвътре.

Вътре в плика имаше визитна картичка на продавача и сензор, опаковани в антистатична торбичка и увити в друг слой мехурче.

Антистатичната торбичка беше запечатана, така че влагата по време на полета да не застрашава сензора

Изваждаме сензора. От едната страна има запоена линия от контакти, които са вкарани в пяната, за да не се огъват. От другата страна има самия сензор и контактни маркировки.




Всичко би било наред, но маркировките за контакт са нанесени в огледален образ.
Сензорът е свързан чрез I2C шина и се захранва от 3,3 V. Тоест за нормална работа са ви необходими 4 проводника (+, -, SDA, SCL)
Можете да разпитате сензора по 2 начина: или чрез библиотеката, или като използвате функции директно в скицата.
Примерна програма:

#включи

#define BMP085_ADDRESS 0x77 // I2C адрес на BMP085

Const unsigned char OSS = 0; // Настройка за свръхсемплиране

// Стойности на калибриране
int ac1;
int ac2;
int ac3;
неподписан int ac4;
неподписан int ac5;
неподписан int ac6;
int b1;
int b2;
int mb;
int mc;
int md;

Кратка температура;
дълъг натиск;

Празна настройка()
{
Serial.begin(9600);
Wire.begin();
bmp085Калибриране();
}

void loop()
{
температура = bmp085GetTemperature(bmp085ReadUT());
налягане = bmp085GetPressure(bmp085ReadUP());
Serial.print("Температура: „);
Serial.print(temperature/10.0, DEC);
Serial.println("C");
Serial.print("Налягане: „);
Serial.print(pressure/133.322, DEC);
Serial.println("mm Hg");
Serial.println();
забавяне (1000);
}

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

Кратко bmp085GetTemperature(unsigned int ut)
{
дълъг x1, x2;
x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
x2 = ((дълъг)mc<< 11)/(x1 + md);
b5 = x1 + x2;

Връщане ((b5 + 8)>>4);
}

Дълъг bmp085GetPressure (неподписан дълго)
{
дълго x1, x2, x3, b3, b6, p;
без знак дълго b4, b7;
b6 = b5 - 4000;
// Изчислете B3
x1 = (b2 * (b6 * b6)>>12)>>11;
x2 = (ac2 * b6)>>11;
x3 = x1 + x2;
b3 = (((((long)ac1)*4 + x3)<>2;
// Изчислете B4
x1 = (ac3 * b6)>>13;
x2 = (b1 * ((b6 * b6)>>12))>>16;
x3 = ((x1 + x2) + 2)>>2;
b4 = (ac4 * (беззнаков дълъг)(x3 + 32768))>>15;
b7 = ((неподписан дълъг)(нагоре - b3) * (50000>>OSS));
ако (b7< 0x80000000)
p = (b7<<1)/b4;
друго
p = (b7/b4)<<1;
x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>>16;
x2 = (-7357 * p)>>16;
p += (x1 + x2 + 3791)>>4;
връщане p;
}

// Прочетете 1 байт от BMP085 на "адрес"
char bmp085Read (неподписан char адрес)
{
неподписани char данни;

Wire.write(адрес);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 1);
докато (! Wire.available ())
;
връщане Wire.read();
}

Int bmp085ReadInt (неподписан char адрес)
{
неподписан символ msb, lsb;
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(адрес);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 2);
докато (Wire.available()<2)
;
msb = Wire.read();
lsb = Wire.read();
връщане (int) msb<<8 | lsb;
}

// Прочетете некомпенсираната стойност на температурата
unsigned int bmp085ReadUT()
{
unsigned int ut;
// Запишете 0x2E в регистър 0xF4
// Това изисква отчитане на температурата
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x2E);
Wire.endTransmission();
// Изчакайте поне 4,5 ms
забавяне (5);
// Прочетете два байта от регистри 0xF6 и 0xF7
ut = bmp085ReadInt(0xF6);
връщане ут;
}

// Прочетете стойността на некомпенсираното налягане
неподписан дълъг bmp085ReadUP()
{
неподписан символ msb, lsb, xlsb;
unsigned long up = 0;
// Напишете 0x34+(OSS<<6) into register 0xF4
// Поискайте отчитане на налягането с настройка за свръхсемплиране
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x34 + (OSS<<6));
Wire.endTransmission();
// Изчакайте преобразуването, времето на забавяне зависи от OSS
забавяне (2 + (3<// Четене на регистър 0xF6 (MSB), 0xF7 (LSB) и 0xF8 (XLSB)
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF6);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 3);
// Изчакайте данните да станат налични
докато (Wire.available()< 3)
;
msb = Wire.read();
lsb = Wire.read();
xlsb = Wire.read();
up = (((unsigned long) msb<< 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
връщане нагоре;
}


Освен това сензорът има собствен термичен сензор за компенсация на налягането и висотомер

Arduino Nano v3.0
Това е сърцето на цялата метеорологична станция. Просто казано, контролерът е с миниатюрни размери.
купих си
Няма да говоря подробно за контролера, тъй като това вече е направено преди мен:


Пакетът Lightake беше сглобяем, контролерът дойде в пакет с USB кабел и Arduino в запечатана антистатична торбичка.

За да преценя размера, поставих монета от 1 рубла до Arduino.

Контролна платка отблизо



USB кабелът е добър, с феритен пръстен. Arduino се захранва чрез USB кабел. Средата за разработка може да бъде изтеглена (страница за изтегляне). Езикът е подобен на „C“, нямаше проблеми с овладяването му, тъй като много програмирам на него по време на работа.

LCD екран
На работа намерих съвместим LCD 1602 екран в кошчетата. Трябваше да се занимавам с връзката, тъй като не можах да намеря лист с данни за нея. В резултат на това LCD започна да работи.

Но след кратък период на използване забелязах, че този екран не ми е достатъчен и няма да е възможно да се покажат повече данни, тъй като има само 2 реда по 16 знака всеки. Първоначално изглежда, че тези параметри са достатъчни, но когато започнете да програмирате, разбирате, че максимумът, който можете да вкарате, е 3-4 параметъра. И ако направите меню (мислех да направя меню на този екран), тогава остават само 1-2 параметъра свободно място.
В резултат на това започнах да търся друг екран. Първоначално разгледах внимателно графичния екран на Nokia 3310 и дори участвах в търга на eBay, за да го купя, но не се получи (за което съм много доволен), така че трябваше да се откажа от този екран. Сега разбирам, че би било твърде малко за моите цели, тъй като има с какво да се сравнява.
Докато разглеждах на случаен принцип през екрани на Arduino, попаднах на графичен екран 12864 на контролер ST7920. Този екран има правилния размер и добра резолюция за моите нужди (128x64). Тоест можете лесно да поставите 6-7 реда по 20 знака в нормално четим шрифт. Тъй като екранът е графичен, освен текст могат да се поставят и графики с различни шрифтове. Накратко, точно това ми трябваше, всичко присъстваше на този екран, така че не можах да устоя и го поръчах.
Пратката пристигна бързо и беше опакована стандартно: плик с мехурчета, вътре имаше още един слой балончета и екран в антистатична торбичка:






За да преценя размера, поставих монета от 1 рубла до LCD дисплея.




За бързо свързване на екрана към Arduino, запоих линия от контакти към LCD щифтовете. LCD може да бъде свързан чрез серийна шина или паралелна шина. Избрах първия вариант, тъй като вече има малко безплатни контакти на Arduino.
Връзка (взета от мрежата):

- Пин 1 (GND) е свързан към общата шина
- Пин 2 (VCC) е свързан към захранващата шина +5V, а консумацията на ток е сравнително малка и дисплеят може да се захранва от вградения стабилизатор Arduino.
- Пинове 4, 5 и 6 се свързват към цифровите изходи на Arduino, образувайки SPI сериен интерфейс:
пин 4 – (RS) – съответства на линията CS (например 7)
щифт 5 – (RW) – съответства на линията MOSI (например 8)
щифт 6 – (E) – съответства на линията SCK (например 3)
Номерата за контакт на Arduino могат да бъдат всякакви, основното е да не забравяте да ги посочите правилно в текста на програмата, когато инициализирате дисплея.
- Пин 15 (PSB) е свързан към общата шина.
- Контакти 19 (A) и 20 (K) са захранването на подсветката (съответно +5V и GND). За да регулирате яркостта на подсветката, можете да използвате променлив резистор от 10 kOhm, свързан между захранващата шина и GND. Напрежението от неговия двигател се подава към пин 19 на дисплея.
Според тези инструкции свързах всичко с изключение на подсветката. Използвах Arduino PWM за захранване на подсветката.
За програмно свързване на LCD към Arduino се използва библиотеката u8glib. Можете да го изтеглите. Ако има проблеми с изтеглянето, мога да кача библиотеката в narod.ru.
Самата библиотека не е сложна и ви позволява да показвате текст с различни шрифтове, да рисувате линия, да рисувате прости геометрични фигури (правоъгълник, кръг) и да показвате собствени изображения, подготвени по специален начин. По принцип този инструмент е достатъчен за повечето задачи.
Ето резултата от проста програма:

Самата програма:

#include "U8glib.h"

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

// Подпрограма за определяне на свободната памет
int freeRam() (
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0? (int) &__heap_start: (int) __brkval);
}

Настройка на празнота (void) (
u8g.setFont(u8g_font_6x10); // шрифт
u8g.setRot180(); // Обърнете екрана
analogWrite(6, 115); // Задайте яркостта на екрана (анод за задно осветяване на 6 пина)
}

Void цикъл (void) (
u8g.firstPage();
направи (

u8g.setPrintPos(1, 12); // позиция
u8g.print("Здравейте!!!"); // изходен текст
u8g.drawBox(0,22,128,9); // Оцветете правоъгълника в бяло
u8g.setColorIndex(0); // бяло мастило, черен фон
u8g.setPrintPos(1, 30); // позиция
u8g.print("Дума..."); // изходен текст

U8g.setColorIndex(1); // бяло мастило, черен фон
u8g.setPrintPos(1, 50); // позиция
u8g.print("След стартиране ="); // изходен текст
u8g.setPrintPos(85, 50); // позиция
u8g.print(milis() / 1000); // изведе броя секунди след старта
u8g.setPrintPos(1, 64); // позиция
u8g.print(freeRam()); // изведе колко памет е заета
) докато (u8g.nextPage());

Закъснение (200);
}

Часовник за реално време DS1307
Друг компонент за моята метеорологична станция. Този щит изпълнява часовник в реално време. Поръчах ги от eBay. Продавачът изпрати часовниковия шал в нереално голяма кутия


В кутията имаше два листа А4 с реклама и носна кърпичка за часовник, увити в целофан


Бих искал да отбележа, че таксата не надвишава 2 рубли. монета, а кутията с размери 13х15х5 см.
Платката беше опакована в антистатична торбичка

Шал отблизо



Трябваше да се занимавам с този модул. Първо, имаше проблеми с връзката. И второ, на тази платка няма кварц. Ако знаех, че ще отделя толкова много време за модула, най-вероятно щях да го сглобя сам, тъй като интернет е пълен с диаграми. Най-простата схема съдържа 4-5 компонента.
Относно връзката. Намерих библиотека, която казваше, че интерфейсът I2C може да бъде свързан не към обичайните аналогови входове на Arduino (A4 и A5), а към всякакви дискретни. Направих го както е написано. Отначало нищо не работеше, но след дълъг танц с тамбурата часовникът започна. Е, помислих си, това е, проблемите свършиха, но след като се опитах да свържа същия модул към друг Arduino, танците с тамбурината продължиха. Прекарах много време в търсене на решение на този проблем и почти навсякъде беше посочено или неправилна връзка, или липса на издърпващи резистори на SCL и SDA контактите. Вече исках да вляза в платката с поялник, но в един форум случайно попаднах на код, в който се казваше да свързва SCL и SDA към стандартни I2C портове на Arduino. След стандартна връзка всичко заработи веднага.
Сега за кварца. Не знам какъв кварц са поставили китайците, но часовниците с такъв кварц избягаха с 10-11 секунди на ден. Тази грешка е 5 минути на месец и 1 час на година. Няма нужда от часовник като този. Трябваше да отида отново онлайн и да потърся как да поправя тази грешка. Първото решение, което се появява, казва, че трябва да заземите кварца. Направих го - резултатът беше нулев. Също така намерих някъде, че трябва да намеря стара дънна платка и да махна кварца на часовника от там. Направих го - има резултат. Сега часовникът бяга не с 10-11 секунди, а с 1,5 секунди на ден. Да кажем, че стана по-добре, но далеч не е идеално. Тъй като вече не ми се играе с поялник, беше решено часовникът да се регулира програмно, тоест да се настройва часовникът до желаната стойност веднъж на ден. След 10 дни часовникът се отдалечи с не повече от секунда. Методът е добър, но само когато устройството за синхронизация на Arduino е свързано към захранване, в противен случай часовникът работи на батерия и все още бяга.
Малка тестова програма:

#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68 // SDA A4, SCL A5

Байт decToBcd(байт стойност)
{
връщане ((val/10*16) + (val%10));
}

Байт bcdToDec(байт стойност)
{
връщане ((val/16*10) + (val%16));
}

Void setDateDs1307(байт секунда, // 0-59
байт минута, // 0-59
байт час) // 0-99
{

Wire.write(0);
Wire.write(decToBcd(втори));
Wire.write(decToBcd(минута));
Wire.write(decToBcd(час));
Wire.endTransmission();
}

Void getDateDs1307(байт *втори,
байт *минута,
байт *час)
{

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

Wire.requestFrom(DS1307_I2C_ADDRESS, 3);

*второ = bcdToDec(Wire.read());
*минута = bcdToDec(Wire.read());
*час = bcdToDec(Wire.read());
}

Празна настройка()
{
байт секунда, минута, час;
Wire.begin();
Serial.begin(9600);

Второ = 45;
минута = 5;
час = 16;

SetDateDs1307(секунда, минута, час);
}

void loop()
{
байт секунда, минута, час;

GetDateDs1307(&секунда, &минута, &час);
Serial.print(час, DEC);
Serial.print(":");
Serial.print(минута, DEC);
Serial.print(":");
Serial.println(второ, DEC);

Закъснение (1000);
}


Библиотеката не се използва тук и функциите за време за четене и запис са съкратени.

Сензор за температура и влажност DHT11
За този сензор няма какво да се каже. Дори не бих го използвал, ако не беше необходима влажност. За съжаление не го снимах, когато го получих, така че няма да има снимки. Снимки на сензора могат да се видят по-долу, където го свързах към Arduino. Свързването на сензора е просто (+, цифров изход, -). Обикновено сензорите са направени с четири щифта. При този форм фактор третият щифт не е свързан с нищо.
Можете да използвате библиотеката, за да се свържете с Arduino. Можете да го изтеглите.
Малка тестова програма с извеждане на информация на LCD дисплей 1602:

// включва кода на библиотеката:
#включи
#включи

// Деклариране на обекти
dht11 DHT11;
LiquidCrystal lcd (12, 11, 6, 5, 4, 3);

#define DHT11PIN 7
int i;

Празна настройка()
{
lcd.begin(16, 2);
lcd.print("Състояние: „);
i=0;
}

void loop()
{
int chk = DHT11.read(DHT11PIN);
lcd.setCursor(8, 0);
превключвател (chk)
{
случай 0: lcd.print(“OK“); прекъсване;// lcd.setCursor(11, 0); lcd.print(milis()/2000); прекъсване;
случай -1: lcd.print(“Грешка в контролната сума”); mErr(); прекъсване;
случай -2: lcd.print("Грешка при изчакване"); mErr(); прекъсване;
по подразбиране: lcd.print("Неизвестна грешка"); mErr(); прекъсване;
}
забавяне (500);
lcd.setCursor(15, 0);
превключвател (i)
{
случай 0: lcd.print("^"); lcd.setCursor(15, 1); lcd.print(" "); прекъсване;
случай 1: lcd.print("v"); lcd.setCursor(15, 1); lcd.print(" "); прекъсване;
по подразбиране: lcd.setCursor(15, 1); lcd.print("E"); прекъсване;
}
i=i+1;
ако (i>1) i=0;
lcd.setCursor(0, 1);
lcd.print("H=");
lcd.setCursor(2, 1);
lcd.print((float)DHT11.humidity, 0);
lcd.setCursor(4, 1);
lcd.print("%");
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;
}


Сензорът има някои недостатъци - данните от сензора са само в цели числа, а обхватът е слаб.

Изглежда, че съм писал за всички компоненти. Остава само да съберем всичко в едно цяло.
Опа, почти забравих! За да сглобите устройството, ви е необходим калъф. Поръчах калъфа и от Ebay. Продавачът се оказа от Англия. Пратката пристигна бързо, но не я снимах. Всички снимки на случая са по-долу.

Първо сглобих всичко на масата с помощта на специално окабеляване. Написах тестова програма и я качих на контролера.



Всъщност синият цвят на подсветката е много по-ярък. Дори при минимална яркост (Bright=5) рамката свети.

За да се сглоби всичко безжично, беше решено да се направи мини дънна платка, а на конекторите бяха поставени платки и щитове Arduino. Ако нещо се случи, те могат бързо и лесно да бъдат премахнати. Също така реших да прикрепя LCD екрана и бутоните за управление към конекторите, само за да запоя температурния сензор върху проводниците.
Ето как излезе шалът



На последната снимка не съм отмил напълно флюса. Залепих пореста гума под екраните до съединителите, така че да има поне някаква опора. Въпреки че всъщност екраните в конекторите на контактите се държат добре.

Дънна платка с инсталирани щитове и Arduino платка.

Ето как изглежда пълното свързване с дънната платка


Вместо бутони използвах домашен щит, запоен върху макет. Използвах копчета от стари мишки като копчета.
Както можете да видите, броят на проводниците е намалял.

Основният проблем при поставянето в кутията е да се изреже гладък жлеб за LCD екрана. Колкото и да се опитвах, все не се получаваше перфектно. Пропуските на места бяха малко повече от 1 мм. За да изглежда всичко спретнато, взех черен уплътнител за аквариум и запълних всички пукнатини, като в същото време прикрепих екрана към този уплътнител. След като уплътнителят изсъхна, отрязах излишното от външната страна. При ярка светлина уплътнителят се вижда, но при нормална светлина всичко се слива с тялото.
Ето как изглежда кутията отвътре с инсталиран LCD екран и дънна платка.

Ето как изглежда отвън на ярка светлина (съжалявам за пръстовите отпечатъци, видях ги, когато подреждах снимките).

Дълго мислих как да поставя бутоните в кутията и най-важното какви бутони да използвам...
В магазините за радиоелектроника харесаха бутона с дълъг щифт и върховете, които пасват на този щифт. Тези бутони се използват за запояване към платката. Всичко би било наред, но те имат минус - ходът на натискане е много малък и силен.
Трябваше да поставим бутоните на два етапа: първият беше да поставим бутоните върху дъската, вторият беше да монтираме тази дъска върху друга дъска. И след това поставете всичко това в тялото на водачите.

Ето как изглежда шал с копчета:



Ето как изглежда дъската на държача:


Тук можете да видите водачите, в които се вкарва дъската с бутони. Някои елементи бяха запоени, за да се придаде твърдост на платката.

Сега поставяме всичко в тялото
Без бутони за свързване:


С бутонна връзка:

Затворете кутията и я включете. Всичко работи отлично, бутоните работят както трябва.

В края публикувам кратко видео на устройството, работещо в различни режими:
http://www.youtube.com/watch?v=KsiVaUWkXNA&feature=youtu.be
За тези, които не виждат видеото тук, ето линк към

Време е да приключим с прегледа.
Ще напиша малко за програмата и след това някои кратки заключения. Когато написах програмата, не мислех, че много бързо ще достигна ограничението от 30 720 байта.


Трябваше да оптимизирам кода. Преместих много части от код в подпрограми. Никога не бих си помислил, че оператор switch...case в компилиран вид заема повече място от няколко оператора if...else. Правилното деклариране на променливи също спестява място. Ако декларирате дълъг масив, въпреки че е напълно възможно да получите по байт, тогава преразходът на паметта достига 500 байта, в зависимост от размера на масива. Когато пишете програма, вие не мислите за нея и едва по-късно, когато анализирате програмата, разбирате, че сте направили някои неща грешно и започвате да оптимизирате кода. След като проблемите с размера на програмата бяха разрешени, попаднах на ограничение на RAM. Това се изразяваше във факта, че програмата започна да замръзва след зареждане. Трябваше да въведа подпрограма за изчисляване на свободната RAM памет. В резултат на това бях принуден да изоставя един алгоритъм за прогнозиране на времето, тъй като той трябва да показва икони на екрана. Самият алгоритъм работи, но изходът от иконите трябваше да бъде записан. Все още имам идеи как да оптимизирам кода, но в близко бъдеще ще оставя устройството да работи така, както е, за да оценя ефективността му и да идентифицирам всички грешки.

Сега малко заключения
минуси
1) Цена. Оправданието за този недостатък е, че едно хоби никога не е евтино.

плюсове
1) Голяма функционалност на устройството
2) Увеличаването на функциите е ограничено само от използвания контролер и вашето собствено желание
3) Естетическо удоволствие от съзерцание и морално удовлетворение от факта, че най-накрая сглобих и завърших това устройство

Смятам да си купя +85 Добавяне към любими Ревюто ми хареса +137 +304