Постройте часы с контролем температуры и влажности с помощью LaunchPad
Хотите узнать, как сделать часы с управлением Launchpad »// www.ti.com/ww/en/launchpad/launchpad.html?DCMP=mcu-launchpad&HQS=launchpad" target = "_ blank"> LaunchPad и программное обеспечение разработано в среде разработки Energia IDE.

Список запчастей
- 1 x Оригинал LaunchPad
- 1 x 4-сегментный семисекционный дисплей
- 1 датчик температуры и влажности DHT22
- 1 x DS1307 Часы реального времени
- 1 х 32, 768 кГц Кристалл
- 1 x CR2025 3V Аккумулятор
- 1 х держатель батареи CR2025
- 4 x 2N3906 PNP BJT-транзистор
- 12 x 100R 1 / 4W резистор
- 2 x 2, 2 кОм 1/4 Вт резистор
- Конденсатор 1 x 100nF
- Провода для перемычек
- макетировать
Цепь

Как видно из схемы, есть четыре основных компонента схемы: LaunchPad, DS1307 Real Time Clock, DHT22 Sensor и 4-сегментный семисегментный дисплей.
DS1307 - это ИС реального времени, которая может одновременно предоставлять информацию о времени и дате по шине I2C. Переданные данные включают информацию о часах, минутах, секундах, году, месяце и день. Для DS1307 требуются внешние часы с частотой 32, 768 кГц, которые могут быть предусмотрены кварцевым генератором. Когда основное питание IC сокращается, ИС переключается в режим резервного копирования и продолжает работать в режиме с малым током.

Информация о времени непосредственно считывается с DS1307 с помощью внутреннего модуля I2C для LaunchPad. Для этой цели используется библиотека RTCLib. Соединение между RTC и LaunchPad выполняется по линиям SCL (P1.6) и SDA (P1.7), как показано на схеме. Эти линии подключаются к VCC через резисторы R2 и R3 с сопротивлением 2, 2 кОм для правильной работы I2C.
Для DS1307 требуется напряжение питания 5 В. Так как LaunchPad не обеспечивает выход 5 В, используется внешний адаптер переменного тока 5 В переменного тока. Кабель CR2025 3V подключается к выходу VBAT DS1307 в качестве резервного источника питания, который может длиться несколько лет.
В нашем приложении у нас нет внешних элементов управления для установки даты и времени DS1307. Чтобы предоставить текущую информацию о дате и времени DS1307, мы используем следующую команду:
RTC.adjust (DateTime (__ DATE__, __TIME__));
Эта команда получает текущую дату и время ПК программиста в качестве входа и устанавливает DS1307 после загрузки эскиза. Он должен быть прокомментирован после первой загрузки и использоваться только тогда, когда требуется новая настройка.
Датчик температуры и влажности цепи - DHT22, также известный как AM2302. DHT22 обменивается данными по последовательной шине данных. Когда микроконтроллер отправляет стартовый бит, DHT22 передает 40-битный пакет данных, который включает относительную влажность и информацию о температуре. В нашей заявке мы использовали библиотеку DHT22, адаптированную к Energia для сбора информации из DHT22.

Другим основным компонентом схемы является четырехзначный семисегментный дисплей. Время, температура и информация относительной влажности отображаются на дисплее. Так как сегментные линии являются общими для всех четырех цифр, следует использовать метод мультиплексирования. В этом методе мы включаем только одну цифру за раз, используя PNP-транзистор 2N3906 в качестве коммутатора. Цифры включаются и выключаются последовательно через 3 мс. Поскольку это действие достаточно быстро, человеческий глаз не может распознать последовательность и видеть, как все четыре цифры включены. Чтобы ограничить токи сегментов светодиодов, 100-омные резисторы подключаются последовательно.

Программное обеспечение
Программное обеспечение приложения построено в среде Energia IDE, и оно представлено ниже. Программа работает в цикле, включая действия ниже;
- Инициализировать доску
- Прочтите время от DS1307
- Покажите время на некоторое время
- Прочтите данные о относительной влажности и температуре
- Покажите температуру на некоторое время
- Покажите относительную влажность на некоторое время.
Эскиз Energia включает комментарии для разъяснения каждого шага. Пожалуйста, не стесняйтесь задавать свои вопросы в разделе комментариев.
#include "Wire.h" #include "RTClib.h" #include "DHT22_430.h" #define DHTPIN P2_6 RTC_DS1307 RTC; DHT22 mySensor(DHTPIN); unsigned long timestamp; unsigned int clockduration = 0; unsigned int tempduration = 0; unsigned int humduration = 0; // Seven Segment Display driver function void displaydigit (int value, int digit, boolean dot) { // Create each digit by turning on and off LED segments P1OUT |= 0b00011111; P2OUT |= 0b00111000; switch (value) { case 0: P1OUT &= 0b11100100; P2OUT &= 0b11001111; break; case 1: P1OUT &= 0b11111111; P2OUT &= 0b11001111; break; case 2: P1OUT &= 0b11100101; P2OUT &= 0b11010111; break; case 3: P1OUT &= 0b11110101; P2OUT &= 0b11000111; break; case 4: P1OUT &= 0b11111110; P2OUT &= 0b11000111; break; case 5: P1OUT &= 0b11110100; P2OUT &= 0b11100111; break; case 6: P1OUT &= 0b11100100; P2OUT &= 0b11100111; break; case 7: P1OUT &= 0b11111101; P2OUT &= 0b11001111; break; case 8: P1OUT &= 0b11100100; P2OUT &= 0b11000111; break; case 9: P1OUT &= 0b11110100; P2OUT &= 0b11000111; break; case 10: P1OUT &= 0b11111111; P2OUT &= 0b11111111; break; case 11: P1OUT &= 0b11111100; P2OUT &= 0b11010111; break; case 12: P1OUT &= 0b11101100; P2OUT &= 0b11010111; break; } // Turn on/off the dot LED if (dot) P1OUT &= 0b11111011; else P1OUT |= 0b00000100; // Turn on the selected digit digitalWrite(P1_5, HIGH); digitalWrite(P2_0, HIGH); digitalWrite(P2_1, HIGH); digitalWrite(P2_2, HIGH); switch (digit) { case 1: digitalWrite(P1_5, LOW); break; case 2: digitalWrite(P2_0, LOW); break; case 3: digitalWrite(P2_1, LOW); break; case 4: digitalWrite(P2_2, LOW); break; } } void setup() // Set the port directions P1DIR void loop() { // Read and display the time while (clockduration = micros()); if (now.hour()/10) displaydigit((now.hour()/10), 1, 0); else displaydigit(10, 1, 0); delay(3); if (now.second()%2) displaydigit((now.hour()), 2, 1); else displaydigit((now.hour()), 2, 0); delay(3); displaydigit((now.minute()/10), 3, 0); delay(3); displaydigit((now.minute()), 4, 0); clockduration+; } displaydigit(10, 1, 0); displaydigit(10, 2, 0); displaydigit(10, 3, 0); displaydigit(10, 4, 0); // Read and display the temperature and the relative humidity mySensor.get(); int32_t h = mySensor.humidityX10(); int32_t t = mySensor.temperatureX10(); while (tempduration <= 300) { delay(3); displaydigit(t/100, 1, 0); delay(3); displaydigit((t/10), 2, 1); delay(3); displaydigit(t, 3, 0); delay(3); displaydigit(11, 4, 0); tempduration+; } while (humduration <= 300) { delay(3); displaydigit(h/100, 1, 0); delay(3); displaydigit((h/10), 2, 1); delay(3); displaydigit(h, 3, 0); delay(3); displaydigit(12, 4, 0); humduration+; } clockduration=0; tempduration=0; humduration=0; }
Код Energia
Попробуйте этот проект сами! Получить спецификацию.