B4R Library OneWire - Dallas 1-wire protocol

This library is based on the following open source project: http://www.pjrc.com/teensy/td_libs_OneWire.html

License: https://github.com/PaulStoffregen/OneWire/blob/master/OneWire.cpp

It implements Dallas 1-wire protocol.

Example of reading the temperature:
Depends on rOneWire and rRandomAccessFile libraries.
B4X:
Sub Process_Globals
   Public Serial1 As Serial
   Private onewire As OneWire
   Private timer1 As Timer
   Private bc As ByteConverter
   Private address(8) As Byte
   Private type_s As Boolean
End Sub

Private Sub AppStart
   Serial1.Initialize(115200)
   Log("AppStart")
   onewire.Initialize(10)
   timer1.Initialize("timer1_Tick", 2000)
   timer1.Enabled = True
End Sub

Sub Timer1_Tick
   If onewire.Search(address) = False Then
     onewire.ResetSearch
     Log("No more addresses.")
     Return
   End If
   Log("ROM = ", bc.HexFromBytes(address))
   If onewire.CRC8(address, 7) <> address(7) Then
     Log("CRC is not valid!")
     Return
   End If
   Select address(0)
     Case 0x10
       Log("Chip = DS18S20")
       type_s = True
     Case 0x28
       Log("Chip = DS18B20")
       type_s = False
     Case 0x22
       Log("Chip = DS1822")
       type_s = False
     Case Else
       Log("Device is not a DS18x20 family device.")
       Return
   End Select
   onewire.Reset
   onewire.Select(address)
   onewire.Write(0x44, True)
   'give it 1 second to read the temperature
   CallSubPlus("ReadTemparature", 1000, 0)
End Sub

Private Sub ReadTemparature (u As Byte)
   onewire.Reset
   onewire.Select(address)
   onewire.Write(0xBE, False)
   Dim data(12) As Byte
   onewire.ReadBytes(data, 9)
   Log("Data = ", bc.HexFromBytes(data))
   Log("CRC = ", bc.HexFromBytes(Array As Byte(onewire.CRC8(data, 8))))
   Dim raw As Int = Bit.Or(Bit.ShiftLeft(data(1), 8), data(0))
   If type_s Then
     raw = Bit.ShiftLeft(raw, 3)
     If data(7) = 0x10 Then
       raw = Bit.And(raw, 0xFFF0) + 12 - data(6)
     End If
   Else
     Dim cfg As Byte = Bit.And(data(4), 0x60)
     If cfg = 0 Then
       raw = Bit.And(raw, Bit.Not(7))
     Else if cfg = 0x20 Then
       raw = Bit.And(raw, Bit.Not(3))
     Else if cfg = 0x40 Then
       Bit.And(raw, Bit.Not(1))
     End If
   End If
   Dim celsius As Double = raw / 16
   Dim fahrenheit As Double = celsius * 1.8 + 32
   Log("Temperature = ", NumberFormat(celsius, 0, 2), " Celsius, " _
     , NumberFormat(fahrenheit, 0, 2), " Fahrenheit")
End Sub

Note that unlike the original C example, the main thread is not blocked here while waiting for the data to be ready.
 

Attachments

  • rOneWire.zip
    13 KB · Views: 1,353

phil31

Member
my apologies ..
just that i had not selected the right OneWire library ....

sorry and thanks for your reply
 
Last edited:

Michael1968

Active Member
Licensed User
Longtime User
dear users,

sorry, i'm newbie with BAR !
i try to use this library. i install it and she's right identified in the right window.
but i got an error when i try to declare this object : "unknow type, are you missing a library reference" ?
(line 19 ) ! ??
what is miss please ?

View attachment 100084

thanks, regards
Phil
you did not select rOneWire;)
 

phil31

Member
back again ..
i'm trying the sample of the first page, on MEGA2560.
no errors or warning in the left window, but during compilation i receive this error :

1600372400355.png


any tips please ?

thanks
 

phil31

Member
Erel, i'm not sure to right understand what you mean ..
this code is in the thread "B4R Arduino / ESP .." !?
 

phil31

Member
this thread is in the B4R section !


the problem occur as soon as i enable the B4XTable 1.11 lib.
without using any methods ..? (all ByteConverter in the sample are commented )

regards
 
Last edited:
Top