Блок эмуляции DS18b20
Блок эмуляции DS18b20
Прошу помощи в создании пользовательского блока эмуляции устройств 1 wire на базе библиотеки Arduino-OWI. Ссылка на библиотеку https://github.com/mikaelpatel/Arduino-OW
Отзовитесь кто может помочь.
Отзовитесь кто может помочь.
- AlexCrane
- Капитан
- Сообщения: 903
- Зарегистрирован: 20 окт 2017, 13:22
- Откуда: Ульяновск
- Имя: Александр
- Поблагодарили: 12 раз
Блок эмуляции DS18b20
Для чего это нужно?
Если не знаю, то не скажу. Если скажу, то сначала проверю...
Если нет возможности отблагодарить материально, хотя бы оцени пост....
Если нет возможности отблагодарить материально, хотя бы оцени пост....
Блок эмуляции DS18b20
https://github.com/mikaelpatel/Arduino-OWI
Есть готовые устройства мониторинга и управления которые работают с ds18b20.
Нужно расширить их возможность передавая им альтернативные показания не температуру например кВт, м3 и т.д.
Есть готовые устройства мониторинга и управления которые работают с ds18b20.
Нужно расширить их возможность передавая им альтернативные показания не температуру например кВт, м3 и т.д.
- AlexCrane
- Капитан
- Сообщения: 903
- Зарегистрирован: 20 окт 2017, 13:22
- Откуда: Ульяновск
- Имя: Александр
- Поблагодарили: 12 раз
Блок эмуляции DS18b20
[ref]gav81[/ref], Т.е. вы хотите подключить вместо DS18B20 ардуино и вместо температуры транслировать любые данные. Т.е вы хотите превратить температурный логгер во всеядный? 
А все датчики на одной линии висят?
Ссылка, которую вы дали, по моему левая. Вот правильная библиотека с примерами, даже пример для вашего случая есть https://github.com/orgua/OneWireHub
[spoiler=Пример]
/*
* 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;
}
[/spoiler]

А все датчики на одной линии висят?
Ссылка, которую вы дали, по моему левая. Вот правильная библиотека с примерами, даже пример для вашего случая есть https://github.com/orgua/OneWireHub
[spoiler=Пример]
/*
* 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;
}
[/spoiler]
Если не знаю, то не скажу. Если скажу, то сначала проверю...
Если нет возможности отблагодарить материально, хотя бы оцени пост....
Если нет возможности отблагодарить материально, хотя бы оцени пост....
Блок эмуляции DS18b20
Да, все верно понимаете. Датчики висят на одной линии. Видел эту библиотеку. Но писали что она менее стабильная нежели Arduino-OWI. Спасибо за пример.
Попробую из нее с липить пользовательский блок.
Попробую из нее с липить пользовательский блок.
- AlexCrane
- Капитан
- Сообщения: 903
- Зарегистрирован: 20 окт 2017, 13:22
- Откуда: Ульяновск
- Имя: Александр
- Поблагодарили: 12 раз
Блок эмуляции DS18b20
[ref]gav81[/ref], Потести, может заработает
Отправлено спустя 3 часа 44 минуты 14 секунд:
вместо 8 поставить 32 устройства на одном проводе
Интересует сколько датчиков с эмулирует на одном проводеОтправлено спустя 3 часа 44 минуты 14 секунд:
В файле OneWireHub_config.h в строке #define HUB_SLAVE_LIMIT 8 // set the limit of the hub HERE, max is 32 devices
вместо 8 поставить 32 устройства на одном проводе
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Если не знаю, то не скажу. Если скажу, то сначала проверю...
Если нет возможности отблагодарить материально, хотя бы оцени пост....
Если нет возможности отблагодарить материально, хотя бы оцени пост....
Блок эмуляции DS18b20
Залил на мегу сканирование 1 wire, на уно Emu. Подключил + реальный датчик.
Его видит, с эмулированые уной нет.

Его видит, с эмулированые уной нет.

- AlexCrane
- Капитан
- Сообщения: 903
- Зарегистрирован: 20 окт 2017, 13:22
- Откуда: Ульяновск
- Имя: Александр
- Поблагодарили: 12 раз
Блок эмуляции DS18b20
[ref]gav81[/ref], А если так
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Если не знаю, то не скажу. Если скажу, то сначала проверю...
Если нет возможности отблагодарить материально, хотя бы оцени пост....
Если нет возможности отблагодарить материально, хотя бы оцени пост....
- AlexCrane
- Капитан
- Сообщения: 903
- Зарегистрирован: 20 окт 2017, 13:22
- Откуда: Ульяновск
- Имя: Александр
- Поблагодарили: 12 раз
Блок эмуляции DS18b20
Прогнал в протеусе, напрямую с эмулятора читает. Возможно сканирование библиотека не поддерживает
скиньте кто-нибудь проект со сканированием и выводом на экран, погоняю в потеусе.
Один датчик на шине находится сканированием, так что сканирование поддерживается...
[ref]gav81[/ref], Получилось что нибудь в железе?

Один датчик на шине находится сканированием, так что сканирование поддерживается...
[ref]gav81[/ref], Получилось что нибудь в железе?
Если не знаю, то не скажу. Если скажу, то сначала проверю...
Если нет возможности отблагодарить материально, хотя бы оцени пост....
Если нет возможности отблагодарить материально, хотя бы оцени пост....
Блок эмуляции DS18b20
Код сканирования шины 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
но я не могу написать из них пользовательский блок. не понимаю до конца примеры.
#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
- Капитан
- Сообщения: 903
- Зарегистрирован: 20 окт 2017, 13:22
- Откуда: Ульяновск
- Имя: Александр
- Поблагодарили: 12 раз
Блок эмуляции DS18b20
[ref]gav81[/ref], Тот код что выдали у меня не компилируется. Этот код вы в мегу заливали?
Если не знаю, то не скажу. Если скажу, то сначала проверю...
Если нет возможности отблагодарить материально, хотя бы оцени пост....
Если нет возможности отблагодарить материально, хотя бы оцени пост....
Блок эмуляции DS18b20
да в мегу.
это код flprog генерит.
инструменты - сканирование шины onewire - выбираем контроллер - пин onewire - загрузить скетч в ide
[scroll]#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);
}[/scroll]
это код flprog генерит.
инструменты - сканирование шины onewire - выбираем контроллер - пин onewire - загрузить скетч в ide
[scroll]#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);
}[/scroll]
- AlexCrane
- Капитан
- Сообщения: 903
- Зарегистрирован: 20 окт 2017, 13:22
- Откуда: Ульяновск
- Имя: Александр
- Поблагодарили: 12 раз
Блок эмуляции DS18b20
[ref]gav81[/ref], В Протеусе прогнал с этим скетчем, нашел все эмулированные дачики, а схему соединений можете нарисовать?
Чудеса какие-то?У вас нет необходимых прав для просмотра вложений в этом сообщении.
Если не знаю, то не скажу. Если скажу, то сначала проверю...
Если нет возможности отблагодарить материально, хотя бы оцени пост....
Если нет возможности отблагодарить материально, хотя бы оцени пост....
Блок эмуляции DS18b20
Схема соединения
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Блок эмуляции DS18b20
AlexCrane, запустил все работает. проблема была в библиотеке. после переустановки получилось.
Огромное спасибо за помощь!
Огромное спасибо за помощь!
Блок эмуляции DS18b20
Залил пробный проект в UNO
Попробовал прочитать датчик сторонней программой
Программа его не видит
Попробовал прочитать датчик сторонней программой
Программа его не видит
- AlexCrane
- Капитан
- Сообщения: 903
- Зарегистрирован: 20 окт 2017, 13:22
- Откуда: Ульяновск
- Имя: Александр
- Поблагодарили: 12 раз
Блок эмуляции DS18b20
[ref]tolochko[/ref], Мало инфы, какой сторонней программой? Автоматически сканирует сторонняя программа адреса или набиваете в ручную. Попробуйте сканирование шины oneWire из FlProg сделать.
Если не знаю, то не скажу. Если скажу, то сначала проверю...
Если нет возможности отблагодарить материально, хотя бы оцени пост....
Если нет возможности отблагодарить материально, хотя бы оцени пост....
Блок эмуляции DS18b20
Программа называется Бенукс
Сканирует автоматически и в режиме настройки ищет подчиненных
Когда находит прописывает его код
У меня пишет нет устройств на линии
Может в этой библиотеке нет команды поиск
Вернее она не понимает эту команду
Где то год я сотрудничал с одним человеком сайт SYREMO
Он делал тоже слейвы на базе AVR на какой библиотеке не знаю
Так вот со своими модулями в его программе работало нормально в с родными не всегда
Хотя в на сайте этой библиотеки что здесь скачивал написано что полный аналог
Отправлено спустя 1 минуту 10 секунд:
Попробую на ардуинах и отпишусь
Сканирует автоматически и в режиме настройки ищет подчиненных
Когда находит прописывает его код
У меня пишет нет устройств на линии
Может в этой библиотеке нет команды поиск
Вернее она не понимает эту команду
Где то год я сотрудничал с одним человеком сайт SYREMO
Он делал тоже слейвы на базе AVR на какой библиотеке не знаю
Так вот со своими модулями в его программе работало нормально в с родными не всегда
Хотя в на сайте этой библиотеки что здесь скачивал написано что полный аналог
Отправлено спустя 1 минуту 10 секунд:
Попробую на ардуинах и отпишусь
Блок эмуляции DS18b20
Провозился ничо не получается
не видит не сторонняя ни ардуинка
Заметил что в коде имулируемого датчика на одну группу меньше чем в родном
Скетч грузится но показывает не то
Программка для проверки шины тоже датчик не видит
не видит не сторонняя ни ардуинка
Заметил что в коде имулируемого датчика на одну группу меньше чем в родном
Скетч грузится но показывает не то
Программка для проверки шины тоже датчик не видит
Кто сейчас на конференции
Сейчас этот форум просматривают: Amazon [Bot] и 2 гостя