Блок эмуляции DS18b20

Эмуляция DS18b20 с помощью библиотеки Arduino-OWI

Создаем свой блок. Вопросы, помощь знатоков.
gav81
Рядовой
Сообщения: 48
Зарегистрирован: 07.10.2015{, 21:04}
Репутация: 1

Блок эмуляции DS18b20

#1

Сообщение gav81 » 19.11.2019{, 11:20}

Прошу помощи в создании пользовательского блока эмуляции устройств 1 wire на базе библиотеки Arduino-OWI. Ссылка на библиотеку https://github.com/mikaelpatel/Arduino-OW
Отзовитесь кто может помочь.

Аватара пользователя
AlexCrane
Капитан
Сообщения: 895
Зарегистрирован: 20.10.2017{, 13:22}
Репутация: 294
Откуда: Ульяновск
Имя: Александр

Блок эмуляции DS18b20

#2

Сообщение AlexCrane » 19.11.2019{, 13:48}

Для чего это нужно?
Если не знаю, то не скажу. Если скажу, то сначала проверю...
Если нет возможности отблагодарить материально, хотя бы оцени пост....

gav81
Рядовой
Сообщения: 48
Зарегистрирован: 07.10.2015{, 21:04}
Репутация: 1

Блок эмуляции DS18b20

#3

Сообщение gav81 » 19.11.2019{, 18:44}

https://github.com/mikaelpatel/Arduino-OWI
Есть готовые устройства мониторинга и управления которые работают с ds18b20.
Нужно расширить их возможность передавая им альтернативные показания не температуру например кВт, м3 и т.д.

Аватара пользователя
AlexCrane
Капитан
Сообщения: 895
Зарегистрирован: 20.10.2017{, 13:22}
Репутация: 294
Откуда: Ульяновск
Имя: Александр

Блок эмуляции DS18b20

#4

Сообщение AlexCrane » 19.11.2019{, 22:33}

gav81, Т.е. вы хотите подключить вместо DS18B20 ардуино и вместо температуры транслировать любые данные. Т.е вы хотите превратить температурный логгер во всеядный? :smile9:

А все датчики на одной линии висят?

Ссылка, которую вы дали, по моему левая. Вот правильная библиотека с примерами, даже пример для вашего случая есть https://github.com/orgua/OneWireHub
ПримерПоказать
/*
* Example-Code that emulates a bunch of DS18B20 and puts real sensor-values in it:
* - light-Intensity: red, green, blue, white
* - air-pressure in pascal
* - relative humidity in percent
* - temperature in degC
*
* Tested with:
* - DS9490R-Master, atmega328@16MHz as Slave
*/

constexpr bool enable_debug = 0;

#include "OneWireHub.h"
#include "DS18B20.h"

#include <Wire.h>
#include "i2c.h"

#include "i2c_TCS3772.h"
TCS3772 tcs3772;

#include "i2c_MPL3115A2.h"
MPL3115A2 mpl3115;

#include "i2c_SI7021.h"
SI7021 si7021;

constexpr uint8_t pin_led { 8 };
constexpr uint8_t pin_onewire { 1 };

auto hub = OneWireHub(pin_onewire);

auto ds18b0 = DS18B20(0x28, 0x00, 0x55, 0x44, 0x33, 0x22, 0x11); // Light, RED, without unit, int16 from 0 to 2047
auto ds18b1 = DS18B20(0x28, 0x01, 0x55, 0x44, 0x33, 0x22, 0x11); // Light, GREEN, same as above
auto ds18b2 = DS18B20(0x28, 0x02, 0x55, 0x44, 0x33, 0x22, 0x11); // Light, BLUE, same as above
auto ds18b3 = DS18B20(0x28, 0x03, 0x55, 0x44, 0x33, 0x22, 0x11); // Light, CLEAR, same as above
auto ds18b4 = DS18B20(0x28, 0x04, 0x55, 0x44, 0x33, 0x22, 0x11); // Pressure, pascal - sealevel (101325), int16 from -2048 to +2047
auto ds18b5 = DS18B20(0x28, 0x05, 0x55, 0x44, 0x33, 0x22, 0x11); // humidity, percent * 16, int16 from 0 to 1600 (translates to 0 to 100%)
auto ds18b6 = DS18B20(0x28, 0x06, 0x55, 0x44, 0x33, 0x22, 0x11); // temp, °C*16, int16 from -2048 to +2047 (translates to -128 to 128°C)
auto ds18b7 = DS18B20(0x28, 0x07, 0x55, 0x44, 0x33, 0x22, 0x11); // unused

#include <avr/wdt.h>

bool blinking(void);

void setup()
{
wdt_reset();
wdt_enable (WDTO_250MS);

if (enable_debug)
{
Serial.begin(115200);
Serial.println("OneWire-Hub DS18B20 Temperature-Sensor");
Serial.flush();

Serial.print("Probe TCS3772: ");
if (tcs3772.initialize()) Serial.println("Sensor found");
else Serial.println("Sensor missing");

Serial.print("Probe MPL3115A2: ");
if (mpl3115.initialize()) Serial.println("Sensor found");
else Serial.println("Sensor missing");

Serial.print("Probe SI7021: ");
if (si7021.initialize()) Serial.println("Sensor found!");
else Serial.println("Sensor missing");
}
else
{
tcs3772.initialize();
mpl3115.initialize();
si7021.initialize();
}

tcs3772.setAGain(4);
tcs3772.setATime(17);

mpl3115.setEnabled(0); // manual mode,onetime-measure:
mpl3115.setAltimeter(0);
mpl3115.triggerMeasurement();

si7021.triggerMeasurement();

pinMode(pin_led, OUTPUT);

// Setup OneWire
hub.attach(ds18b0);
hub.attach(ds18b1);
hub.attach(ds18b2);
hub.attach(ds18b3);
hub.attach(ds18b4);
hub.attach(ds18b5);
hub.attach(ds18b6);
//hub.attach(ds18b7);

wdt_reset();

updateSensorTCS();
updateSensorMPL();
updateSensorSI7();
}

void updateSensorTCS(void) // 8560 559
{
uint16_t value_crgb[4];

tcs3772.getMeasurement(value_crgb);

if (enable_debug)
{
Serial.print("R: ");
Serial.print(value_crgb[1]);
Serial.print(" G: ");
Serial.print(value_crgb[2]);
Serial.print(" B: ");
Serial.print(value_crgb[3]);
Serial.print(" C: ");
Serial.print(value_crgb[0]);
Serial.println("");
}

for (uint8_t i=0; i<4; ++i)
{
value_crgb = value_crgb>>2;
if (value_crgb > 2047) value_crgb = 2047;
}

ds18b0.setTemperatureRaw(value_crgb[1]);
ds18b1.setTemperatureRaw(value_crgb[2]);
ds18b2.setTemperatureRaw(value_crgb[3]);
ds18b3.setTemperatureRaw(value_crgb[0]);
}

void updateSensorMPL(void)
{
constexpr uint32_t pascal_offset = 101325; // at sealevel

uint32_t pascal;
mpl3115.getPressure(pascal); // gives pascal in 18bit resolution
const int16_t pascal16 = pascal - pascal_offset;

mpl3115.triggerMeasurement();

if (enable_debug)
{
Serial.print("Pascal: ");
Serial.print(pascal16);
Serial.println("");
}

ds18b4.setTemperatureRaw(pascal16);
}

void updateSensorSI7(void)
{
float humi, temp;

si7021.getHumidity(humi);
si7021.getTemperature(temp);
si7021.triggerMeasurement();

if (enable_debug)
{
Serial.print("TEMP: ");
Serial.print(temp);
Serial.print(" HUMI: ");
Serial.print(humi);
Serial.println("");
}

const int16_t temp16 = temp * 16; // natural ds18b20, should be safe from +127 to -128
const int16_t humi16 = humi * 16; // natural ds18b20

ds18b5.setTemperatureRaw(humi16);
ds18b6.setTemperatureRaw(temp16);
}

void loop()
{
wdt_reset();
// following function must be called periodically
hub.poll();

// Blink triggers the state-change
if (blinking())
{
static uint8_t process = 0;
if (process == 0) updateSensorTCS();
if (process == 1) updateSensorMPL();
if (process == 2) updateSensorSI7();
if (++process>2) process = 0;
}
}

bool blinking(void)
{
constexpr uint32_t interval = 1000; // interval at which to blink (milliseconds)
static uint32_t nextMillis = millis(); // will store next time LED will updated

if (millis() > nextMillis)
{
nextMillis += interval; // save the next time you blinked the LED
static uint8_t ledState = LOW; // ledState used to set the LED
if (ledState == LOW) ledState = HIGH;
else ledState = LOW;
digitalWrite(pin_led, ledState);
return 1;
}
return 0;
}
Если не знаю, то не скажу. Если скажу, то сначала проверю...
Если нет возможности отблагодарить материально, хотя бы оцени пост....

gav81
Рядовой
Сообщения: 48
Зарегистрирован: 07.10.2015{, 21:04}
Репутация: 1

Блок эмуляции DS18b20

#5

Сообщение gav81 » 20.11.2019{, 08:52}

Да, все верно понимаете. Датчики висят на одной линии. Видел эту библиотеку. Но писали что она менее стабильная нежели Arduino-OWI. Спасибо за пример.
Попробую из нее с липить пользовательский блок.

Аватара пользователя
AlexCrane
Капитан
Сообщения: 895
Зарегистрирован: 20.10.2017{, 13:22}
Репутация: 294
Откуда: Ульяновск
Имя: Александр

Блок эмуляции DS18b20

#6

Сообщение AlexCrane » 20.11.2019{, 15:29}

gav81, Потести, может заработает
DS18B20_Emu.flp
(709.06 КБ) 73 скачивания
Интересует сколько датчиков с эмулирует на одном проводе

Отправлено спустя 3 часа 44 минуты 14 секунд:
AlexCrane писал(а):
20.11.2019{, 15:29}
Интересует сколько датчиков с эмулирует на одном проводе
В файле OneWireHub_config.h в строке #define HUB_SLAVE_LIMIT 8 // set the limit of the hub HERE, max is 32 devices
вместо 8 поставить 32 устройства на одном проводе
Если не знаю, то не скажу. Если скажу, то сначала проверю...
Если нет возможности отблагодарить материально, хотя бы оцени пост....

gav81
Рядовой
Сообщения: 48
Зарегистрирован: 07.10.2015{, 21:04}
Репутация: 1

Блок эмуляции DS18b20

#7

Сообщение gav81 » 20.11.2019{, 21:22}

Залил на мегу сканирование 1 wire, на уно Emu. Подключил + реальный датчик.
Его видит, с эмулированые уной нет.
:(

Аватара пользователя
AlexCrane
Капитан
Сообщения: 895
Зарегистрирован: 20.10.2017{, 13:22}
Репутация: 294
Откуда: Ульяновск
Имя: Александр

Блок эмуляции DS18b20

#8

Сообщение AlexCrane » 20.11.2019{, 22:17}

gav81, А если так
DS18B20_Emu2.flp
(724.28 КБ) 72 скачивания
Если не знаю, то не скажу. Если скажу, то сначала проверю...
Если нет возможности отблагодарить материально, хотя бы оцени пост....

tolochko
Сержант
Сообщения: 247
Зарегистрирован: 30.11.2016{, 16:58}
Репутация: 7
Откуда: Днепропетровск

Блок эмуляции DS18b20

#9

Сообщение tolochko » 20.11.2019{, 23:03}

Посмотрите здесь https://www.syremo.com.ua/
Пользовался его продутом работает

Аватара пользователя
AlexCrane
Капитан
Сообщения: 895
Зарегистрирован: 20.10.2017{, 13:22}
Репутация: 294
Откуда: Ульяновск
Имя: Александр

Блок эмуляции DS18b20

#10

Сообщение AlexCrane » 20.11.2019{, 23:22}

Прогнал в протеусе, напрямую с эмулятора читает. Возможно сканирование библиотека не поддерживает :smile37: скиньте кто-нибудь проект со сканированием и выводом на экран, погоняю в потеусе.

Один датчик на шине находится сканированием, так что сканирование поддерживается...

gav81, Получилось что нибудь в железе?
Если не знаю, то не скажу. Если скажу, то сначала проверю...
Если нет возможности отблагодарить материально, хотя бы оцени пост....

gav81
Рядовой
Сообщения: 48
Зарегистрирован: 07.10.2015{, 21:04}
Репутация: 1

Блок эмуляции DS18b20

#11

Сообщение gav81 » 21.11.2019{, 20:43}

Код сканирования шины onewire в инструментах flprog

#include <OneWire.h>
OneWire ds(7); // on pin 10 (a 4.7K resistor is necessary)
byte deviceType;
void setup(void) {
Serial.begin(9600);
}

void loop(void) {
byte i;

byte type_s;
byte data[12];
byte addr[8];
float celsius;

if ( !ds.search(addr)) {
ds.reset_search();
delay(250);
return;
}




if (OneWire::crc8(addr, 7) != addr[7]) {

return;
}



switch (addr[0]) {
case 0x10:
type_s = 1;
deviceType=1; //Chip = DS18S20 or old DS1820
break;
case 0x28:
type_s = 0;
deviceType=2;//Chip = DS18B20
break;
case 0x22:
type_s = 0;
deviceType=3;// Chip = DS1822
break;
default:
deviceType=0;//������ ����������
return;
}

ds.reset();
ds.select(addr);
ds.write(0x44, 1);

delay(1000);


ds.reset();
ds.select(addr);
ds.write(0xBE);
for ( i = 0; i < 9; i++) {data = ds.read();}



int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3;
if (data[7] == 0x10) {
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7;
else if (cfg == 0x20) raw = raw & ~3;
else if (cfg == 0x40) raw = raw & ~1;

}
celsius = (float)raw / 16.0;


Serial.write (1);
Serial.write (2);
Serial.print (deviceType);
Serial.write (3);
for( i = 0; i < 8; i++) {

Serial.write (2);
Serial.print(addr, HEX);
Serial.write (3);
}
Serial.write (2);
Serial.print(celsius);
Serial.write (3);
Serial.write (4);


}

Отправлено спустя 4 минуты 8 секунд:
Загрузил протестил DS18B20_Emu2.flp
реальный датчик видит, эмуляцию нет.

Отправлено спустя 5 минут 36 секунд:
устройство и контроллер видит примеры на базе библиотеки arduino-OWI
https://github.com/mikaelpatel/Arduino-OWI
но я не могу написать из них пользовательский блок. не понимаю до конца примеры.

Аватара пользователя
AlexCrane
Капитан
Сообщения: 895
Зарегистрирован: 20.10.2017{, 13:22}
Репутация: 294
Откуда: Ульяновск
Имя: Александр

Блок эмуляции DS18b20

#12

Сообщение AlexCrane » 21.11.2019{, 21:31}

gav81, Тот код что выдали у меня не компилируется. Этот код вы в мегу заливали?
Если не знаю, то не скажу. Если скажу, то сначала проверю...
Если нет возможности отблагодарить материально, хотя бы оцени пост....

gav81
Рядовой
Сообщения: 48
Зарегистрирован: 07.10.2015{, 21:04}
Репутация: 1

Блок эмуляции DS18b20

#13

Сообщение gav81 » 21.11.2019{, 21:45}

да в мегу.
это код flprog генерит.
инструменты - сканирование шины onewire - выбираем контроллер - пин onewire - загрузить скетч в ide
#include <OneWire.h>
OneWire ds(7); // on pin 10 (a 4.7K resistor is necessary)
byte deviceType;
void setup(void) {
Serial.begin(9600);
}

void loop(void) {
byte i;

byte type_s;
byte data[12];
byte addr[8];
float celsius;

if ( !ds.search(addr)) {
ds.reset_search();
delay(250);
return;
}




if (OneWire::crc8(addr, 7) != addr[7]) {

return;
}



switch (addr[0]) {
case 0x10:
type_s = 1;
deviceType=1; //Chip = DS18S20 or old DS1820
break;
case 0x28:
type_s = 0;
deviceType=2;//Chip = DS18B20
break;
case 0x22:
type_s = 0;
deviceType=3;// Chip = DS1822
break;
default:
deviceType=0;//������ ����������
return;
}

ds.reset();
ds.select(addr);
ds.write(0x44, 1);

delay(1000);


ds.reset();
ds.select(addr);
ds.write(0xBE);
for ( i = 0; i < 9; i++) {data = ds.read();}



int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3;
if (data[7] == 0x10) {
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7;
else if (cfg == 0x20) raw = raw & ~3;
else if (cfg == 0x40) raw = raw & ~1;

}
celsius = (float)raw / 16.0;


Serial.write (1);
Serial.write (2);
Serial.print (deviceType);
Serial.write (3);
for( i = 0; i < 8; i++) {

Serial.write (2);
Serial.print(addr, HEX);
Serial.write (3);
}
Serial.write (2);
Serial.print(celsius);
Serial.write (3);
Serial.write (4);


}

Аватара пользователя
AlexCrane
Капитан
Сообщения: 895
Зарегистрирован: 20.10.2017{, 13:22}
Репутация: 294
Откуда: Ульяновск
Имя: Александр

Блок эмуляции DS18b20

#14

Сообщение AlexCrane » 21.11.2019{, 22:18}

gav81, В Протеусе прогнал с этим скетчем, нашел все эмулированные дачики, а схему соединений можете нарисовать?
DS18B20_Emu.png
Чудеса какие-то?
Если не знаю, то не скажу. Если скажу, то сначала проверю...
Если нет возможности отблагодарить материально, хотя бы оцени пост....

gav81
Рядовой
Сообщения: 48
Зарегистрирован: 07.10.2015{, 21:04}
Репутация: 1

Блок эмуляции DS18b20

#15

Сообщение gav81 » 22.11.2019{, 06:10}

Схема соединения
IMG_20191122_081019.jpg

gav81
Рядовой
Сообщения: 48
Зарегистрирован: 07.10.2015{, 21:04}
Репутация: 1

Блок эмуляции DS18b20

#16

Сообщение gav81 » 23.11.2019{, 09:53}

AlexCrane, запустил все работает. проблема была в библиотеке. после переустановки получилось.
Огромное спасибо за помощь!

tolochko
Сержант
Сообщения: 247
Зарегистрирован: 30.11.2016{, 16:58}
Репутация: 7
Откуда: Днепропетровск

Блок эмуляции DS18b20

#17

Сообщение tolochko » 03.12.2019{, 22:24}

Залил пробный проект в UNO
Попробовал прочитать датчик сторонней программой
Программа его не видит

Аватара пользователя
AlexCrane
Капитан
Сообщения: 895
Зарегистрирован: 20.10.2017{, 13:22}
Репутация: 294
Откуда: Ульяновск
Имя: Александр

Блок эмуляции DS18b20

#18

Сообщение AlexCrane » 04.12.2019{, 09:21}

tolochko, Мало инфы, какой сторонней программой? Автоматически сканирует сторонняя программа адреса или набиваете в ручную. Попробуйте сканирование шины oneWire из FlProg сделать.
Если не знаю, то не скажу. Если скажу, то сначала проверю...
Если нет возможности отблагодарить материально, хотя бы оцени пост....

tolochko
Сержант
Сообщения: 247
Зарегистрирован: 30.11.2016{, 16:58}
Репутация: 7
Откуда: Днепропетровск

Блок эмуляции DS18b20

#19

Сообщение tolochko » 04.12.2019{, 10:56}

Программа называется Бенукс
Сканирует автоматически и в режиме настройки ищет подчиненных
Когда находит прописывает его код
У меня пишет нет устройств на линии
Может в этой библиотеке нет команды поиск
Вернее она не понимает эту команду
Где то год я сотрудничал с одним человеком сайт SYREMO
Он делал тоже слейвы на базе AVR на какой библиотеке не знаю
Так вот со своими модулями в его программе работало нормально в с родными не всегда
Хотя в на сайте этой библиотеки что здесь скачивал написано что полный аналог

Отправлено спустя 1 минуту 10 секунд:
Попробую на ардуинах и отпишусь

tolochko
Сержант
Сообщения: 247
Зарегистрирован: 30.11.2016{, 16:58}
Репутация: 7
Откуда: Днепропетровск

Блок эмуляции DS18b20

#20

Сообщение tolochko » 07.12.2019{, 17:06}

Провозился ничо не получается
не видит не сторонняя ни ардуинка
Заметил что в коде имулируемого датчика на одну группу меньше чем в родном
Скетч грузится но показывает не то
Программка для проверки шины тоже датчик не видит

Ответить

Вернуться в «Разработка пользовательских блоков»