Новичкам! О важности локализации проблемы! DallasTemperature и Serial проблема зависимостей...
- Войдите на сайт для отправки комментариев
Сб, 29/12/2018 - 15:49
Доброго дня всем.
Я уже на пути отказаться от использования DallasTemperature. Для меня это уже слишком.
Но все же... MEGA 2560, датчики висят на 14 PINe.
Пока висит открытый терминал на COM5 температура нормально читается.
Как только USB кабель отключаю, плата не зависает, но значения перстают читсаться и датчики не находятся и т.д.
Мой рабочий скетч очень большой, ради эксперимента сделал вот такую сборку. Эффект такой же. Может кто из гуру сразу увидит пробелму?
#define BLYNK_PRINT Serial #include <SPI.h> #include <Ethernet.h> #include <BlynkSimpleEthernet.h> // You should get Auth Token in the Blynk App. // Go to the Project Settings (nut icon). char auth[] = "345feecc001441f68da511b17f01d1ec"; IPAddress server_ip (192, 168, 0, 50); // Mac address should be different for each device in your LAN 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); #define W5100_CS 10 #define SDCARD_CS 4 WidgetTerminal terminal(V127); #include <OneWire.h> #include <DallasTemperature.h> // Data wire is plugged into port 2 on the Arduino #define ONE_WIRE_BUS 14 #define TEMPERATURE_PRECISION 12 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); // arrays to hold device addresses //DeviceAddress insideThermometer, outsideThermometer; DeviceAddress insideThermometer = { 0x28, 0xC7, 0x03, 0x43, 0x98, 0xFF, 0x00, 0xAE }; DeviceAddress outsideThermometer = { 0x28, 0xC7, 0x03, 0x43, 0x98, 0xFF, 0x00, 0xAE }; void setup() { // Debug console Serial.begin(9600); pinMode(SDCARD_CS, OUTPUT); digitalWrite(SDCARD_CS, HIGH); // Deselect the SD card Blynk.begin(auth, server_ip, 8080, arduino_ip, dns_ip, gateway_ip, subnet_mask, arduino_mac); // Or like this: //Blynk.begin(auth, "blynk-cloud.com", 80, arduino_ip, dns_ip, gateway_ip, subnet_mask, arduino_mac); Serial.println("Dallas Temperature IC Control Library Demo"); // Start up the library sensors.begin(); // locate devices on the bus Serial.print("Locating devices..."); Serial.print("Found "); Serial.print(sensors.getDeviceCount(), DEC); Serial.println(" devices."); // report parasite power requirements Serial.print("Parasite power is: "); if (sensors.isParasitePowerMode()) Serial.println("ON"); else Serial.println("OFF"); // method 1: by index if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0"); if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1"); // show the addresses we found on the bus Serial.print("Device 0 Address: "); printAddress(insideThermometer); Serial.println(); Serial.print("Device 1 Address: "); printAddress(outsideThermometer); Serial.println(); // set the resolution to 9 bit per device sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION); sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION); Serial.print("Device 0 Resolution: "); Serial.print(sensors.getResolution(insideThermometer), DEC); Serial.println(); Serial.print("Device 1 Resolution: "); Serial.print(sensors.getResolution(outsideThermometer), DEC); Serial.println(); } // function to print a device address void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { // zero pad the address if necessary if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } } // function to print the temperature for a device void printTemperature(DeviceAddress deviceAddress) { float tempC = sensors.getTempC(deviceAddress); Serial.print("Temp C: "); Serial.print(tempC); Serial.print(" Temp F: "); Serial.print(DallasTemperature::toFahrenheit(tempC)); } // function to print a device's resolution void printResolution(DeviceAddress deviceAddress) { Serial.print("Resolution: "); Serial.print(sensors.getResolution(deviceAddress)); Serial.println(); } // main function to print information about a device void printData(DeviceAddress deviceAddress) { Serial.print("Device Address: "); printAddress(deviceAddress); Serial.print(" "); printTemperature(deviceAddress); Serial.println(); } void printDataTerminal(DeviceAddress deviceAddress) { terminal.print("Device Address: "); printAddressTerminal(deviceAddress); terminal.print(" "); printTemperatureTerminal(deviceAddress); terminal.println(); terminal.flush(); } void printAddressTerminal(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { // zero pad the address if necessary if (deviceAddress[i] < 16) terminal.print("0"); terminal.print(deviceAddress[i], HEX); } terminal.flush(); } void printTemperatureTerminal(DeviceAddress deviceAddress) { float tempC = sensors.getTempC(deviceAddress); terminal.print("Temp C: "); terminal.print(tempC); terminal.print(" Temp F: "); terminal.print(DallasTemperature::toFahrenheit(tempC)); terminal.flush(); } void loop() { Blynk.run(); Serial.print("Requesting temperatures..."); sensors.requestTemperatures(); Serial.println("DONE"); // print the device information printDataTerminal(insideThermometer); printDataTerminal(outsideThermometer); }
А теперь поробуйте убрать питание от платы и проверить читсаются или не читсаются датчики. Думаю для того что бы датчики чесались нормально нужно помощнее питание. Это потому что питание от USB все же получше будет.
В том то и соль, что все питание системы организовано от компьютерного блока питания (лежал без надобности и был пущен в дело)... Причем БП хороший с очень стабильным питанием при таких "нагрузках" то. Физически выглядит это примерно так:
Это потому что питание от USB все же получше будет.
С этим утверждением я бы поспорил. Получше чего?
И у меня сильные подозрения что проблема может быть физическая. Смена PIN на 50, не помогла от слова совсем. На 50 датчик не читается вообще. Возникло подозрение что на MEGA2560 порты 0, 1, 14, 15, 16, 17, 18, 19 имеют отношение к TX/RX, и именно этот факт как-то "помогает" отрабатывать скейтчу.
Такого быть не могет. Проверьте питание на датчиках, не отвалился-ли подтягивающий резистор, да и прочие контакты до кучи. Опросите датчики по одному - может какой нибудь вышел из строя.
Такого быть не могет. Проверьте питание на датчиках, не отвалился-ли подтягивающий резистор, да и прочие контакты до кучи. Опросите датчики по одному - может какой нибудь вышел из строя.
Прежде чем поставить датчики в систему они были проверены на планшетке в течении 3-х дней провисели. Ни одного сбоя небыло. Причем для вычисления погрешности были опущены в стакан с водой. Погрешность оказалась в пределах 0,5 градуса между всем 5-ю датчиками.
Ну тогда только так #1
Верните далласы на планшетку.
Доброго дня всем.
Я уже на пути отказаться от использования DallasTemperature. Для меня это уже слишком.
Даллас Семикондактор в ужасе! Срочно созван совет директоров, сотрудники отозваны из рождественских отпусков! ;)))))
--------------
А если не издеваться, то нужно знать длину кабелей до датчиков. Почитай в сети про далласы, немного поможет помехозащищающий конденсатор. Питание от БП может быть грязным, стоит посмотреть на него осцилографом.
То есть дело, конечно, в помехах. Ищи их источник.
http://arduino.ru/forum/apparatnye-voprosy/ds-18b20-udlinil-kabel#comment-19896
Это я писал ещё в 2012 году....
Кстати до сих пор работает.....
А вы всё про помехи пишете.....
Кстати никаких конденсаторов кроме 1000.0 на выходе 78L05 нет
А вот вам и свежак , только что сделал:
ну, а что не так? у тебя и питание отдельное и подтяжка уменьшена. а у ТС что-то мешает.
AlexArGC, подключите к 12в БП постоянную нагрузку на 40-60 Вт и проверьте работу датчиков
Прежде чем поставить датчики ...
Я понимаю, что датчики работают, но Вы не сказали, что проверяли систему после полной сборки.
Правильно говорят. Комп БП надо нагрузить, а то на малых токах может козлить.
Я уже на пути отказаться от использования DallasTemperature. Для меня это уже слишком.
А если не издеваться, то нужно знать длину кабелей до датчиков. Почитай в сети про далласы, немного поможет помехозащищающий конденсатор. Питание от БП может быть грязным, стоит посмотреть на него осцилографом.
То есть дело, конечно, в помехах. Ищи их источник.
Я про библиотеку DallasTemperature. Длина кабеля не критична, примерно 3 метра UTP, со схемой подключения все ок. К тому же вся остальная навеска (DHT-22, SSD и SSR реле, дымовые ИП512) работают исправно. Поэтому я и написал вот этот упрощенный скейтч (в топике), чтобы исключить ошибки основного кода. Я почему то не уверен что проблема в питании.. Попробую подать питание по USB от внешнего источника типа PowerBank... О результатах отпишус. видимо числа 4-го :-)))) С Наступающим всех. Но за идеи буду благодарен. (Может китайцы чего с платой накосячили конечно)... А то у меня была история с W5100 когда не ту сборку сопротивлений впаяли в х10 раз больше чем нужно.
Это смотря какие БП. У моего сейчас и по 12В есть нагрузка и по 5В, пусть небольшая но есть.
P.S. Вот почему на 50/51 пине вообще не видится DS датчик... А на 14 видит, когда к USB порту ноут подключаешь...
P.S. Вот почему на 50/51 пине вообще не видится DS датчик... А на 14 видит, когда к USB порту ноут подключаешь...
Может потому что 50 и 51 на мега2560 - это SPI, который так же используется Ethernet module? Ах нет, что это я... дело же в DallasTemperature. Во всём виновата она, Serial и еще 100500 других библиотек, но никак не сборщик девайса.
Может потому что 50 и 51 на мега2560 - это SPI, который так же используется Ethernet module? Ах нет, что это я... дело же в DallasTemperature. Во всём виновата она, Serial и еще 100500 других библиотек, но никак не сборщик девайса.
Иронию оценил... 50/51 действительно запамятовал что это SPI (уж больно все плотно распределил). Аналоговые порты свободные есть однако... Про Даллас библиотеку почитал вот эту тему может и сложилось такое впечатление о ней. Какая еще нужна информация по проблеме чтобы натыкали носом?
Мне - никакая не нужна, вобщем-то. Просто проведите стандартные процедуры по поиску проблемы: верните термометры на D2, поменяйте БП, погоняйте всё со примером из библиотеки DallasTemperature, убедитесь что всё работает по-отдельности, потом начинайте искать проблему в большом скетче.
Мне - никакая не нужна, вобщем-то. Просто проведите стандартные процедуры по поиску проблемы: верните термометры на D2, поменяйте БП, погоняйте всё со примером из библиотеки DallasTemperature, убедитесь что всё работает по-отдельности, потом начинайте искать проблему в большом скетче.
Спасибо за ваше нравоучение. Оно помогло мне найти проблему :-)
1. Причина была ни в библиотеке Dallas, ни в моём скетче.
2. Проведено было довольно много экспериментов, с питанием.
В итоге было решено запитать плату MEGA2560 через разъем USB-B от того же бока питания ПК. Что на удливление дало результат. Т.е. при подаче питания чере DC разъем на плату, датчик DS не читался, причем попытка подать отдельное питание на датчик DS (от PowerBanks) при такой схеме подключения также давало ошибку чтения датчика.
И тут меня осенило, какого "Х" я на DC разъем подаю 5V, ведь в datasheet написано питание по DC 7-12V!!!
Переключил плату MEGA на питание от 12В и все заработало. Спасибо sadman41, за ваше потраченное время на мой глупый вопрос! Как бы подправить заголовок темы?
Как бы подправить заголовок темы?
С вашего позволения, подправил заголовок и отправил как учебный материал новичкам.))))