Arduino Polska Forum
Jak wysyłać sygnał 1-Wire z Arduino ? - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Sieciowe Protokoły i Urządzenia (https://forum.arduinopolska.pl/dzial-sieciowe-protoko%C5%82y-i-urz%C4%85dzenia)
+--- Wątek: Jak wysyłać sygnał 1-Wire z Arduino ? (/watek-jak-wysy%C5%82a%C4%87-sygna%C5%82-1-wire-z-arduino)



Jak wysyłać sygnał 1-Wire z Arduino ? - HAL_9000_PL - 13-02-2021

Cześć,

Zbieram dane z kilku czujników DS18B20 w Arduino. Obrabiam je (licze średnią temperaturę) następnie chcę przesłać wynik do innego mikrokontrolera STM32 (w którym nie mogę grzebać i go programować). Sygnał musi być przesyłany po 1-Wire.

Czy da sie w Arduino zasymulować sygnał 1-Wire na wyjściu aby był widoczny jako jeden sensor DS18B20 ?


RE: Jak wysyłać sygnał 1-Wire z Arduino ? - Agregacik - 13-02-2021

Może to Ci pomoże.


RE: Jak wysyłać sygnał 1-Wire z Arduino ? - HAL_9000_PL - 13-02-2021

Tak o coś takiego chodziło.

Przykład z biblioteki dla Arduino Uno kompiluje się bez problemu. Problem pojawia się gdy próbuję skompilować go dla Arduino Mega:

Kompilowanie szkicu...
"F:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10805 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR "-IF:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IF:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\mega" "-IF:\Program Files (x86)\Arduino\libraries\onewirearduinoslave\src" "C:\Users\HAL9000\AppData\Local\Temp\arduino_build_620321\sketch\FakeDS18B20.ino.cpp" -o "C:\Users\HAL9000\AppData\Local\Temp\arduino_build_620321\sketch\FakeDS18B20.ino.cpp.o"
In file included from F:\Program Files (x86)\Arduino\libraries\onewirearduinoslave\src/OneWireSlave.h:5:0,

from F:\Program Files (x86)\Arduino\libraries\onewirearduinoslave\examples\FakeDS18B20\FakeDS18B20.ino:2:

F:\Program Files (x86)\Arduino\libraries\onewirearduinoslave\src/utility/LowLevel.h: In member function 'void Pin::attachInterrupt(void (*)(), int)':

F:\Program Files (x86)\Arduino\libraries\onewirearduinoslave\src/utility/LowLevel.h:157:3: error: 'CLEARINTERRUPT' was not declared in this scope

CLEARINTERRUPT; // clear any pending interrupt (we want to call the handler only for interrupts happening after it is attached)

^

Użycie biblioteki onewirearduinoslave w wersji 0.1 z folderu: F:\Program Files (x86)\Arduino\libraries\onewirearduinoslave
exit status 1
Błąd kompilacji dla płytki Arduino/Genuino Mega or Mega 2560.


Czy jest na to jakaś rada ?


RE: Jak wysyłać sygnał 1-Wire z Arduino ? - Agregacik - 14-02-2021

Poszukaj w necie podobnych rozwiązań. Są zapewne inne biblioteki. Ja bawiłem się tylko z nano lub uno i działało. Robiłem to z ciekawości i nie zastosowałem tego w praktyce.


RE: Jak wysyłać sygnał 1-Wire z Arduino ? - kaczakat - 19-02-2021

W tej bibliotece do DS slave w lowlevel.h jest używany dostęp do przerwań na niskim poziomie w taki sposób, że są one zdefiniowane tylko dla wybranych uC, np. 328P i Attiny85, innych z AVR nie widzę, tak że użyj tych lub szukaj innej biblioteki. Zresztą jak będziesz używał dość mocno uC to i tak się wszystko rozjedzie, więc po prostu weź 328P, wgraj ten szkic, wyślij mu dane po UART z MEGA, a ten dalej będzie udawał DS'a dla STM32.


RE: Jak wysyłać sygnał 1-Wire z Arduino ? - HAL_9000_PL - 19-02-2021

Zaczęło mi działać Smile ! Więc to już coś. Kod z przykładu FakeDS18B20. Mam jedynie problemy z tym, że gdy robię to pomiędzy dwoma Arduino to co jakiś czas zamiast wpisanej wartości (42) wywala mi wartość -127 czyli nie czyta. Musi coś być z brakiem dokładnego "zgrania się" mastera i slava. Doszedłem do tego, że za to odpowiada ta funkcja IF, ale niestety Sad, nie rozumiem jej:
Kod:
if (localState == DS_ConvertingTemperature && millis() > localConversionStartTime + 750)
{
float temperature = 42.0f; // here you could plug any logic you want to return the emulated temperature
int16_t raw = (int16_t)(temperature * 16.0f + 0.5f);

byte data[9];
data[0] = (byte)raw;
data[1] = (byte)(raw >> 8);
for (int i = 2; i < 8; ++i)
data[i] = 0;
data[8] = OWSlave.crc8(data, 8);

cli();
memcpy((void*)scratchpad, data, 9);
state = DS_TemperatureConverted;
OWSlave.beginWriteBit(1, true); // now that conversion is finished, start sending ones until reset
sei();
}
750....to pewnie max czas reakcji DS18B20