Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Типизация данных в lua не обязательна. В синтаксисе разбиение на строки не имеет значения, как и точка с запятой. ⇐ ПредыдущаяСтр 2 из 2
Следующие 3 записи абсолютно эквивалентны: · a = 1 b = a*2 · a = 1; b = a*2; · a = 1 b = a*2 Пример базового когда на NodeMCU: gpio.mode(pin, gpio.OUTPUT) -- переключение GPIO на вход или выход tmr.alarm(0, duration, 1, function () -- выполнение функции по расписанию gpio.write(pin, status)
СПЕЦИАЛЬНАЯ ЧАСТЬ Общая постановка задачми
Требования для данного устройства: · Подключение к маршрутизатору через Wi-Fi (проводное соединение недопустимо). · Управление мощными бытовыми приборами. · Управление через веб-интерфейс. · Поддержка протокола MQTT. · Максимально низкая себестоимость, но не в убыток качеству.
Структурная и функциональная схема программы
Описание модулей Умная Розетка состоит из четырех основных элементов: · Платформа Esp, отдает команды реле, принимает и отправляет данные и проводит вычисления. · Преобразователь уровней, позволяет через слабые выходы Esp включать и выключать электромагнит реле. · Реле, управляет нагрузкой · Источник питания для вышеперечисленных модулей. В двух образцах использованы модули разных ценовых категорий, первый вариант – максимально удешевленный, второй – все компоненты собраны сбалансировано, качественно и без лишних затрат. Сравнение платформ Esp, использованных в образцах:
Преобразователь логических уровней в упрощеной модели сделан на основе транзистора и пары резисторой, что делает его стоимость равной паре центов. В оптимальной моделе используется многоканальный двунаправленный преобразователь 3.3-5В, стоимостью $0.70. Реле – электромеханический модуль, а следовательно, подвержен износу. Поэтому нет смысла максимально экономить на реле, от его качества зависит долговечность всей конструкции. Хорошим выбором является реле с управляющим напряжением 5 В и коммутирующей нагрузкой 220 В 10 А, стоимостью $0.5. Источник питания также является модулем, экономия на котором может пагубно отразиться на готовом продукте. При выборе источника питания есть нюанс: если в начале эксплуатации он выдает заявленный производителем ток без просадок по напряжению, обладает низкими пульсациями напряжения и не перегревается, то этот модуль врядли выйдет из строя ближайший десяток лет, так как ломаться там не чему. В дешевой модели используется блок питания от зарядного устройства, что крайне ненадежно. Силовые контакты оголены, а пульсации напряжения достигают 40 мВ. В оптимальной модели применен компактный блок питания на 5 В 600 мА, полщадью не превышающий плату lolin v3. Это лучший кандидат со всего рынка, учитывая цену, размер и качество. Такой блок питания обойдется в $2. Выше были приведены розничные цены с учетом доставки.
Рис 1.
Электроника для удешевленного варианта обошлась в $3, но данный прототип нельзя назвать успешным.
рис. 2 Образец с оптимальной схемой обойдется в $ 6.1.
Программная инициализация будет выглядеть так: // Arduino MEGA LiquidCrystal lcd(22, 23, 24, 25, 26, 27); // Arduino UNO LiquidCrystal lcd(4, 5, 8, 9, 10, 11);
Температура, влажность DHT11.. Подключение датчика температуры и влажности DHT11 (SainSmart). Датчик расположите лицевой стороной вверх, выводы будут описаны слева направо.
Программная инициализация #define DHTPIN 2 // цифровой пин Digital pin 2 (PWM) #define DHTTYPE DHT11 // см. DHT.h
// инициализация DHT dht(DHTPIN, DHTTYPE);
Барометр BMP180. Подключение датчика атмосферного давления BMP180 (барометр) + температура по интерфейсу I2C/TWI.
Для UNO: A4 (SDA), A5 (SCL). // инициализация Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085); // sensorID
Таблица 1 - Модули используемые в проекте
2.4 Таблица идентификаторов Идентификаторов - это уникальный признак объекта, позволяюший различать объекты или объект различающий объекты по идентификатору. Таблица 2 -Таблица идентификаторов
ЗАКЛЮЧЕНИЕ В итоге данного курсового проекта была разработан проект на сонове микрокантроллера Arduino.Были выполнены все цели и задачи, поставленные перед началом данного проекта. Данный проект полностью работоспособен и совместим на различных операционных системах. В итоге всего получилась метеостанция, измеряющая температуру, давление, влажность и выводящая все результаты на дисплей. CПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ 1. ВикипедиЯ/материал на тему «Метеостанция»
ПРИЛОЖЕНИЕ А ТЕХНИЧЕСКОЕ ЗАДАНИЕ
Настоящее техническое задание распространяется на метеостанцию. Бытовые метеостанции позволяют получать точные показания о температуре и влажности в помещении и за окном (как правило, только цифровые метеостанции), измерять атмосферное давление, анализировать динамику изменения атмосферного давления, на основании которого самостоятельно делать прогноз погоды на 6-36 часов (только цифровые). Цифровые метеостанции имеют возможность подключения дополнительных беспроводных датчиков, которые будут передавать информацию о температуре (иногда и влажности) в помещениях вашего дома, гараже или улице в радиусе их действия. 1 Основание для разработки Проект разрабатывается для демонстрации возможностей компилятора Arduino IDE микроконтроллера Arduino, а также показывает, что можно добиться превосходного результата не используя различные важнейшие конструкции.
2 Назначение разработки Основным назначением проекта является демонстарция огромнейшего потенциала микроконтроллера Arduino.
3 Требование к программе и программному изделию 3.1Требования к функциональным характеристикам: - Своевременное отображение данных на дисплее; - Удобный интерфейс и легкая возможность отключения питания; - Удобноемодернизирование; 3.2 Требования к надежности: - Предусмотреть контроль полученной информации о погодных условиях; - Предусмотреть блокировку некорректных действий пользователя; 3.3Требования к составу и параметрам технических средств:
ПРОДОЛЖЕНИЕ ПРИЛОЖЕНИЯ А
3.5 Требования к транспортированию и хранению Хранить и транспортировать проект нужно в влагозащитном чехле.
Таблица 1.А – Этапы и стадии разработки
ПРИЛОЖЕНИЕ Б РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
Для включения метеостанции, необхадимо нажать тактовую кнопу сбоку проекта. При повторном нажатии метеостация будет отключаться. Так же с другого бока есть потенциометр для регулировки контрасности текста на дисплее метеостанции. Мтеостанция нуждается в смене питания каждые 3-4 недели, в зависимости от частоты использования. Необходимая батарея «Крона».
ПРИЛОЖЕНИЕ В ЛИСТИНГ ПРОГРАММЫ
/* СОЕДИНЕНИЯ Подключение датчика температуры-влажности DHT11 --- - OUT > цифровой пин 9 - " +" > +3V (+5V) - " -" > GND Подключение датчика давления-температуры BMP085 --- - VCC > 3.3V; (поддерживается 1.8 - 3.6 В) - GND > GND - SDA > аналоговый пин A4 - SCL > аналоговый пин A5 Детектор газа -------------------------------------- - A0 - VCC - GND ЖКИ ------------------------------------------------ - LCD RS > к цифровым выводам 12 - 8 - LCD Enable > к выводам 11 - 9 - LCD D4 > к выводам 5 - 4 - LCD D5 > к выводам 4 - 5 - LCD D6 > к выводам 3 - 6 - LCD D7 > к выводам 2 - 7 - LCD R/W > GND - 10K резистор между +5V и землёй - сброс > к LCD VO (пин 3) */ // Подключение библиотек: #include < dht11.h> // датчика температуры-влажности #include < LiquidCrystal.h> // LCD #include < Wire.h> // датчика BMP085 #include < MQ135.h> // газовый детектор MQ135
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); /* соединение LCD-шилда \x## - для вывода кириллических символов, где ## - номера символов в таблице */ dht11 sensorTempHumid; // датчик температуры и влажности MQ135 gasSensor = MQ135(A0); // датчик газа #define RZERO 76.63 float rzero; // показания с датчика газа float ppm;
int del = 5000; // задержка, мс
/* Oversampling Setting (OSS) - настройки разрешения для датчика давления BMP085, см. https: //www.sparkfun.com/tutorials/253 OSS может быть 0, 1, 2 или 3: 0 - ультранизкое потребление, низкое разрешение; 1 - стандартное потребление; 2 - высокое разрешение; 3 - ультравысокое разрешение и максимальное потребление. */ const unsigned char OSS = 0;
// Калибровочные переменные для BMP085: int ac1; int ac2; int ac3; unsigned int ac4; unsigned int ac5; unsigned int ac6; int b1; int b2; int mb; int mc; int md; long b5;
float temperature; // температура long pressure; // давление
// Для прогноза: const float p0 = 101325; // давление на уровне моря, Па. const float currentAltitude = 179.5; // высота погодной станции над уровнем моря, м; const float ePressure = p0 * pow((1 - currentAltitude/44330), 5.255); // нормальное давление на данной высоте, Па. float weatherDiff;
#define DHT11PIN 9 // пин 9 датчика DHT11. #define BMP085_ADDRESS 0x77 /* I2C адрес датчика BMP085; см. https: //www.sparkfun.com/tutorials/253 */
void setup() { lcd.begin(16, 2); // инициализация ЖК Wire.begin(); // инициализация I2C bmp085Calibration(); // калибровка датчика BMP085 }
void loop() { // Проверка датчика давления-влажности: int chk = sensorTempHumid.read(DHT11PIN);
switch (chk) { case DHTLIB_OK: lcd.clear(); break; case DHTLIB_ERROR_CHECKSUM: lcd.clear(); lcd.print(" Checksum error" ); delay(del); return; case DHTLIB_ERROR_TIMEOUT: lcd.clear(); lcd.print(" Time out error" ); delay(del); return; default: lcd.clear(); lcd.print(" Unknown error" ); delay(del); return; }
// Считываем с датчика BMP085: temperature = bmp085GetTemperature(bmp085ReadUT()); temperature *= 0.1; pressure = bmp085GetPressure(bmp085ReadUP()); pressure *= 0.01;
// Разница давлений для вычисления простого прогноза weatherDiff = pressure - ePressure;
rzero = gasSensor.getRZero(); ppm = gasSensor.getPPM();
// ЖК: lcd.setCursor(0, 0); // курсор на строку 1, поз. 1; //lcd.print(" p = " ); lcd.print(pressure*3/4); // Па -> мм рт.ст. lcd.print(" mmHg " ); // мм рт.ст.
// " Прогноз": if(weatherDiff > 250) lcd.print(" Sun" ); else if ((weatherDiff < = 250) || (weatherDiff > = -250)) lcd.print(" Cloudy" ); else if (weatherDiff > -250) lcd.print(" Rain" );
lcd.setCursor(0, 1); // переход на строку 2 //lcd.print(" t=" ); lcd.print(temperature, 1); lcd.print(" C " );
//lcd.print(" f=" ); lcd.print(sensorTempHumid.humidity); lcd.print(" % " );
lcd.print(ppm);
//lcd.print(" t=" ); //lcd.print(sensorTempHumid.temperature); //lcd.print(" C " );
delay(del); lcd.clear(); }
// ВЫЧИСЛЕНИЕ ДАВЛЕНИЯ
// Функция получает калибровочные значения для BMP085 // и должна быть запущена в начале. 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); }
// Вычисление нескомпенсированной температуры. // Возврашает значение в десятых долях градуса Цельсия. |
Последнее изменение этой страницы: 2019-06-19; Просмотров: 147; Нарушение авторского права страницы