MEGA2560 + ИП-512 + Оптическая развязка.
- Войдите на сайт для отправки комментариев
Добрый день.
Прошу сразу не кидать камнями, а направить на путь истинный.
Пробелма такая есть у меня датчики ИП512 решил их попробовать подключить к Arduino на аналоговые порты через оптическую развязку.
Прикупил вот такой модуль в надежде не сжечь микроконтроллер.
Подключил 5В на OUT и GND. С датчиков соответственно управляющий сигнал + и GND. Земля у меня общая, т.к. все питается от одного БП (компьютерного).
На момент запуская все работало исправно, т.е. При сработке пожарного датчика на входе оптической развязки напряжение с 12 В падает до 6 В, но на выходе оптической развязки тоже падало в половину... При этом показания на A0-A3 скакали примерно в 512-ом диапазоне +-4. А теперь соответсвенно 1022-1023 вне зависимости от состояния пожарного датчика. Вроде схема подключения до боли понятная. Сопротивления мерял, все как на схеме.
Через некоторое время система перестала реагировать на изменения напряжения на IN. Т.е. пожарный датчик при сработке на управляющем шлейфе понижал напряжение до 6 В но на выводе с оптической развязки так и висит 5 В. А при обрыве линии должно быть 0 В, а оно всеравно не 0 В на OUT :-(
С теорией у меня туго. Максимум знания закона Ома на уровне U=I*R. Многие скажут что этого достаточно, но нет блин. Что я делаю не так?
P.S. Я обратил также внимание, что пока контроллер питался от двух источников 5В оно работало (хотя это не верно). А когда переключил контроллер на 12 В перестало работать (по ощущениям). Может нужно подпаять еще и делитель напряжения? Либо "прикупить" оптическую развязку с другими сопротивлениями? Но с какими?
Скейтч очень большой и разбит на модули. Я даже не знаю есть ли смысл его приводить здесь весь. Остальные модули работают исправно, есть правда не частые проблемы с DS18B20, но это думаю качество их производства...
/************************************************************** Проект создания мини системы умного дома, с двумя блоками реле, фотодиодными развязками, PID регулированием системы отопления, охранно-пожарной сигнализации, дачиков движения для управления освещением технических помещений и других вещей. Управление узлами системы выполняется через клиент-серверное приложение Blynk. Старт проекта 20.08.2018 г. ************************************************************** ПРИМЕЧАНИЕ: Проект разрабатывался для платы Arduino MEGA 2560. В проекте были применены только готовые компоненты и платы, которые можно купить в магазинах типа AliExpress. С минимальным применением паяльника. ВНИМАНИЕ: Код программы представлен "как есть". Автор не несёт ответственности за порчу имущества и иные последствия от применения кода программы. **************************************************************/ #define BLYNK_PRINT Serial // Закоментируйте, чтобы сохранить место в RAM и отменить печать в COM //#define BLYNK_DEBUG // Вывод отладочной иформации в COM. Требует много РЕСУРСОВ! #include <SPI.h> #include <Ethernet.h> // Библиотека для работы с Ethernet контроллером #include <BlynkSimpleEthernet.h> // Библиотека для работы Blynk по Ethernet #include <NTPClient.h> // NTP клиент для синхронизации времени #include <EthernetUdp.h> // поддержка протокола UDP #include <Time.h> #include <TimeLib.h> #include <Adafruit_Sensor.h> // Библиотека для работы с сеносорами движения #include <DHT.h> // Библиотека для работы с датчиками влажности и температуры #include <DHT_U.h> //#include <SimpleTimer.h> // Библиотека для работы с прерываниями #include <PID_v1.h> // Библиотека ПИД регулятора для отопления #include <OneWire.h> // Библиотека для работы с пртоколом Wire-1 #include <DallasTemperature.h> // Библиотека для облегчения работы с датчиками Dallas #include <Wire.h> // Библиотека для работы с шиной I2C #include <Adafruit_BMP085.h> // Библитоека для работы с датчиком давления // PIN-ы подключения SSD-реле термоголовк отопления. // Зарезервированы PIN-ы с 2 по 9 с функцией PWM (ШИМ) (см. manual к плате)!!! // Использованы для PID регулирования отоплением. // Цель использования связан с возможностью плавно регулировать тока // на термоголовках коллектора, что позволит плавно регулировать подачу // теплоносителя в систему. // Данные об установленной температуре беруться с APP Blynk с виртуальных // пинов V0..V7 #define SSDPIN1 5 // Батареи контур 1 Спальня #define SSDPIN2 4 // Батареи контур 2 Детская #define SSDPIN3 3 // Теплый пол контур 3 Гостиная #define SSDPIN4 2 // Теплый пол контур 4 Прихожая #define SSDPIN5 8 // Теплый пол контур 5 Гостиная #define SSDPIN6 9 // Теплый пол контур 6 Гараж #define SSDPIN7 7 // Теплый пол контур 7 Гараж #define SSDPIN8 6 // Реле котла // PIN подключения цифровых датчиков температуры // необходимых для мониторинга состояния теплоносителя в системе // смесительного узла COMBI MIX. // Питание для датчиков DS18B20 рекомендуется взять от 3,0 до 5,5В #define ONE_WIRE_BUS 14 // PIN подключения датчиков температуры по Wire-1 #define TEMPERATURE_PRECISION 12 // Разрешение темпераутары от 9 до 12 бит. // Подключаем VCC для BMP085 сонсара на 3.3V (Нельзя на 5.0V!) // Подключаем GND на землю // Подключаем SCL на i2c clock для MEGA2560 PIN 21 // Подключаем SDA на i2c data для MEGA2560 PIN 20 // EOC is not used, it signifies an end of conversion // XCLR is a reset pin, also not used here Adafruit_BMP085 BMP; // Определим объект BMP // PIN-ы подключения датчиков DHT (температура и влажность). // Зарезервированы PIN-ы с 22 по 31. Данные о температуре // отдаются в APP Blynk на виртульаные пины. // Температура V11..V20 влажность V21..V30 соотвественно. // Обработка событий описана на закладке DHT. #define DHTPIN1 22 // Улица #define DHTPIN2 23 // Спалня #define DHTPIN3 24 // Детская #define DHTPIN4 25 // Гостиная #define DHTPIN5 26 // Коридор #define DHTPIN6 27 // Гараж #define DHTPIN7 28 // #define DHTPIN8 29 // #define DHTPIN9 30 // #define DHTPIN10 31 // // PIN-ы подключения датчиков PIR (движения). // Зарезервированы PIN-ы с 32 по 41. #define PIRPIN1 32 // Коридор #define PIRPIN2 33 // Гардероб #define PIRPIN3 34 // Туалет #define PIRPIN4 35 // #define PIRPIN5 36 // #define PIRPIN6 37 // #define PIRPIN7 38 // #define PIRPIN8 39 // #define PIRPIN9 40 // #define PIRPIN10 41 // // PIN-ы подключения SSR-реле управления объектами. // Зарезервированы PIN-ы с 42 по 49. В APP Blynk для управления реле // необходимо использовать виртуальные пины c V42 по V49 соотвественно. // Обработка событий описана на вкладе SSR. #define SSRPIN1 42 // Ворота #define SSRPIN2 43 // Калитка #define SSRPIN3 44 // Ставни #define SSRPIN4 45 // Подсветка забора #define SSRPIN5 46 // #define SSRPIN6 47 // #define SSRPIN7 48 // #define SSRPIN8 49 // // PIN-ы подключения датчиков пожарной сигнализации ИП-512-45 // Зарезервированы аналоговые PIN-ы с A0 по A7. // В функции OPS необходимо закоментировать не используемые // PIN-ы, иначе будут постоянные ложные срабатывания. #define OPSPIN1 A0 //Определим PIN для датчика ОПС #define OPSPIN2 A1 //Определим PIN для датчика ОПС #define OPSPIN3 A2 //Определим PIN для датчика ОПС #define OPSPIN4 A3 //Определим PIN для датчика ОПС #define OPSPIN5 A4 //Определим PIN для датчика ОПС #define OPSPIN6 A5 //Определим PIN для датчика ОПС #define OPSPIN7 A6 //Определим PIN для датчика ОПС // PIN-ы с 50 по 53 использованы под шину SPI! #define DHTTYPE DHT22 // Установим тип датчиков DHT 22 (AM2302) #define W5100_CS 10 // PIN вызова Ethernet контроллера // Инициализируем датчики температуры и влажности DHT dht1(DHTPIN1, DHTTYPE); DHT dht2(DHTPIN2, DHTTYPE); DHT dht3(DHTPIN3, DHTTYPE); DHT dht4(DHTPIN4, DHTTYPE); DHT dht5(DHTPIN5, DHTTYPE); DHT dht6(DHTPIN6, DHTTYPE); DHT dht7(DHTPIN7, DHTTYPE); DHT dht8(DHTPIN8, DHTTYPE); DHT dht9(DHTPIN9, DHTTYPE); DHT_Unified dht10(DHTPIN10, DHTTYPE); // Создаем объект OneWire OneWire oneWire(ONE_WIRE_BUS); // Для чтения датчиков темпертауры DS // Создаем объект DallasTemperature для работы с сенсорами, передавая ему ссылку на объект для работы с 1-Wire. DallasTemperature dallasSensors(&oneWire); // Специальный объект для хранения адресов устройств DS DeviceAddress addT1 = { 0x28, 0xC7, 0x03, 0x43, 0x98, 0xFF, 0x00, 0xAE }; // Котёл DeviceAddress addT2 = { 0x28, 0xE0, 0x1E, 0x43, 0x98, 0x18, 0x00, 0x16 }; // Горячий контур DeviceAddress addT3 = { 0x28, 0x90, 0x01, 0x43, 0x98, 0x18, 0x00, 0x9D }; // DeviceAddress addT4 = { 0x28, 0xA5, 0x26, 0x43, 0x98, 0x17, 0x00, 0x2A }; // DeviceAddress addT5 = { 0x28, 0xE1, 0x01, 0x43, 0x98, 0x21, 0x00, 0xAD }; // // Определяем объекты таймер для нужных классов //SimpleTimer timerDHT; // Объект таймер для датчиков влажности и температуры //SimpleTimer timerBMP; // Объект таймер для датчика атм.давления и температуры //SimpleTimer timerOPS; // Объект таймер для датчиков ОПС BlynkTimer timer; // Определим объект таймер, поддерждивает до 16 таймеров одновременно // Вы должны получить Auth Token в приложении Blynk. // Перейдите в Настройки проекта (значок гайки). //char auth[] = "b3e641bee******************c268f4"; //Arduino UNO тест на стенде char auth[] = "345feecc*********************1ec"; //Arduino MEGA IPAddress server_ip (192, 168, 0, 50); // ВНИМАНИЕ, MAC адрес должен отличаться для каждого устройства в локальной сети // Определеим значения переменных для инициализации Blynk клиента byte arduino_mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xE1 }; IPAddress arduino_ip ( 192, 168, 0, 177); IPAddress dns_ip ( 192, 168, 0, 1); IPAddress gateway_ip ( 192, 168, 0, 1); IPAddress subnet_mask( 255, 255, 255, 0); // Определим объект поддержки протокола UDP EthernetUDP ntpUDP; // Определим объект клиента NTP по протоколу UDP (для чтения данных с сервера времени) NTPClient timeClient(ntpUDP, "192.168.0.1", 18000, 60000); //Bridge widget цепляем на виртуальный пин V1????? //WidgetBridge bridge1(V1); //static bool value = true; //Terminal widget цепляем на виртуальный пин V127 WidgetTerminal terminal(V127); // Определим переменные ввода/вывода для ПИД регуляторов // Важно опредлится с количеством зон отопления требующих регулировки // ПОМНИТЕ, что в одном помещении может быть несолько контуров теплых полов! // в моём примере 3 зоны теплых полов и 2 зоны радиаторов double Input, Output; // Опредлеим пропорциональный, интегральный и диференциальный коэфф. // Чтобы тонко настроить систему коэфф. необходимо подбирать опытным путем // Kp - пропорциональный коэфициент // Ki - интегральный коэффициент // Kd - дифференциальный коэффициент double Kp=18, Ki=14.5, Kd=3.48; // Температуры заданные для зон обогрева, значенится беруться с APP Blynk виджета // смотрите вкладку PID, функцию BLYNK_WRITE(V0) и ниже double SetTEMPZ1, SetTEMPZ2, SetTEMPZ3, SetTEMPZ4, SetTEMPZ5; double SetTEMP_T1; // Температура теплоносителя (не реализовано) // Массив температур теплоностиеля для диапазон температуры на улице от +20 до -30 гр.С // Значений 0..50 шт. Чем ниже строка, тем климат должен быть холоднее. Раскоментируйте один нужный! //byte Tboil4[] = {20, 21, 22, 23, 24, 25, 26, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49}; //byte Tboil4[] = {20, 21, 23, 24, 25, 26, 28, 29, 30, 30, 31, 32, 33, 33, 34, 34, 35, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53}; byte Tboil4[] = {20, 21, 23, 24, 26, 27, 29, 30, 32, 33, 34, 34, 35, 36, 37, 38, 39, 39, 40, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57}; //byte Tboil4[] = {20, 22, 24, 25, 27, 29, 31, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 60}; //byte Tboil4[] = {20, 22, 25, 27, 30, 32, 35, 37, 40, 41, 42, 43, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 56, 57, 58, 59, 59, 60, 61, 62, 63, 64, 64, 65, 66, 67, 67, 68, 69, 70, 71, 72, 72, 73, 74, 75, 76, 77, 77, 78}; //byte Tboil4[] = {20, 23, 26, 28, 31, 34, 37, 39, 42, 43, 45, 46, 47, 48, 50, 51, 53, 54, 55, 56, 58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 71, 72, 73, 74, 75, 76, 77, 78, 78, 79, 80, 81, 82, 83, 83, 84}; //byte Tboil4[] = {20, 23, 26, 29, 32, 35, 38, 41, 44, 45, 47, 48, 50, 51, 53, 54, 56, 57, 59, 60, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 84, 85, 86, 87, 87, 88, 89, 90}; //byte Tboil4[] = {20, 23, 27, 30, 33, 36, 40, 43, 46, 47, 49, 51, 53, 54, 56, 57, 59, 61, 63, 64, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 84, 85, 86, 87, 88, 89, 90, 90, 90, 90, 90, 90, 90, 90, 90}; // создадим объект ПИД регулятора PID myPID0(&Input, &Output, &SetTEMP_T1, 100, 500, 50, DIRECT); // ПИД регулятор Котла int WindowSize = 5000; // окно регулирования ПИД для SSR реле, в мс unsigned long windowStartTime; // перменная использования mills() для реле SSD PID myPID1(&Input, &Output, &SetTEMPZ1, Kp, Ki, Kd, DIRECT); // ПИД регулятор Спальни PID myPID2(&Input, &Output, &SetTEMPZ2, Kp, Ki, Kd, DIRECT); // ПИД регулятор Детской PID myPID3(&Input, &Output, &SetTEMPZ3, Kp, Ki, Kd, DIRECT); // ПИД регулятор Гостиной PID myPID4(&Input, &Output, &SetTEMPZ4, Kp, Ki, Kd, DIRECT); // ПИД регулятор Прихожей PID myPID5(&Input, &Output, &SetTEMPZ5, Kp, Ki, Kd, DIRECT); // ПИД регулятор Гаража // Функция возвращает строку дата/время в формате 10.12.2018 01:25:59 // Используется для логирования событий в Терминале Blynk String DataTime() { String sDay = String(day(timeClient.getEpochTime())); if (sDay.length() == 1) {sDay += "0" + sDay;} String sMonth = String(month(timeClient.getEpochTime())); if (sMonth.length() == 1) {sMonth += "0" + sMonth;} String result = sDay + "." + sMonth + "."; result += String(year(timeClient.getEpochTime())) + " " + String(timeClient.getFormattedTime()); return result; } BLYNK_CONNECTED() { // Обязательная синхронизация с виджета APP Blynk всех установленных Blynk.syncAll(); // параметров по vPIN. } void setup() { pinMode(SSDPIN1, OUTPUT); // Инициируем PIN управления SSD-реле pinMode(SSDPIN2, OUTPUT); pinMode(SSDPIN3, OUTPUT); pinMode(SSDPIN4, OUTPUT); pinMode(SSDPIN5, OUTPUT); pinMode(SSDPIN6, OUTPUT); pinMode(SSDPIN7, OUTPUT); pinMode(SSDPIN8, OUTPUT); pinMode(DHTPIN1, INPUT); // Инициируем PIN датчиков температуры и влажности pinMode(DHTPIN2, INPUT); pinMode(DHTPIN3, INPUT); pinMode(DHTPIN4, INPUT); pinMode(DHTPIN5, INPUT); pinMode(DHTPIN6, INPUT); pinMode(DHTPIN7, INPUT); pinMode(DHTPIN8, INPUT); pinMode(DHTPIN9, INPUT); pinMode(DHTPIN10, INPUT); pinMode(PIRPIN1, INPUT); // Инициируем PIN датчиков движения pinMode(SSRPIN1, OUTPUT); // Инициируем PIN управления SSR-реле digitalWrite(SSRPIN1, HIGH); pinMode(SSRPIN2, OUTPUT); digitalWrite(SSRPIN2, HIGH); pinMode(SSRPIN3, OUTPUT); digitalWrite(SSRPIN3, HIGH); pinMode(SSRPIN4, OUTPUT); digitalWrite(SSRPIN4, HIGH); pinMode(SSRPIN5, OUTPUT); digitalWrite(SSRPIN5, HIGH); pinMode(SSRPIN6, OUTPUT); digitalWrite(SSRPIN6, HIGH); pinMode(SSRPIN7, OUTPUT); digitalWrite(SSRPIN7, HIGH); pinMode(SSRPIN8, OUTPUT); digitalWrite(SSRPIN8, HIGH); pinMode(OPSPIN1, INPUT_PULLUP); // Инициируем PIN датчиков ОПС с подтягивающим резистором pinMode(OPSPIN2, INPUT_PULLUP); pinMode(OPSPIN3, INPUT_PULLUP); pinMode(OPSPIN4, INPUT_PULLUP); pinMode(OPSPIN5, INPUT_PULLUP); pinMode(OPSPIN6, INPUT_PULLUP); pinMode(OPSPIN7, INPUT_PULLUP); Serial.begin(9600); // Подключаемся к серверу Blynk Blynk.begin(auth, server_ip, 8080, arduino_ip, dns_ip, gateway_ip, subnet_mask, arduino_mac); if (Blynk.connected()) { terminal.clear(); terminal.println("Подключаемся к серверу Blynk..."); terminal.flush(); terminal.print("BLYNK: Client "); terminal.print(arduino_ip); terminal.print(" -> Server "); terminal.print(server_ip); terminal.println(":8080"); terminal.flush(); terminal.println("BLYNK: Успешно!");} else {Serial.println("BLYNK: Ошибка первичного подключения к серверу.");} terminal.flush(); terminal.print("ARDUINO MEGA2560: "); terminal.flush(); terminal.print("Загрузка и настройка параметров системы."); terminal.flush(); // создаем объект клиента NTP timeClient.begin(); timeClient.update(); terminal.print("Системное время: "); terminal.println(DataTime()); terminal.flush(); // Инициализируем датчики DHT terminal.println("DHT: Запущен объект опроса датчиков DHT-22..."); terminal.flush(); dht1.begin(); dht2.begin(); dht3.begin(); dht4.begin(); dht5.begin(); dht6.begin(); dht7.begin(); dht8.begin(); dht9.begin(); dht10.begin(); terminal.println("DHT: Запущен объект опроса датчиков DHT-22..."); terminal.flush(); sensor_t sensor; dht10.temperature().getSensor(&sensor); terminal.println("------------------------------------"); terminal.println("Температура");terminal.flush(); terminal.print ("Сенсор: "); terminal.println(sensor.name);terminal.flush(); terminal.print ("Вер.драйвера:"); terminal.println(sensor.version);terminal.flush(); terminal.print ("Уникал. ID: "); terminal.println(sensor.sensor_id);terminal.flush(); terminal.print ("Макс. знач.: "); terminal.print(sensor.max_value); terminal.println(" гр.C");terminal.flush(); terminal.print ("Мин. знач.: "); terminal.print(sensor.min_value); terminal.println(" гр.C");terminal.flush(); terminal.print ("Разрешение: "); terminal.print(sensor.resolution); terminal.println(" гр.C");terminal.flush(); terminal.println("------------------------------------");terminal.flush(); dht10.humidity().getSensor(&sensor); terminal.println("------------------------------------"); terminal.println("Влажность");terminal.flush(); terminal.print ("Сенсор: "); terminal.println(sensor.name);terminal.flush(); terminal.print ("Вер.драйвера: "); terminal.println(sensor.version);terminal.flush(); terminal.print ("Уникал. ID: "); terminal.println(sensor.sensor_id);terminal.flush(); terminal.print ("Макс. знач.: "); terminal.print(sensor.max_value); terminal.println("%");terminal.flush(); terminal.print ("Мин. знач.: "); terminal.print(sensor.min_value); terminal.println("%");terminal.flush(); terminal.print ("Разрешение: "); terminal.print(sensor.resolution); terminal.println("%"); terminal.flush(); terminal.println("------------------------------------");terminal.flush(); // Проверим доступность датчика атм.давления BMP if (!BMP.begin()) { terminal.println("Не удалось найти действительный датчик BMP085/180, проверьте подключение!"); terminal.flush(); } // Выполняем первоначальную настройку и поиск устрйоств DS18B20 на линии Wire-1 dallasSensors.begin(); terminal.print("Найдено "); terminal.print(dallasSensors.getDeviceCount(), DEC); terminal.println(" устройств DS18B20. "); terminal.flush(); // Определяем режим питания (по отдельной линии или через паразитное питание по линии данных) terminal.print("Режим паразитного питания: "); if (dallasSensors.isParasitePowerMode()) terminal.println("ВКЛЮЧЕН"); else terminal.println("ВЫКЛЮЧЕН"); terminal.flush(); // Установим разрешение данных температуры в битах dallasSensors.setResolution(addT1, TEMPERATURE_PRECISION); dallasSensors.setResolution(addT2, TEMPERATURE_PRECISION); dallasSensors.setResolution(addT3, TEMPERATURE_PRECISION); dallasSensors.setResolution(addT4, TEMPERATURE_PRECISION); dallasSensors.setResolution(addT5, TEMPERATURE_PRECISION); terminal.print("Устройство 1 разрешение: "); terminal.print(dallasSensors.getResolution(addT1), DEC); terminal.println(" бит");terminal.flush(); terminal.print("Устройство 2 разрешение: "); terminal.print(dallasSensors.getResolution(addT2), DEC); terminal.println(" бит");terminal.flush(); // Установим время обсчета и диапазон ПИД регуляторов myPID0.SetOutputLimits(0, WindowSize); // Укажем размер интервала в мс окна регулирвания SSR реле myPID0.SetMode(AUTOMATIC); // Режим регулировки AUTOMATIC/MANAL, по умолчанию ПИД-регулятор выключен myPID0.SetSampleTime(1000); // Зададим частоту расчета выходного сигнала, по умолчанию 200мс //myPID0.SetOutputLimits(0,100); // Устанавливает границы выходящего сигнала, по умолчанию 0-255 windowStartTime = millis(); myPID1.SetMode(AUTOMATIC); myPID1.SetSampleTime(1000); myPID1.SetOutputLimits(0,255); myPID2.SetMode(AUTOMATIC); myPID2.SetSampleTime(1000); myPID2.SetOutputLimits(0,255); myPID3.SetMode(AUTOMATIC); myPID3.SetSampleTime(1000); myPID3.SetOutputLimits(0,255); myPID4.SetMode(AUTOMATIC); myPID4.SetSampleTime(1000); myPID4.SetOutputLimits(0,255); myPID5.SetMode(AUTOMATIC); myPID5.SetSampleTime(1000); myPID5.SetOutputLimits(0,255); // Устанавливаем интервал вызова каждой процедуры по прерыванию в миллисекундах 1 сек = 1000 мс timer.setInterval(5000, sendDataDHT); timer.setInterval(60000, sendDataBMP); timer.setInterval(7000, sendDataOPS); // Произведем первоначальную инициализацию всех систем и датчиков sendDataDHT(); sendDataBMP(); sendDataOPS(); sendDataPID(); delay(5000); // выдержим паузу при старте для стабилизации всей системы } void loop() { Blynk.run(); timer.run(); sendDataPID(); }
Ну и собственно сам блок ОПС, здесь вообще все тривиально. Собственно не суть сейчас я пока мониторю значения по факту на порту. Да и мультиметром тоже проверял.
void sendDataOPS() { int vOPS = analogRead(OPSPIN1); if (vOPS > 60 and vOPS < 80) { Blynk.notify("Пожар в спальне!"); terminal.print(DataTime()); terminal.println(" Пожар в спальне!"); terminal.flush(); } if (vOPS == 0) { Blynk.notify("Обрыв линии ОПС-1. Спальня."); terminal.print(DataTime()); terminal.println(" Обрыв линии ОПС-1. Спальня."); terminal.flush(); } vOPS = analogRead(OPSPIN2); if (vOPS > 60 and vOPS < 80) { Blynk.notify("Пожар в детской!"); terminal.print(DataTime()); terminal.println(" Пожар в детской!"); terminal.flush(); } if (vOPS == 0) { Blynk.notify("Обрыв линии ОПС-2. Спальня."); terminal.print(DataTime()); terminal.println(" Обрыв линии ОПС-2. Спальня."); terminal.flush(); } vOPS = analogRead(OPSPIN3); if (vOPS > 60 and vOPS < 80) { Blynk.notify("Пожар в гостиной!"); terminal.print(DataTime()); terminal.println(" Пожар в гостиной!"); terminal.flush(); } if (vOPS == 0) { Blynk.notify("Обрыв линии ОПС-3. Гостиная."); terminal.print(DataTime()); terminal.println(" Обрыв линии ОПС-3. Гостиная."); terminal.flush(); } }
Буду премного благодарен всем откликнувшимся!
Подключил 5В на OUT и GND. С датчиков соответственно управляющий сигнал + и GND. Земля у меня общая, т.к. все питается от одного БП (компьютерного).
На момент запуская все работало исправно, т.е. При сработке пожарного датчика на входе оптической развязки напряжение с 12 В падает до 6 В, но на выходе оптической развязки тоже падало в половину... При этом показания на A0-A3 скакали примерно в 512-ом диапазоне +-4. А теперь соответсвенно 1022-1023 вне зависимости от состояния пожарного датчика. Вроде схема подключения до боли понятная. Сопротивления мерял, все как на схеме.
Через некоторое время система перестала реагировать на изменения напряжения на IN. Т.е. пожарный датчик при сработке на управляющем шлейфе понижал напряжение до 6 В но на выводе с оптической развязки так и висит 5 В. А при обрыве линии должно быть 0 В, а оно всеравно не 0 В на OUT :-(
С теорией у меня туго. Максимум знания закона Ома на уровне U=I*R. Многие скажут что этого достаточно, но нет блин. Что я делаю не так?
P.S. Я обратил также внимание, что пока контроллер питался от двух источников 5В оно работало (хотя это не верно). А когда переключил контроллер на 12 В перестало работать (по ощущениям). Может нужно подпаять еще и делитель напряжения? Либо "прикупить" оптическую развязку с другими сопротивлениями? Но с какими?
А вы, в процессе апгрейда, на VO, двенадцать вольт не вхерачили, часом? Сразу подумал, почему такая схема выходного каскада, мне инстиктивное отвращение внушает?
А вы, в процессе апгрейда, на VO, двенадцать вольт не вхерачили, часом?
Часом нет, не вхерачил. 5 В подано на VO изначально и сейчас меряется столько же.
Сразу подумал, почему такая схема выходного каскада, мне инстиктивное отвращение внушает?
На этот вопрос затрудняюсь ответить, что Вам может внушать.
Я понимаю, что описание моё несколько сумбурно и тут больше важны Ваши догадки :-(
Не, второй вопрос, риторический, размышления у парадного подъезда. С n-p-n транзистором, обычно делается наоборот, резистор к плюсу, тогда при завышенном напряжении больше шансов входам не погореть.
Попробуйте последовательно с IN переменный резистор впаять и амперметр включить, смахивает на то, что у вас через диод постоянно течет ток, достаточный для открытия фототранзистора.
Попробовал следующее.
Отсоединил шлейф на VOUT. Перезагрузил контроллер с отключением питания. После загрузки. Показания на A0..A7 как полагается стали скакать. На "горячую" подключил обртано дачики ИП на A0..A3 потом подал питание 5В на VO. Показания встали на 998-999 где "обрыв" показывает 0. Где нет подключения значения плавают.
Может я не корректно инициирую aPIN в viod setup ()?
Внутренний PULLUP тянет на плюс, схемный резистор тянет на землю. Похоже, что выходы ваших оптопар тупо зашунтированы внутренним резистором, а на вход напруга с резисторного делителя попадает.
Внутренний PULLUP тянет на плюс, схемный резистор тянет на землю. Похоже, что выходы ваших оптопар тупо зашунтированы внутренним резистором, а на вход напруга с резисторного делителя попадает.
:-))))) сижу читаю ваш "сленг" и "ничёрта" не понимаю... Что куда подтягивает, кто кого шунтирует и чего куда попадает?
Между VO и OUT1 нарисуйте ещё один резистор на 20К - он как раз и появляется, когда INPUT_PULLUP включают.
Это вряд ли. пулап это 50кОм, Эмитерная нагрузка 10кОм, получаем делитель 50/10, то бишь на аналоге должно быть не выше 1/6 или в пределах 171 "попугая АЦП" даже если транзистор выкинуть нафиг. Если он открыт, то там будут честные 1023 попугая согласно схеме.
По схеме должно быть так: сажаем ИН на землю - видим в пределах 170 попугаев на АЦП, подтягиваем ИН к питанию - видим 1023 попугая. Если это не так - проблема в скетче.
Между VO и OUT1 нарисуйте ещё один резистор на 20К - он как раз и появляется, когда INPUT_PULLUP включают.
Спасибо но я эту страничку изучил очень подробно. Как эти лишние сопротивления могут мне мешать? Мне не столько важно само значение попугаев, а сколько его изменение при изменнии подающего напряжения от датчика ИП512 :-)
Проверить-то недолго - скетч из пяти строчек, пишущий в Serial, и попробовать режимы. Кстати, у 2560 c default reference voltage особенностей нет?
Это вряд ли. пулап это 50кОм, Эмитерная нагрузка 10кОм, получаем делитель 50/10, то бишь на аналоге должно быть не выше 1/6 или в пределах 171 "попугая АЦП" даже если транзистор выкинуть нафиг. Если он открыт, то там будут честные 1023 попугая согласно схеме.
По схеме должно быть так: сажаем ИН на землю - видим в пределах 170 попугаев на АЦП, подтягиваем ИН к питанию - видим 1023 попугая. Если это не так - проблема в скетче.
После моих "дурацких" манипуляций, все заработало, но чую что опять на один-два дня.
Сейчас все подключено также как я и описывал в шапке. На A0..A2 значения 998-999, на A3 значение 0 (к нему подключен только медный провод без датчика). Напряжение около 5В.
После сработки датчика ИП512 "авария" напряжение падает и значение становится на A0..A2 62-64 попугаев. Что меня вполне устраивает. После отключаем датчик чтобы сбросить аварию, значение на некоторое время становится 0. Потом возвращается на 998. На остальных выводах значения плавают как и положено. Для наглядности гифку склеил...
P.S. Забыл добавить, в скейтче также аткивно используется ШИМ. Это может как то влиять на работу аналоговых пинов?
P.S. Забыл добавить, в скейтче также аткивно используется ШИМ. Это может как то влиять на работу аналоговых пинов?
Выбросьте аналоговые значения, как таковые, оптопара - бинарный прибор и надо его использовать в этом качестве. Аналоговые шалости допускали советские ОЭП-ы с лампочкой и фоторезистором, таких нынче не делают. Добейтесь двух состояний - high, low.
Выбросьте аналоговые значения, как таковые, оптопара - бинарный прибор и надо его использовать в этом качестве. Аналоговые шалости допускали советские ОЭП-ы с лампочкой и фоторезистором, таких нынче не делают. Добейтесь двух состояний - high, low.
Меня очень даже устраивает 3 состояния порта "охрана"-"авария"-"обрыв" :-))))) А как выбросить то? Подборкой сопротивлений на IN/OUT? Если я Вас правильно понял, вы допускаете что в PC817 существует переходное состояние в котором и происходит "залипание"?
Конечно самый простой вариант - это эксперимент, но к сожалению не обладаю источником питания с регулировкой напряжения... Просто мне не понятно, как бинарность прибора (оптопары) может мешать на аналоговом порту получать всего 2 состояния?
ИТАК нужно: В коде использовать порты A0..7 как цифровые. А так же мне надо добится на OUT напряжения ниже 2,5В при срабатывании датчика ИП512, чтобы получить логический LOW на A0..8 я правильно рассуждаю? И соотвественно сосотяние HIGH при напряжении больше 2,6В...
БП не нужен, проверяем догадку (мне ваши 6В не нравятся, это ~9мА через светодиод), ставим в цепь IN переменный резистор 5к6-10к и когда на выходе датчика низкий уровень, начинаем его увеличивать, мониторя значения на аналоговом пине. Если в какой-то момент произошло переключение выхода, значит догадка верна.
БП не нужен, проверяем догадку (мне ваши 6В не нравятся, это ~9мА через светодиод), ставим в цепь IN переменный резистор 5к6-10к и когда на выходе датчика низкий уровень, начинаем его увеличивать, мониторя значения на аналоговом пине. Если в какой-то момент произошло переключение выхода, значит догадка верна.
Точно на входе IN? А диод вообще будет работать при таких малых токах? Сейчас на входе всего 470 Ом, ток ограничен до 25мА. А при 5к6 там вообще мизер будет...
Т.е. вы предлагаете "увести напряжение" с 6В на более низкое значение? Сформулируйте вашу догадку пожалуйста...
Именно так, я обычно выставляю 3-5мА максимум и они счастливо работают. Конкретно на 817 не проверял, но на 4n25, моськах этого достаточно. У вас, на низком, целых 9мА в нее гонит.
P/S Резистор, я же сказал - переменный, крайним номиналом от 5к6 до 10к. Больше смысла нет, слишком маленький угол поворота будет.
Именно так, я обычно выставляю 3-5мА максимум и они счастливо работают. Конкретно на 817 не проверял, но на 4n25, моськах этого достаточно. У вас, на низком, целых 9мА в нее гонит.
P/S Резистор, я же сказал - переменный, крайним номиналом от 5к6 до 10к. Больше смысла нет, слишком маленький угол поворота будет.
Ок. Спаисбо за совет! Перемонного резистора у меня нет. Попробу собрать на планшетке с 2,2кОм (последовательно с 470 встанет пока) резисторами и поставить в тест и посмотрим как оно себя поведет :-) Если все ок, то перепаять резисторную сорку с 470 Ом на 2,2кОм не составит труда.
Если все ок, то перепаять резисторную сорку с 470 Ом на 2,2кОм не составит труда.
Плохая мысль. Если поможет, то для нормальной работы такая схема плоха, она только для теста. Диоды (не Шоттки) или стабилитроны есть в хозяйстве?
Диоды (не Шоттки) или стабилитроны есть в хозяйстве?
Такого чуда не покупал еще...
Светодиоды?
Светодиоды?
Есть конечно. А так это они "не шотки"?
Если есть красные светики, то последовательно с диодом оптрона ставите сначала два, если на низком все равно светятся, добавляете третий-четвертый-пятый.
Может ему просто pullup снять?
Если есть красные светики, то последовательно с диодом оптрона ставите сначала два, если на низком все равно светятся, добавляете третий-четвертый-пятый.
Со светодиодом при низком 6В сразу гаснет и Blynk 0 погуаев показывает на A2, даже без 2,2кОм... А без светодиода с дополнительным сопротивлением к оптрону в 2,2кОм попугаи снизились с 64 до 23... Я так понимаю этот 817 диод пропускает обратный ток? В тепло ничего не преобразует и соотвественно никакого практического паденния напряжения не происходит по этому сигнал как бы "залипает"?
Может ему просто pullup снять?
Мне кажется, что проблема в входной цепи. Транзистор всегда открыт - светодиод+резистор 470Ом и минимальных 6В на входе. ИМХО.
Мне кажется, что проблема в входной цепи. Транзистор всегда открыт - светодиод+резистор 470Ом и минимальных 6В на входе. ИМХО.
Или человек - удачник и собрал у себя все варианты, на которых можно получить непредсказуемое поведение.
Я так понимаю этот 817 диод пропускает обратный ток? В тепло ничего не преобразует и соотвественно никакого практического паденния напряжения не происходит по этому сигнал как бы "залипает"?
Светодиод - нелинейный прибор. До определенного напряжения он заперт. При достижении напряжения открытия, начинает пропускать ток и работать как стабилитрон, удерживая напряжение на себе постоянным.
Наша задача, привести входные уровни к нулю и единице, убрав паразитное напряжение. То, что хватило одного красного светодиода, странно, должно было быть больше. Ну или так замеряете.
Светодиод - нелинейный прибор. До определенного напряжения он заперт. При достижении напряжения открытия, начинает пропускать ток и работать как стабилитрон, удерживая напряжение на себе постоянным.
Спасибо за разъяснения... Может с обратной стороны платы на IN просто напаять светоды или стабилитроны?
Это я и хотел предложить, если диагноз подтвердиться. Только предпологал, что понадобиться стабилитрон где-то на 5,1В, но раз обошлись одним светиком, пусть так, только помониторьте на предмет ложных срабатываний, если будут, добавьте еще один или поменяйте на белый-синий. И да, пуллап в этой схеме не нужен, от слова совсем, но это уже другая история.
Или человек - удачник и собрал у себя все варианты, на которых можно получить непредсказуемое поведение.
В этой сборке сложно что-то напутать. Прежде чем собирать в шкафу, я проводил тестрование скейтча и сборки на столе. И оно работало. Но когда система запустилась, через непредсказуемый промежуток времени 5-10 дней я заметил что все подключенные порты A0..3 "замерзли" и не реагировали на изменения. Даже простая перезагрузка контроллера со снятием напряжения не помогала избавиться от этого явления.
Помогало только сначла снять 5В с VO, загрузиться и потом только подать 5В на VO. И оно какой-то промежуток времени мониторило корректно сигналs на портах A0..3. Потом они опять замерзали в максимальном значении...
Контроллер при этом ниразу не зависал, т.к. остальные исполнительные элементы, датчики, реле и т.п. работают исправно.
Это я и хотел предложить, если диагноз подтвердиться. Только предпологал, что понадобиться стабилитрон где-то на 5,1В, но раз обошлись одним светиком, пусть так, только помониторьте на предмет ложных срабатываний, если будут, добавьте еще один или поменяйте на белый-синий. И да, пуллап в этой схеме не нужен, от слова совсем, но это уже другая история.
А почему не 12В ? Подтяжку отключил...
Вместо нуля мы имеем 6в паразитных (по вашим замерам), их нужно куда-то деть, последовательный стабилитрон оставил бы 0,9В, что явно недостаточно для зажигания светодиода, ход мыслей был такой.
Вместо нуля мы имеем 6в паразитных (по вашим замерам), их нужно куда-то деть, последовательный стабилитрон оставил бы 0,9В, что явно недостаточно для зажигания светодиода, ход мыслей был такой.
Примрено понял, а когда там 12В светодиод или стабилитрон будут излишки в тепло преобразовывать...
Хорошо, а если например мне надо все 3 состояния линии пожарных датчиков контролировать 0/6/12В? То можете подсказать готовое решение с поднебесной?
0 = обрыв, 6 = пожар, 12 = контроль. Я много всяких плат пересмотрел, но не смог ничего дельного подобрать... Может через SSD низкого номинала?
Я не знаю, насколько критична гальваническая развязка. Если необязательна, то обычный резистивный делитель и нижнее плечо зашунтировать стабилитроном на 5,1В. С развязкой не подскажу.
817 оптрон - прибор с ненормированной нелинейностью, все настольные аналоговые настройки могут поплыть в реальных условиях.
Нужно подбирать доп. резистор на датчике или на входе (это про 6 вольт), чтобы он (в сумме с сопротивлением шлейфа) давал чёткие 0 и 1 на входе ардуины. Естественно, читать digitalRead'ом.
Если же будет "Земля у меня общая" - на кой тогда вообще оптроны? Выкинуть их и (после аппаратного/программного ФНЧ) analogRead'ом определять, что там на шлейфе творится и четко идентифицировать обрыв/срабатывание/замыкание.
Если же будет "Земля у меня общая" - на кой тогда вообще оптроны? Выкинуть их и (после аппаратного/программного ФНЧ) analogRead'ом определять, что там на шлейфе творится и четко идентифицировать обрыв/срабатывание/замыкание.
Если бы я чётко знал ответ, накой... На той, что в шлейфе ИП512 рабочее напряжение 9-24В может быть. В моем случа 12В, а на порту Дуины не более 5В. Соответсвенно я искал готовое решение, т.к. идеология моего проекта была изначально построена на готовой доступной модульности из поднебесной например. Чтобы её мог собрать любой школьник. Если вы мне дадите хороший рабочий совет (но не паять самому), то буду премного благодарен.
Вместо нуля мы имеем 6в паразитных (по вашим замерам), их нужно куда-то деть, последовательный стабилитрон оставил бы 0,9В, что явно недостаточно для зажигания светодиода, ход мыслей был такой.
Примрено понял, а когда там 12В светодиод или стабилитрон будут излишки в тепло преобразовывать...
Хорошо, а если например мне надо все 3 состояния линии пожарных датчиков контролировать 0/6/12В? То можете подсказать готовое решение с поднебесной?
0 = обрыв, 6 = пожар, 12 = контроль. Я много всяких плат пересмотрел, но не смог ничего дельного подобрать... Может через SSD низкого номинала?
1. Подавать 12в (от изолированного источника) через шлейф и датчик на 2 оптрона - на один напрямую, на второй через стабилитрон.
2. Кто такой "SSD"
Если же будет "Земля у меня общая" - на кой тогда вообще оптроны? Выкинуть их и (после аппаратного/программного ФНЧ) analogRead'ом определять, что там на шлейфе творится и четко идентифицировать обрыв/срабатывание/замыкание.
Если бы я чётко знал ответ, накой... На той, что в шлейфе ИП512 рабочее напряжение 9-24В может быть. В моем случа 12В,
1. Подавать 12в (от изолированного источника).
Это уже не мой варинат, источник один...
2. Кто такой "SSD"
Очепятка конечно же я имел ввиду Solid State Relays, но дороговатое решение для моего случая :-)
1. Подавать 12в (от изолированного источника).
Это уже не мой варинат, источник один...
Может кто подсказать, что если вместо оптической развзяки использовать двунаправленный преобразователь уровней?
Например собранный на BSS138 ... Я не понимаю логику его работы, поэтому спрашиваю.
Это более бессмысленней.
Именно так, я обычно выставляю 3-5мА максимум и они счастливо работают. Конкретно на 817 не проверял, но на 4n25, моськах этого достаточно. У вас, на низком, целых 9мА в нее гонит.
P/S Резистор, я же сказал - переменный, крайним номиналом от 5к6 до 10к. Больше смысла нет, слишком маленький угол поворота будет.
Спасибо большое! Ваше "верная" догадка отработала месяц без сбоев. Мечтаю когда-нибудь все пернести на одну плату и избавится от бороды проводов :-) А так как в этом деле опыта у меня ноль, то решил начать с малого. Нарисовал плату в которую добавил светодиоды. Хотя наверно правильнее будет просто делитель напряжения распаять?
По возможности... Может кто посмотреть на ошибки, в свободную минутку? Был бы рад за науку, если кто "носом натыкает" :-) Оптроны хоть спасут порты контроллера если что....
Из своего, личного, опыта, если надо таскать дороги между падами, делаю их эллипсными, зазоры увеличиваются, а удерживающая площадь остается примерно такой же. ИМХО.