Новичкам! О важности локализации проблемы! DallasTemperature и Serial проблема зависимостей...

AlexArGC
AlexArGC аватар
Offline
Зарегистрирован: 18.11.2016

Доброго дня всем.

Я уже на пути отказаться от использования 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);
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

AlexArGC пишет:
Как только USB кабель отключаю, плата не зависает, но значения перстают читсаться и датчики не находятся и т.д.
А теперь поробуйте убрать питание от платы и проверить читсаются или не читсаются датчики. Думаю для того что бы датчики чесались нормально нужно помощнее питание. Это потому что питание от USB все же получше будет.

AlexArGC
AlexArGC аватар
Offline
Зарегистрирован: 18.11.2016

qwone пишет:

А теперь поробуйте убрать питание от платы и проверить читсаются или не читсаются датчики. Думаю для того что бы датчики чесались нормально нужно помощнее питание. Это потому что питание от USB все же получше будет.

В том то и соль, что все питание системы организовано от компьютерного блока питания (лежал без надобности и был пущен в дело)... Причем БП хороший с очень стабильным питанием при таких "нагрузках" то. Физически выглядит это примерно так:

 

 

 

 

AlexArGC
AlexArGC аватар
Offline
Зарегистрирован: 18.11.2016

qwone пишет:

Это потому что питание от USB все же получше будет.

С этим утверждением я бы поспорил. Получше чего?

И у меня сильные подозрения что проблема может быть физическая. Смена PIN на 50, не помогла от слова совсем. На 50 датчик не читается вообще. Возникло подозрение что на MEGA2560 порты 0, 1, 14, 15, 16, 17, 18, 19 имеют отношение к TX/RX, и именно этот факт как-то "помогает" отрабатывать скейтчу.

 

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Такого быть не могет. Проверьте питание на датчиках, не отвалился-ли подтягивающий резистор, да и прочие контакты до кучи. Опросите датчики по одному - может какой нибудь вышел из строя.

AlexArGC
AlexArGC аватар
Offline
Зарегистрирован: 18.11.2016

mykaida пишет:

Такого быть не могет. Проверьте питание на датчиках, не отвалился-ли подтягивающий резистор, да и прочие контакты до кучи. Опросите датчики по одному - может какой нибудь вышел из строя.

Прежде чем поставить датчики в систему они были проверены на планшетке в течении 3-х дней провисели. Ни одного сбоя небыло. Причем для вычисления погрешности были опущены в стакан с водой. Погрешность оказалась в пределах 0,5 градуса между всем 5-ю датчиками.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну тогда только так #1

sadman41
Offline
Зарегистрирован: 19.10.2016

Верните далласы на планшетку.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

AlexArGC пишет:

Доброго дня всем.

Я уже на пути отказаться от использования DallasTemperature. Для меня это уже слишком.

Даллас Семикондактор в ужасе! Срочно созван совет директоров, сотрудники отозваны из рождественских отпусков! ;)))))

--------------

А если не издеваться, то нужно знать длину кабелей до датчиков. Почитай в сети про далласы, немного поможет помехозащищающий конденсатор. Питание от БП может быть грязным, стоит посмотреть на него осцилографом.

То есть дело, конечно, в помехах. Ищи их источник.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

http://arduino.ru/forum/apparatnye-voprosy/ds-18b20-udlinil-kabel#comment-19896

Это я писал ещё в 2012 году....
Кстати до сих пор работает.....

А вы всё про помехи пишете.....
Кстати никаких конденсаторов кроме 1000.0 на выходе 78L05 нет

А вот вам и свежак , только что сделал:

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ну, а что не так? у тебя и питание отдельное и подтяжка уменьшена. а у ТС что-то мешает.

ВН
Offline
Зарегистрирован: 25.02.2016

AlexArGC, подключите к 12в БП постоянную нагрузку на 40-60 Вт и проверьте работу датчиков 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

AlexArGC пишет:

mykaida пишет:

Прежде чем поставить датчики ...

Я понимаю, что датчики работают, но Вы не сказали, что проверяли систему после полной сборки.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Правильно говорят. Комп БП надо нагрузить, а то на малых токах может козлить.

AlexArGC
AlexArGC аватар
Offline
Зарегистрирован: 18.11.2016

wdrakula пишет:

AlexArGC пишет:

Я уже на пути отказаться от использования DallasTemperature. Для меня это уже слишком.

А если не издеваться, то нужно знать длину кабелей до датчиков. Почитай в сети про далласы, немного поможет помехозащищающий конденсатор. Питание от БП может быть грязным, стоит посмотреть на него осцилографом.

То есть дело, конечно, в помехах. Ищи их источник.

Я про библиотеку DallasTemperature. Длина кабеля не критична, примерно 3 метра UTP, со схемой подключения все ок. К тому же вся остальная навеска (DHT-22, SSD и SSR реле, дымовые ИП512) работают исправно. Поэтому я и написал вот этот упрощенный скейтч (в топике), чтобы исключить ошибки основного кода. Я почему то не уверен что проблема в питании.. Попробую подать питание по USB от внешнего источника типа PowerBank... О результатах отпишус. видимо числа 4-го :-)))) С Наступающим всех. Но за идеи буду благодарен. (Может китайцы чего с платой накосячили конечно)... А то у меня была история с W5100 когда не ту сборку сопротивлений впаяли в х10 раз больше чем нужно.

MaksVV пишет:
Правильно говорят. Комп БП надо нагрузить, а то на малых токах может козлить.

Это смотря какие БП. У моего сейчас и по 12В есть нагрузка и по 5В, пусть небольшая но есть.

P.S. Вот почему на 50/51 пине вообще не видится DS датчик... А на 14 видит, когда к USB порту ноут подключаешь...

sadman41
Offline
Зарегистрирован: 19.10.2016

AlexArGC пишет:

P.S. Вот почему на 50/51 пине вообще не видится DS датчик... А на 14 видит, когда к USB порту ноут подключаешь...

Может потому что 50 и 51 на мега2560 - это SPI, который так же используется Ethernet module? Ах нет, что это я... дело же в DallasTemperature. Во всём виновата она, Serial и еще 100500 других библиотек, но никак не сборщик девайса.

AlexArGC
AlexArGC аватар
Offline
Зарегистрирован: 18.11.2016

sadman41 пишет:

Может потому что 50 и 51 на мега2560 - это SPI, который так же используется Ethernet module? Ах нет, что это я... дело же в DallasTemperature. Во всём виновата она, Serial и еще 100500 других библиотек, но никак не сборщик девайса.

Иронию оценил... 50/51  действительно запамятовал что это SPI (уж больно все плотно распределил). Аналоговые порты свободные есть однако... Про Даллас библиотеку почитал вот эту тему может и сложилось такое впечатление о ней. Какая еще нужна информация по проблеме чтобы натыкали носом?

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Мне - никакая не нужна, вобщем-то. Просто проведите стандартные процедуры по поиску проблемы: верните термометры на D2, поменяйте БП, погоняйте всё со примером из библиотеки DallasTemperature, убедитесь что всё работает по-отдельности, потом начинайте искать проблему в большом скетче.

AlexArGC
AlexArGC аватар
Offline
Зарегистрирован: 18.11.2016

sadman41 пишет:

Мне - никакая не нужна, вобщем-то. Просто проведите стандартные процедуры по поиску проблемы: верните термометры на D2, поменяйте БП, погоняйте всё со примером из библиотеки DallasTemperature, убедитесь что всё работает по-отдельности, потом начинайте искать проблему в большом скетче.

Спасибо за ваше нравоучение. Оно помогло мне найти проблему :-)

1. Причина была ни в библиотеке Dallas, ни в моём скетче.

2. Проведено было довольно много экспериментов, с питанием.

В итоге было решено запитать плату MEGA2560 через разъем USB-B от того же бока питания ПК. Что на удливление дало результат. Т.е. при подаче питания чере DC разъем на плату, датчик DS не читался, причем попытка подать отдельное питание на датчик DS (от PowerBanks) при такой схеме подключения также давало ошибку чтения датчика.

И тут меня осенило,  какого "Х" я на DC разъем подаю 5V, ведь в datasheet написано питание по DC 7-12V!!!

Переключил плату MEGA на питание от 12В и все заработало. Спасибо sadman41, за ваше потраченное время на мой глупый вопрос! Как бы подправить заголовок темы?

bwn
Offline
Зарегистрирован: 25.08.2014

AlexArGC пишет:

Как бы подправить заголовок темы?

С вашего позволения, подправил заголовок и отправил как учебный материал новичкам.))))