German BLE2 TI Sensor Tag

Wolli013

Well-Known Member
Licensed User
Longtime User
Bis jetzt scheint es zu laufen, hier der versprochene Code.
Vielleicht weis ja noch einer wie der Code besser zu gestalten ist.
B4X:
#Region  Service Attributes
    #StartAtBoot: False
    #ExcludeFromLibrary: True
#End Region

Sub Process_Globals
    Public manager As BleManager2
    Public currentStateText As String = "UNKNOWN"
    Public currentState As Int
    Public connected As Boolean = False
    Public ConnectedName As String
    Private ConnectedServices As List
    Dim BlueATemperatur,BlueALuftfeuchtigkeit As Double = 0
End Sub

Sub Service_Start (StartingIntent As Intent)
End Sub

Sub Service_Create
    manager.Initialize("manager")
End Sub

Public Sub Scan
    manager.Scan(Null) 'alle Geräte scannen
End Sub
 
Public Sub ReadData
    For Each s As String In ConnectedServices
     manager.ReadData(s)
    Next
End Sub

Public Sub Disconnect
    manager.Disconnect
End Sub

Sub Manager_StateChanged (State As Int)
    Select State
        Case manager.STATE_POWERED_OFF
            currentStateText = "POWERED OFF"
        Case manager.STATE_POWERED_ON
            currentStateText = "POWERED ON"
        Case manager.STATE_UNSUPPORTED
            currentStateText = "UNSUPPORTED"
    End Select
    currentState = State
End Sub

Sub Manager_DeviceFound (Name As String, Id As String, AdvertisingData As Map, RSSI As Double)
Log("Name: " & Name)
 Log("Mac Adresse: " & Id)
  Log("RSSI: " & RSSI)
   Log("Zusatzdaten: " & AdvertisingData)
    ConnectedName = Name
     manager.StopScan
      manager.Connect(Id)
End Sub
 
Public Sub writeData1
'Temperatur und Feuchtresensor
    manager.SetNotify("f000aa20-0451-4000-b000-000000000000","f000aa21-0451-4000-b000-000000000000",True)
    Log("Set Notify")
    Sleep(1000)
    
    Dim valoriByte(1) As Byte
    valoriByte(0)=0x01
    manager.WriteData("f000aa20-0451-4000-b000-000000000000","f000aa22-0451-4000-b000-000000000000",valoriByte)
    Log("Set WriteData1")   
    Sleep(1000)

    Dim valoriByte(1) As Byte 'Period
    valoriByte(0)=0xFF
    manager.WriteData("f000aa20-0451-4000-b000-000000000000","f000aa23-0451-4000-b000-000000000000",valoriByte)
    Log("Set WriteData2")   
    Sleep(1000)   
'Period AA23* R/W  2.55 sec (0xFF). Default 1 second (0x64).
End Sub

Sub Manager_DataAvailable (ServiceId As String, Characteristics As Map)
 
        Private tem,hum As Int
        Private temp1,temp2,hum1 As Float
        Dim ArrayBytes() As Byte = Characteristics.Get("f000aa21-0451-4000-b000-000000000000")
 
        tem = (ArrayBytes(1)*256) + ArrayBytes(0)
        hum = (ArrayBytes(3)*256) + ArrayBytes(2)
        hum = Bit.And(0x0000ffff, hum)
 
        temp1 = (tem/65536)*165-40 ' = Grad
        temp2 = ((temp1*9.0)/5.0)+32.0 ' = Fahrenheit
        hum1 = (hum/65536)*100 ' = Relative Luftfeuchtigkeit
         Log("Temperatur-Grad = " & NumberFormat(temp1, 1, 2))
          Log("Temperatur-Fahrenheit = " & NumberFormat(temp2, 1, 2))
           Log("Relative-Feuchte = " & NumberFormat(hum1, 1, 2))
 
        If hum1 > 100 Then hum1 = 100
         BlueATemperatur = NumberFormat(temp1, 1, 2) 'Übergabedaten
          BlueALuftfeuchtigkeit = NumberFormat(hum1, 1, 2) 'Übergabedaten
 
End Sub

Sub Manager_Connected (services As List)
    Log("Connected")
    connected = True
    ConnectedServices = services
    Sleep(2000)   
    writeData1
End Sub

Sub Manager_Disconnected
    Log("Disconnected")
    connected = False
End Sub

Sub Manager_RssiAvailable (Success As Boolean, RSSI As Double)
   Log(Success)
   Log(RSSI)
End Sub

Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
    Return True
End Sub
 

pucki

Active Member
Licensed User
Longtime User
If hum1 > 100 Then hum1 = 100 <- Das die beste Zeile im code.

If wasser > zu_nass then wasser = nass ;);););)

Aber ansonsten feine Arbeit.

Gruß

Pucki
 

Wolli013

Well-Known Member
Licensed User
Longtime User
Ja oft gehen die über 100% und dann wird es blöde angezeigt!
Deswegen die Codezeile :)
 

pucki

Active Member
Licensed User
Longtime User
Die normale Luftfeuchtigkeit liegt zwischen 45 + 60 % in unseren Breitengraden. Wobei du dich bei 60% schon fühlst wie gebadet weil dir der Schweiß den popo runter rennt.

Zitat aus Wiki : "Bei 100 % relativer Luftfeuchtigkeit ist die Luft vollständig mit Wasserdampf gesättigt. Man spricht auch davon, die „Wasserdampfkapazität“ sei erreicht. Wird die Sättigung von 100 % überschritten, so kann sich die überschüssige Feuchtigkeit als Kondenswasser bzw. Nebel niederschlagen."

Diesen Effekt bekommst du nur kurzfristig wenn du den Sensor anhauchst, da der Atem des Menschen sehr feucht ist.

Ansonsten sind das Messfehler. Solche Messfehler sind aber bekannt. Deshalb habe ich ja dir oben geschrieben die Messergebnisse in einer 10 er Schleife auszulesen, und dann den Mittelwert anzugeben. Es gibt jede Menge Einflüsse (Wiederstand/ Lötstellen / Umwelteinflüsse etc.) die das Messergebnis verfälschen. Deshalb die Schleife.

Gruß

Pucki
 

Wolli013

Well-Known Member
Licensed User
Longtime User
Das mit der Schleife habe ich für meinem Code nicht richtig verstanden!
Wenn du Lust hast kannst du das ja mal in meinem Code einfügen und hier wieder einstellen.
 

DonManfred

Expert
Licensed User
Longtime User
Das mit der Schleife habe ich für meinem Code nicht richtig verstanden!
- Erstelle eine Liste
- Wenn die Liste >10 Einträge hat, lösche den ersten Eintrag aus ihr.
- Füge den neuen Messwert hinzu
- Schreibe eine Sub die dir den Mittelwert der 10 einträge anzeigt.
Mittelwert = (1+2+3+4+5+6+7+8+9+10)/10
 

pucki

Active Member
Licensed User
Longtime User
Ist ganz einfach.

Du machst folgendes :

wert = 0
for i = 1 to 10
wert = wert + Sensor_wert '<- Sensorwert ist in dein Fall das Ergebnis deiner Berechnung.
next i

Temperatur = wert / 10 ' ergibt ein Mittelwert aller 10 Messergebnisse.


Das ganze basiert auf der Theorie das absoluten Mittelwert.


Gruß

Pucki
 

MaFu

Well-Known Member
Licensed User
Longtime User
B4X:
...
hum = (ArrayBytes(3)*256) + ArrayBytes(2)
hum = Bit.And(0x0000ffff, hum)
...
Das passt so (weitestgehend), du kannst es auch gleich zusammenfassen:
B4X:
hum = Bit.And(ArrayBytes(3) * 256 + ArrayBytes(2), 0x0000ffff)


Das Ergebnis stimmt aber in dem Moment nicht wo "ArrayBytes(2)" einen Wert größer 127 enthält und dadurch negativ wird. Dann wird es nämlich vom ersten Wert abgezogen anstatt hinzugefügt.
Korrekt wird das Ergebnis so:
B4X:
hum = Bit.And(Bit.Or(Bit.ShiftLeft(ArrayBytes(3), 8), ArrayBytes(2)), 0x0000ffff)
 

Wolli013

Well-Known Member
Licensed User
Longtime User
Dieser Sensortag ist wirklich Interessant und auch der einzige den ich gefunden habe hier in Deutschland der eine offene Schnittstelle hat.
 

MaFu

Well-Known Member
Licensed User
Longtime User
@MaFu
Die Zusammenfassung klappt aber das letzte geht nicht da kommen immer knapp 99%rF raus.
Immer? Kann eigentlich gar nicht sein. Welche Werte stehen denn in ArrayBytes(2) und ArrayBytes(3)?
 

Wolli013

Well-Known Member
Licensed User
Longtime User
So einmal wie es richtig läuft.

Relative-Feuchte = 18.64
ArrayBytes(3)*256 = 12288
ArrayBytes(2) = -72
Temperatur-Grad = 18.56
Temperatur-Fahrenheit = 65.41
Relative-Feuchte = 18.64
ArrayBytes(3)*256 = 12288
ArrayBytes(2) = -72
Temperatur-Grad = 18.56
Temperatur-Fahrenheit = 65.41
Relative-Feuchte = 18.64
Connected: CC2650 SensorTag
ArrayBytes(3)*256 = 12288
ArrayBytes(2) = -72
Temperatur-Grad = 18.56
Temperatur-Fahrenheit = 65.41
Relative-Feuchte = 18.64
ArrayBytes(3)*256 = 12288
ArrayBytes(2) = -72
Temperatur-Grad = 18.56
Temperatur-Fahrenheit = 65.41
Relative-Feuchte = 18.64
ArrayBytes(3)*256 = 12288
ArrayBytes(2) = -72
Temperatur-Grad = 18.58
Temperatur-Fahrenheit = 65.45
Relative-Feuchte = 18.64
ArrayBytes(3)*256 = 12288
ArrayBytes(2) = -72
Temperatur-Grad = 18.56
Temperatur-Fahrenheit = 65.41
Relative-Feuchte = 18.64
Connected: CC2650 SensorTag
ArrayBytes(3)*256 = 12288
ArrayBytes(2) = -72
Temperatur-Grad = 18.56
Temperatur-Fahrenheit = 65.41
Relative-Feuchte = 18.64
ArrayBytes(3)*256 = 12288
ArrayBytes(2) = 120
Temperatur-Grad = 18.58
Temperatur-Fahrenheit = 65.45
Relative-Feuchte = 18.93


Und jetzt nochmal mit deiner letzten Zeile.

Connected: CC2650 SensorTag
ArrayBytes(3)*256 = -26368
ArrayBytes(2) = 116
Temperatur-Grad = 20.17
Temperatur-Fahrenheit = 68.31
Relative-Feuchte = 59.94
ArrayBytes(3)*256 = -26112
ArrayBytes(2) = 52
Temperatur-Grad = 20.19
Temperatur-Fahrenheit = 68.35
Relative-Feuchte = 60.24
ArrayBytes(3)*256 = -26112
ArrayBytes(2) = 116
Temperatur-Grad = 20.2
Temperatur-Fahrenheit = 68.37
Relative-Feuchte = 60.33
ArrayBytes(3)*256 = -26368
ArrayBytes(2) = -12
Temperatur-Grad = 20.2
Temperatur-Fahrenheit = 68.37
Relative-Feuchte = 99.98
Connected: CC2650 SensorTag
ArrayBytes(3)*256 = -26368
ArrayBytes(2) = 116
Temperatur-Grad = 20.22
Temperatur-Fahrenheit = 68.4
Relative-Feuchte = 59.94
ArrayBytes(3)*256 = -26624
ArrayBytes(2) = -8
Temperatur-Grad = 20.23
Temperatur-Fahrenheit = 68.42
Relative-Feuchte = 99.99
ArrayBytes(3)*256 = -26880
ArrayBytes(2) = -4
Temperatur-Grad = 20.23
Temperatur-Fahrenheit = 68.42
Relative-Feuchte = 99.99
ArrayBytes(3)*256 = -26880
ArrayBytes(2) = 0
Temperatur-Grad = 20.25
Temperatur-Fahrenheit = 68.46
Relative-Feuchte = 58.98
Connected: CC2650 SensorTag
 

MaFu

Well-Known Member
Licensed User
Longtime User
@MaFu
Die Zusammenfassung klappt aber das letzte geht nicht da kommen immer knapp 99%rF raus.
Da war noch ein kleiner Fehler drin. So bekommst Du unabhängig vom Vorzeichen immer die korrekten Werte:
B4X:
hum = Bit.Or(Bit.And(Bit.ShiftLeft(ArrayBytes(3), 8), 0x0000ffff), Bit.And(ArrayBytes(2), 0x000000ff))
 

MaFu

Well-Known Member
Licensed User
Longtime User
Kleiner Nachtrag noch.
Es ist zwar in diesem Fall wurscht, aber ganz korrekt wäre die Schreibweise so:
B4X:
hum = Bit.Or(Bit.And(Bit.ShiftLeft(ArrayBytes(3), 8), 0x0000ff00), Bit.And(ArrayBytes(2), 0x000000ff))
 
Top