• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 1 głosów - średnia: 5
  • 1
  • 2
  • 3
  • 4
  • 5
Jak wysyłać sygnał 1-Wire z Arduino ?
#1
Lightbulb 
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 ?
 
Odpowiedź
#2
Może to Ci pomoże.


Załączone pliki
.zip   onewirearduinoslave.zip (Rozmiar: 16.67 KB / Pobrań: 3)
 
Odpowiedź
#3
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 ?
 
Odpowiedź
#4
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.
 
Odpowiedź
#5
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.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#6
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
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości