#include <OneWire.h>
OneWire ds(4); //D2
byte addr[8] = {0x28, 0xEC, 0xF0, 0xD5, 0x04, 0x00, 0x00, 0xF2};
//28:EC:F0:D5:4:0:0:F2: адрес моего датчика
volatile int temperature;
unsigned long timing;
void setup(void)
{
Serial.begin(115200);
}
void loop(void) {
if (millis() - timing > 1000)
{
timing = millis();
getTemperature();
Serial.print(" Temperature = ");
Serial.println(temperature);
}
}
void getTemperature()
{
static bool flagDall = true; // Признак операции
if (flagDall)
{
ds.reset();
ds.write(0xCC); // Обращение ко всем датчикам
ds.write(0x44); // Команда на конвертацию
}
else
{
int temp;
ds.reset();
ds.select(addr);
ds.write(0xBE); // Считывание значения с датчика
temp = (ds.read() | ds.read() << 8); // Принимаем два байта температуры
temperature = round((float)temp / 16.0);
}
flagDall = !flagDall; // Инверсия признака операции для следующей итерации
}
Temperature = 27
Temperature = 27
Temperature = 27
Temperature = 31
Temperature = 31
Temperature = 32
Temperature = 32
Temperature = 33
Temperature = 33
Temperature = 33
Temperature = 33
Виктор, у меня тоже заработало, была одна ошибка в адресе )))
вот это мне как раз и не нравится, что адрес забит жёстко, в идеале брать бы температуру по индексу, как в библиотеке DallasTemperature.h, тогда если датчик даст дуба, просто меняем его не изменяя прошивку
Насчёт дураков (что они знают, а что - нет) Вам, безусловно, виднее.
Вроде, слыхал, что они даташиты не читают, а с каждым чихом, который там жирным шрифтом прописан - на форум лезут. Но, может и неправда, сам-то я с ними редко сталкиваюсь.
Насчёт дураков (что они знают, а что - нет) Вам, безусловно, виднее.
не тужьтесь, вы меня не заденете, у меня все хорошо, с помощью добрых людей решил вопросы, которые сам решить не мог, за что им моя искренняя благодарность!
еще один не понятный момент, одна прошивка, один и тот же датчик, на arduini nano показывает 26 градусов, на ESP32 28 градусов, может кто объяснит, почему так ?
еще один не понятный момент, одна прошивка, один и тот же датчик, на arduini nano показывает 26 градусов, на ESP32 28 градусов, может кто объяснит, почему так ?
Математика одна, что в AVR, что в ESP. Если контрольная сумма не даёт повода усомниться (проверяется) в истинности данных, то искать причину нужно на стороне датчика.
А коли CRC не контролируете, то может и over 9000C вылезти.
Хотя, некоторые проблемы на ESP-шке с питанием периферии от слабенького LDO на 3.3V были...
Для начала, поместить их в одинаковые условия - коробочка, на дно вата или пенопласт, крышка и желательно чтобы корпуса соприкасались, замер проводить через пару минут после размещения в коробке. По его результатам делать выводы. Датчики на выносных шлейфах.
Для начала, поместить их в одинаковые условия - коробочка, на дно вата или пенопласт, крышка и желательно чтобы корпуса соприкасались, замер проводить через пару минут после размещения в коробке. По его результатам делать выводы. Датчики на выносных шлейфах.
датчик один и тот же, т.е. один, условия одинаковые..
После того, как Вы его покрутили, условия уже не одинаковые. Сходимость между двумя+ датчиками я смог получить только в термостате (коробке). Дело Ваще, убеждать не буду.
После того, как Вы его покрутили, условия уже не одинаковые. Сходимость между двумя+ датчиками я смог получить только в термостате (коробке). Дело Ваще, убеждать не буду.
повторюсь, датчик у меня один, две платы ардуино нано и esp32, код один и тот же, вставляю датчик в ардуино 26 градусов, вставляю в esp32 28 градусов...
После того, как Вы его покрутили, условия уже не одинаковые. Сходимость между двумя+ датчиками я смог получить только в термостате (коробке). Дело Ваще, убеждать не буду.
повторюсь, датчик у меня один, две платы ардуино нано и esp32, код один и тот же, вставляю датчик в ардуино 26 градусов, вставляю в esp32 28 градусов...
рисуйте схему подключения, внутри там цифра, значит датчик что-то греет, так как время между запросами одинаковое 1 секунда, можно попробовать в коде увеличить время между запросами к примеру до 3 секунд (на ESP) и посмотреть
рисуйте схему подключения, внутри там цифра, значит датчик что-то греет, так как время между запросами одинаковое 1 секунда, можно попробовать в коде увеличить время между запросами к примеру до 3 секунд (на ESP) и посмотреть
увеличивал время опроса с 1 до 10 секунд, разницы нет..
т.е. запитать датчик от 5 вольт, а резистор на 3.3 ? так не пробовал...
нет, если ESP всё запитываем от 3.3 вольта
проверил свой код, всё ТОРТ )))
ESP
Temperature = 26.938
Temperature = 26.938
Temperature = 27.000
Temperature = 27.000
Temperature = 27.000
Temperature = 27.000
Temperature = 27.000
Temperature = 27.000
Temperature = 27.000
Temperature = 27.000
Temperature = 27.000
Temperature = 27.000
Temperature = 26.938
NANO
Temperature = 26.812
Temperature = 26.812
Temperature = 26.812
Temperature = 26.812
Temperature = 26.812
Temperature = 26.812
Temperature = 26.812
Temperature = 26.812
Temperature = 26.812
Temperature = 26.812
Temperature = 26.812
Temperature = 26.875
Temperature = 26.875
нет, если ESP всё запитываем от 3.3 вольта
проверил свой код, всё ТОРТ )))
Виктор, мой проверьте, пожалуйста !
NANO
Temperature = 26
Temperature = 26
Temperature = 26
Temperature = 26
Temperature = 26
Temperature = 26
Temperature = 26
Temperature = 26
Temperature = 26
Temperature = 26
Temperature = 26
Temperature = 26
Temperature = 26
ESP
Temperature = 26
Temperature = 26
Temperature = 26
Temperature = 26
Temperature = 26
Temperature = 26
Temperature = 26
Temperature = 26
Temperature = 26
Temperature = 26
Temperature = 26
Публикуйте короткий тестовый скетч, на котором проявляется проблема. Будет время - проверю.
да, пожалуйста!
#include <OneWire.h>
OneWire ds(15);
byte addr[8];
uint8_t temperature;
unsigned long timing;
void setup(void)
{
Serial.begin(57600);
ds.reset(); // сброс шины
ds.write(0x1F); // точность 0,5гр = 1F; 0,25гр = 3F; 0,125гр = 5F; 0,0625гр = 7F;
ds.search(addr); // определение адреса датчика
}
void loop(void) {
if (millis() - timing > 2000)
{
timing = millis();
getTemperature();
Serial.print("Temperature = ");
Serial.println(temperature);
}
}
void getTemperature()
{
static bool flagDall = true; // Признак операции
if (flagDall)
{
ds.reset();
ds.write(0xCC); // Обращение ко всем датчикам
ds.write(0x44); // Команда на конвертацию
}
else
{
int temp;
ds.reset();
ds.select(addr);
ds.write(0xBE); // Считывание значения с датчика
temp = (ds.read() | ds.read() << 8) / 16.0; // Принимаем два байта температуры
temperature = round(temp);
}
flagDall = !flagDall; // Инверсия признака операции для следующей итерации
}
Уж не знаю, что там у Вас на ESP или ещё где-то, но здесь написано что-то совершенно невразумительное и работать это не должно нигде и никак. Вы сами-то этот код запускали? Именно этот? Можно поинтересоваться, что он Вам выдавал в сериал?
Ошибки на каждом шагу. Давайте потихоньку начнём разгребать.
1. Ваша getTemperature работает по-разному при чётном и нечётном обращениях. При чётном (считая с нуля) обращении она только запускает процесс, а при нечётном считывает уже готовую температуру. Так? Тогда зачем Вы печатаете её результат в строке №21-22 после каждого обращения? Что Вы надеетесь увидеть после чётных обращений?
2. Функция read в OneWire возвращает однобайтовое значение ( uint8_t read(void); ) Что Вы надеетесь получить, сдвигая это значение на 8 бит влево в строке №41?
Ещё раз вопрос, не думайте, что он был риторическим - Вы сами запускали этот код? Выложите пожалуйста протокол, который он пишет в сериал.
Уж не знаю, что там у Вас на ESP или ещё где-то, но здесь написано что-то совершенно невразумительное и работать это не должно нигде и никак. Вы сами-то этот код запускали? Именно этот? Можно поинтересоваться, что он Вам выдавал в сериал?
Ошибки на каждом шагу. Давайте потихоньку начнём разгребать.
1. Ваша getTemperature работает по-разному при чётном и нечётном обращениях. При чётном (считая с нуля) обращении она только запускает процесс, а при нечётном считывает уже готовую температуру. Так? Тогда зачем Вы печатаете её результат в строке №21-22 после каждого обращения? Что Вы надеетесь увидеть после чётных обращений?
2. Функция read в OneWire возвращает однобайтовое значение ( uint8_t read(void); ) Что Вы надеетесь получить, сдвигая это значение на 8 бит влево в строке №41?
Ещё раз вопрос, не думайте, что он был риторическим - Вы сами запускали этот код? Выложите пожалуйста протокол, который он пишет в сериал.
И да, AlexZR, ещё хотел спросить (прошу прощения, если Вы про это писали выше - неохота всю тему перерывать) - Вы ведь явно неуверенно всем этим добром пользуетесь. Тогда почему OneWire и трах "вручную"? Почему не пользуетесь готовыми библиотеками для данного датчика?
Чего он не сможет? Сказать запускал ли он этот код и скопипастить содержимое монитора порта?
так я Вам его выложил, и на ESP8266 и на ESP32 и на Nano всё работает...
а уж, что это в рамках нарушения правил С так Дед и озвучивал, лживый Ваш С... )))
И да, AlexZR, ещё хотел спросить (прошу прощения, если Вы про это писали выше - неохота всю тему перерывать) - Вы ведь явно неуверенно всем этим добром пользуетесь. Тогда почему OneWire и трах "вручную"? Почему не пользуетесь готовыми библиотеками для данного датчика?
да, вы верно заметили, очень не уверенно, но все что я находил для этого датчика, используют delay, что меня абсолютно не устраивает, так как объем обрабатываемых данных большой, температура только маленькая часть проекта, и остановка кода не приемлема..
А что, то, что я написал в пунктах 1 и 2 в посте #338 - это не подсказка? Ну, тогда не знаю даже.
ТСу этого не понять...
можно конечно посмотреть, чего там компилятор сделал, а так конечно в идеале надо две временные переменные типа int И С НИМИ РАБОТАТЬ...
мой хрустальный шар подсказывает, что компилятор такую переменную и создаёт...
Т.е. Вы хотите сказать, что код, который я процитировал в #338 печатает температуру только после её чтения и вообще, с вообще, мои два пункта - бред?
Ну, тогда я просто густо краснею и с позором убираюсь из темы :-(
ну вот вы опять обиделись ))) ну если вы знаете как должно быть, подскажите мне неграмотному, какой должен быть код ? не ужели это так трудно ? или вам нужно заплатить ? я готов...
Евгений Петрович, Вы правы идеологически, а конкретный код исключение, компилятор его обрабатывает как надо, то-есть зная что приёмником данных есть переменная типа int он и создаёт код работая с байтами во временных переменных типа int другого объяснения у меня нет
значит я прав ))))
разобрался, все работает как я хочу! благодарю всех за участие!
проверил этим кодом, у меня всё работает )))
Виктор, у меня тоже заработало, была одна ошибка в адресе )))
еще одна хотелка, для полного счастья ))) как вывести ошибку при обрыве провода или неисправности датчика через сериалпринт ?
Виктор, у меня тоже заработало, была одна ошибка в адресе )))
вот это мне как раз и не нравится, что адрес забит жёстко, в идеале брать бы температуру по индексу, как в библиотеке DallasTemperature.h, тогда если датчик даст дуба, просто меняем его не изменяя прошивку
да, это было бы идеально! но сам это не сделаю точно )))
да, это было бы идеально! но сам это не сделаю точно )))
в сетапе добавить
Вторая строка - по желанию
да, это было бы идеально! но сам это не сделаю точно )))
без адреса решение в этой теме предложил Пётр, работает, надо всю тему перечитать )))
да, это было бы идеально! но сам это не сделаю точно )))
в сетапе добавить
Вторая строка - по желанию
Круто! спасибо! теперь бы закрыть вопрос с ошибкой датчика, и все )))
все знают только дураки...
Насчёт дураков (что они знают, а что - нет) Вам, безусловно, виднее.
Вроде, слыхал, что они даташиты не читают, а с каждым чихом, который там жирным шрифтом прописан - на форум лезут. Но, может и неправда, сам-то я с ними редко сталкиваюсь.
не тужьтесь, вы меня не заденете, у меня все хорошо, с помощью добрых людей решил вопросы, которые сам решить не мог, за что им моя искренняя благодарность!
да, и так работает, спасибо!
да, и так работает, спасибо!
попробуй этот код, у меня моросит, но датчик на соплях
что то не то, у меня запаян непосредственно на esp, но эффект тот же что и у вас..
что то не то, у меня запаян непосредственно на esp, но эффект тот же что и у вас..
явный косяк в коде, так как я не настоящий сталевар только предполагаю в чём проблема но как обойти не понимаю
код поста #222 видимо решит проблему
еще один не понятный момент, одна прошивка, один и тот же датчик, на arduini nano показывает 26 градусов, на ESP32 28 градусов, может кто объяснит, почему так ?
еще один не понятный момент, одна прошивка, один и тот же датчик, на arduini nano показывает 26 градусов, на ESP32 28 градусов, может кто объяснит, почему так ?
а на esp от какого пина питание даёшь? 3.3V?
нет, 5 вольт, нужно от 3.3 вольта ?
запитал от 3.3, все сравнялось, спасибо за подсказку!
Подогревается от чего-то датчик.
Математика одна, что в AVR, что в ESP. Если контрольная сумма не даёт повода усомниться (проверяется) в истинности данных, то искать причину нужно на стороне датчика.
А коли CRC не контролируете, то может и over 9000C вылезти.
Хотя, некоторые проблемы на ESP-шке с питанием периферии от слабенького LDO на 3.3V были...
поторопился, тоже самое разница 2 градуса и от питания 3.3 вольта (((
как найти причину разницы ?
Для начала, поместить их в одинаковые условия - коробочка, на дно вата или пенопласт, крышка и желательно чтобы корпуса соприкасались, замер проводить через пару минут после размещения в коробке. По его результатам делать выводы. Датчики на выносных шлейфах.
датчик один и тот же, т.е. один, условия одинаковые..
После того, как Вы его покрутили, условия уже не одинаковые. Сходимость между двумя+ датчиками я смог получить только в термостате (коробке). Дело Ваще, убеждать не буду.
После того, как Вы его покрутили, условия уже не одинаковые. Сходимость между двумя+ датчиками я смог получить только в термостате (коробке). Дело Ваще, убеждать не буду.
повторюсь, датчик у меня один, две платы ардуино нано и esp32, код один и тот же, вставляю датчик в ардуино 26 градусов, вставляю в esp32 28 градусов...
Тут только следственный эксперимент поможет - чтобы кто-то сторонний повторил с вашим фрагментом кода.
После того, как Вы его покрутили, условия уже не одинаковые. Сходимость между двумя+ датчиками я смог получить только в термостате (коробке). Дело Ваще, убеждать не буду.
повторюсь, датчик у меня один, две платы ардуино нано и esp32, код один и тот же, вставляю датчик в ардуино 26 градусов, вставляю в esp32 28 градусов...
рисуйте схему подключения, внутри там цифра, значит датчик что-то греет, так как время между запросами одинаковое 1 секунда, можно попробовать в коде увеличить время между запросами к примеру до 3 секунд (на ESP) и посмотреть
где бы его найти )))
увеличивал время опроса с 1 до 10 секунд, разницы нет..
Публикуйте короткий тестовый скетч, на котором проявляется проблема. Будет время - проверю.
а резистор подтяжки от 3 вольт или 5?
да, пожалуйста!
пробовал оба варианта, разницы нет..
т.е. запитать датчик от 5 вольт, а резистор на 3.3 ? так не пробовал...
пробовал оба варианта, разницы нет..
т.е. запитать датчик от 5 вольт, а резистор на 3.3 ? так не пробовал...
нет, если ESP всё запитываем от 3.3 вольта
проверил свой код, всё ТОРТ )))
ESP
Temperature = 26.938
Temperature = 26.938
Temperature = 27.000
Temperature = 27.000
Temperature = 27.000
Temperature = 27.000
Temperature = 27.000
Temperature = 27.000
Temperature = 27.000
Temperature = 27.000
Temperature = 27.000
Temperature = 27.000
Temperature = 26.938
NANO
Temperature = 26.812
Temperature = 26.812
Temperature = 26.812
Temperature = 26.812
Temperature = 26.812
Temperature = 26.812
Temperature = 26.812
Temperature = 26.812
Temperature = 26.812
Temperature = 26.812
Temperature = 26.812
Temperature = 26.875
Temperature = 26.875
проверил свой код, всё ТОРТ )))
Виктор, мой проверьте, пожалуйста !
проверил свой код, всё ТОРТ )))
Виктор, мой проверьте, пожалуйста !
NANO
а какой пин на ESP32 вы используете ?
да, пожалуйста!
Уж не знаю, что там у Вас на ESP или ещё где-то, но здесь написано что-то совершенно невразумительное и работать это не должно нигде и никак. Вы сами-то этот код запускали? Именно этот? Можно поинтересоваться, что он Вам выдавал в сериал?
Ошибки на каждом шагу. Давайте потихоньку начнём разгребать.
1. Ваша getTemperature работает по-разному при чётном и нечётном обращениях. При чётном (считая с нуля) обращении она только запускает процесс, а при нечётном считывает уже готовую температуру. Так? Тогда зачем Вы печатаете её результат в строке №21-22 после каждого обращения? Что Вы надеетесь увидеть после чётных обращений?
2. Функция read в OneWire возвращает однобайтовое значение ( uint8_t read(void); ) Что Вы надеетесь получить, сдвигая это значение на 8 бит влево в строке №41?
Ещё раз вопрос, не думайте, что он был риторическим - Вы сами запускали этот код? Выложите пожалуйста протокол, который он пишет в сериал.
а какой пин на ESP32 вы используете ?
ESP32 пин 4
Уж не знаю, что там у Вас на ESP или ещё где-то, но здесь написано что-то совершенно невразумительное и работать это не должно нигде и никак. Вы сами-то этот код запускали? Именно этот? Можно поинтересоваться, что он Вам выдавал в сериал?
Ошибки на каждом шагу. Давайте потихоньку начнём разгребать.
1. Ваша getTemperature работает по-разному при чётном и нечётном обращениях. При чётном (считая с нуля) обращении она только запускает процесс, а при нечётном считывает уже готовую температуру. Так? Тогда зачем Вы печатаете её результат в строке №21-22 после каждого обращения? Что Вы надеетесь увидеть после чётных обращений?
2. Функция read в OneWire возвращает однобайтовое значение ( uint8_t read(void); ) Что Вы надеетесь получить, сдвигая это значение на 8 бит влево в строке №41?
Ещё раз вопрос, не думайте, что он был риторическим - Вы сами запускали этот код? Выложите пожалуйста протокол, который он пишет в сериал.
ТС видимо не сможет объяснить, придётся мне? )))
И да, AlexZR, ещё хотел спросить (прошу прощения, если Вы про это писали выше - неохота всю тему перерывать) - Вы ведь явно неуверенно всем этим добром пользуетесь. Тогда почему OneWire и трах "вручную"? Почему не пользуетесь готовыми библиотеками для данного датчика?
ТС видимо не сможет объяснить
Чего он не сможет? Сказать запускал ли он этот код и скопипастить содержимое монитора порта?
ну код как бы не мой, взят из этой ветки сообщение 282, код как бы работает.. хотя в протеусе нет! если знаете, подскажите как правильно сделать ?
ТС видимо не сможет объяснить
Чего он не сможет? Сказать запускал ли он этот код и скопипастить содержимое монитора порта?
так я Вам его выложил, и на ESP8266 и на ESP32 и на Nano всё работает...
а уж, что это в рамках нарушения правил С так Дед и озвучивал, лживый Ваш С... )))
да, вы верно заметили, очень не уверенно, но все что я находил для этого датчика, используют delay, что меня абсолютно не устраивает, так как объем обрабатываемых данных большой, температура только маленькая часть проекта, и остановка кода не приемлема..
Т.е. Вы хотите сказать, что код, который я процитировал в #338 печатает температуру только после её чтения и вообще, с вообще, мои два пункта - бред?
Ну, тогда я просто густо краснею и с позором убираюсь из темы :-(
ТСу этого не понять...
можно конечно посмотреть, чего там компилятор сделал, а так конечно в идеале надо две временные переменные типа int И С НИМИ РАБОТАТЬ...
мой хрустальный шар подсказывает, что компилятор такую переменную и создаёт...
Т.е. Вы хотите сказать, что код, который я процитировал в #338 печатает температуру только после её чтения и вообще, с вообще, мои два пункта - бред?
Ну, тогда я просто густо краснею и с позором убираюсь из темы :-(
ну вот вы опять обиделись ))) ну если вы знаете как должно быть, подскажите мне неграмотному, какой должен быть код ? не ужели это так трудно ? или вам нужно заплатить ? я готов...
Евгений Петрович, Вы правы идеологически, а конкретный код исключение, компилятор его обрабатывает как надо, то-есть зная что приёмником данных есть переменная типа int он и создаёт код работая с байтами во временных переменных типа int другого объяснения у меня нет