Witam
Pewnie zaraz mnie tu Napadniecie ale walczę z dwunastoma czujnikami DS18B20.
Otóż:
Domyślnie w systemie ma pracować 12 sztuk czujników (ale chciałbym mieć możliwość dołożenia kolejnych).
Oczywiście muszę sterować nimi znając ich seriale. Nie chcę umieszczać ich seriali w programie na stałe bo jak coś padnie to będzie lipa. Więc muszę wyszukać i odpytać każdy z istniejących czujników i zapisać serial każdego do zmiennej. Robię to (wg. mnie błędnie- ale seriale zapisuje) tak :
Pewnie mógłbym to zrobić lepiej tak:
Ale nie sprawdzałem czy to zadziała poprawnie.
Gdzie informuje system że czujnik numer X jest podłączony lub nie.
Teraz przyszła kolej na ID i robię to tak:
Mam zamiar to znacznie skrócić ale nie bardzo mam pojęcie jak. Chyba zrobię to w pętli.
Pełne ID zapisuję sobie do zmiennej (jako nazwę czujnika) tak:
Poprawcie mnie znowu jak można to zrobić prościej. Generalnie muszę mieć ID każdego z czujnika wyświetlone w menu jako nazwa tego czujnika.
W systemie mam sobie zrobione coś na wzór wielowątkowości i wykorzystuję timer który steruje skokami do podprogramów po ściśle odliczonym czasie.
Muszę przy takiej ilości czujników zrezygnować z paskudnego i chciałbym w jednym z "impulsów" timera wysłać polecenia odczytu do DS-ów a przy jakimś kolejnym odczytać odpowiedzi. Tym samym pozbędę się problemu z czekaniem na konwersję. Ale znowu motam się z tym jak tego dokonać.
Generalnie mając już ID każdego z istniejących czujników chciałbym mieć możliwość odpytania sobie dowolnego DS-a i nie musieć odczytywać wszystkich na raz. Wiem , wiem powiecie że wałkowane było to setki razy i rzeczywiście czytałem to wiele razy ale jak usiadłem to tego to.... pustka.
Jak na razie korzystam z przerostu formy nad treścią w taki sposób:
Wg. mnie robię to bezsensownie . I rzeczywiście tak jest bo przy 2-3 czujnikach pracuje to poprawnie ale przy 12 pojawiają się błędy bo nie czekam na konwersję.
Nie mam pojęcia jak to ogarnąć.
Reasumując, bo trochę namąciłem sporą ilością kodu.
Używając timera generuję sobie "polecenia" skoku do podprogramów i np.
- przy pierwszym impulsie od timera wysyłam zapytanie do czujników (może być do wszystkich na raz)
- przy kolejnym impulsie (mogę sobie ustawić że 1s później niż zapytanie) odczytuję sobie temperaturę z czujników ( może być od jednego lub od wszystkich)
Zatem:
1.Chciałbym na początku programu sprawdzić ile jest podłączonych czujek ( ale to wiem jak)
2.Odczytać ID każdego istniejącego czujnika (wszystkie na raz)
3.Zapisać ID każdego czujnika do zmiennej (najlepiej String)
4.W jakimś momencie chciałbym wyslać zapytanie do czujnika np.10
5.W jakimś kolejnej chwili chciałbym zczytać sobie temperaturę z wybranego czujnika.
Trochę zamieszałem ale nie potrafię tego napisać prościej.
Pewnie zaraz mnie tu Napadniecie ale walczę z dwunastoma czujnikami DS18B20.
Otóż:
Domyślnie w systemie ma pracować 12 sztuk czujników (ale chciałbym mieć możliwość dołożenia kolejnych).
Oczywiście muszę sterować nimi znając ich seriale. Nie chcę umieszczać ich seriali w programie na stałe bo jak coś padnie to będzie lipa. Więc muszę wyszukać i odpytać każdy z istniejących czujników i zapisać serial każdego do zmiennej. Robię to (wg. mnie błędnie- ale seriale zapisuje) tak :
W = 1wirecount()
Locate 3 , 1
Lcd "Ilosc wykrytych czujnikow :" ; W
Wait 1
If W > 0 Then
Dsid1(1) = 1wsearchfirst() 'Znajd? kolejny czujnik podpięty do portu
Ds(1) = 1
End If
If W > 1 Then
Dsid2(1) = 1wsearchnext() 'Znajd? kolejny czujnik podpięty do portu
Ds(2) = 1
End If
If W > 2 Then
Dsid3(1) = 1wsearchnext() 'Znajd? kolejny czujnik podpięty do portu
Ds(3) = 1
End If
If W > 3 Then
Dsid4(1) = 1wsearchnext() 'Znajd? kolejny czujnik podpięty do portu
Ds(4) = 1
End If
If W > 4 Then
Dsid5(1) = 1wsearchnext() 'Znajd? kolejny czujnik podpięty do portu
Ds(5) = 1
End If
If W > 5 Then
Dsid6(1) = 1wsearchnext() 'Znajd? kolejny czujnik podpięty do portu
Ds(6) = 1
End If
If W > 6 Then
Dsid7(1) = 1wsearchnext() 'Znajd? kolejny czujnik podpięty do portu
Ds(7) = 1
End If
If W > 7 Then
Dsid8(1) = 1wsearchnext() 'Znajd? kolejny czujnik podpięty do portu
Ds(8) = 1
End If
If W > 8 Then
Dsid9(1) = 1wsearchnext() 'Znajd? kolejny czujnik podpięty do portu
Ds(9) = 1
End If
If W > 9 Then
Dsid10(1) = 1wsearchnext() 'Znajd? kolejny czujnik podpięty do portu
Ds(10) = 1
End If
If W > 10 Then
Dsid11(1) = 1wsearchnext() 'Znajd? kolejny czujnik podpięty do portu
Ds(11) = 1
End If
If W > 11 Then
Dsid12(1) = 1wsearchnext() 'Znajd? kolejny czujnik podpięty do portu
Ds(12) = 1
End IfPewnie mógłbym to zrobić lepiej tak:
W = 1wirecount()
For i = 1 to W
Dsid(i) = 1wsearchnext()
DS(i) =1
next Ale nie sprawdzałem czy to zadziała poprawnie.
Gdzie
Ds(x) = 1Teraz przyszła kolej na ID i robię to tak:
If Dsid1(8) = Crc8(dsid1(1) , 7) Then
Locate 4 , 1
Lcd "CRC OK Czujnik 1 ID: "
Locate 4 , 23
For B = 1 To 8
Lcd Hex(dsid1(b))
Next
End If
If Dsid2(8) = Crc8(dsid2(1) , 7) Then
Locate 5 , 1
Lcd "CRC OK Czujnik 2 ID: "
Locate 5 , 23
For B = 1 To 8
Lcd Hex(dsid2(b))
Next
End If
If Dsid3(8) = Crc8(dsid3(1) , 7) Then
Locate 6 , 1
Lcd "CRC OK Czujnik 3 ID: "
Locate 6 , 23
For B = 1 To 8
Lcd Hex(dsid3(b))
Next
End If
If Dsid4(8) = Crc8(dsid4(1) , 7) Then
Locate 7 , 1
Lcd "CRC OK Czujnik 4 ID: "
Locate 7 , 23
For B = 1 To 8
Lcd Hex(dsid4(b))
Next
End If
If Dsid5(8) = Crc8(dsid5(1) , 7) Then
Locate 8 , 1
Lcd "CRC OK Czujnik 5 ID: "
Locate 8 , 23
For B = 1 To 8
Lcd Hex(dsid5(b))
Next
End If
If Dsid6(8) = Crc8(dsid6(1) , 7) Then
Locate 9 , 1
Lcd "CRC OK Czujnik 6 ID: "
Locate 9 , 23
For B = 1 To 8
Lcd Hex(dsid6(b))
Next
End If
If Dsid7(8) = Crc8(dsid7(1) , 7) Then
Locate 10 , 1
Lcd "CRC OK Czujnik 7 ID: "
Locate 10 , 23
For B = 1 To 8
Lcd Hex(dsid7(b))
Next
End If
If Dsid8(8) = Crc8(dsid8(1) , 7) Then
Locate 11 , 1
Lcd "CRC OK Czujnik 8 ID: "
Locate 11 , 23
For B = 1 To 8
Lcd Hex(dsid8(b))
Next
End If
If Dsid9(8) = Crc8(dsid9(1) , 7) Then
Locate 12 , 1
Lcd "CRC OK Czujnik 9 ID: "
Locate 12 , 23
For B = 1 To 8
Lcd Hex(dsid9(b))
Next
End If
If Dsid10(8) = Crc8(dsid10(1) , 7) Then
Locate 13 , 1
Lcd "CRC OK Czujnik 10 ID: "
Locate 13 , 23
For B = 1 To 8
Lcd Hex(dsid10(b))
Next
End If
If Dsid11(8) = Crc8(dsid11(1) , 7) Then
Locate 14 , 1
Lcd "CRC OK Czujnik 11 ID: "
Locate 14 , 23
For B = 1 To 8
Lcd Hex(dsid11(b))
Next
End If
If Dsid12(8) = Crc8(dsid12(1) , 7) Then
Locate 15 , 1
Lcd "CRC OK Czujnik 12 ID: "
Locate 15 , 23
For B = 1 To 8
Lcd Hex(dsid12(b))
Next
End IfMam zamiar to znacznie skrócić ale nie bardzo mam pojęcie jak. Chyba zrobię to w pętli.
Pełne ID zapisuję sobie do zmiennej (jako nazwę czujnika) tak:
Ntemp(1) = Str(dsid1(1)) + Str(dsid1(2)) + Str(dsid1(3)) + Str(dsid1(4)) + Str(dsid1(5)) + Str(dsid1(6)) + Str(dsid1(7)) + Str(dsid1(8) )Poprawcie mnie znowu jak można to zrobić prościej. Generalnie muszę mieć ID każdego z czujnika wyświetlone w menu jako nazwa tego czujnika.
W systemie mam sobie zrobione coś na wzór wielowątkowości i wykorzystuję timer który steruje skokami do podprogramów po ściśle odliczonym czasie.
Muszę przy takiej ilości czujników zrezygnować z paskudnego
Waitms 750Generalnie mając już ID każdego z istniejących czujników chciałbym mieć możliwość odpytania sobie dowolnego DS-a i nie musieć odczytywać wszystkich na raz. Wiem , wiem powiecie że wałkowane było to setki razy i rzeczywiście czytałem to wiele razy ale jak usiadłem to tego to.... pustka.
Jak na razie korzystam z przerostu formy nad treścią w taki sposób:
If Ds(1) = 1 Then
1wreset
1wwrite &H55
1wverify Dsid1(1) 'wysyłamy adres 1 czujnika
1wwrite &HBE
I1 = 1wread(2)
End If
If Ds(2) = 1 Then
1wreset
1wwrite &H55
1wverify Dsid2(1) 'wysylam adres 2 czujnika
1wwrite &HBE
I2 = 1wread(2)
End If
If Ds(3) = 1 Then
1wreset
1wwrite &H55
1wverify Dsid3(1) 'wysylam adres 3 czujnika
1wwrite &HBE
I3 = 1wread(2)
End If
If Ds(4) = 1 Then
1wreset
1wwrite &H55
1wverify Dsid4(1) 'wysylam adres 4 czujnika
1wwrite &HBE
I4 = 1wread(2)
End If
If Ds(5) = 1 Then
1wreset
1wwrite &H55
1wverify Dsid5(1) 'wysylam adres 5 czujnika
1wwrite &HBE
I5 = 1wread(2)
End If
If Ds(6) = 1 Then
1wreset
1wwrite &H55
1wverify Dsid6(1) 'wysylam adres 6 czujnika
1wwrite &HBE
I6 = 1wread(2)
End If
If Ds(7) = 1 Then
1wreset
1wwrite &H55
1wverify Dsid7(1) 'wysylam adres 7 czujnika
1wwrite &HBE
I7 = 1wread(2)
End If
If Ds(8) = 1 Then
1wreset
1wwrite &H55
1wverify Dsid8(1) 'wysylam adres 8 czujnika
1wwrite &HBE
I8 = 1wread(2)
End If
If Ds(9) = 1 Then
1wreset
1wwrite &H55
1wverify Dsid9(1) 'wysylam adres 9 czujnika
1wwrite &HBE
I9 = 1wread(2)
End If
If Ds(10) = 1 Then
1wreset
1wwrite &H55
1wverify Dsid10(1) 'wysylam adres 10 czujnika
1wwrite &HBE
I10 = 1wread(2)
End If
If Ds(11) = 1 Then
1wreset
1wwrite &H55
1wverify Dsid11(1) 'wysylam adres 11 czujnika
1wwrite &HBE
I11 = 1wread(2)
End If
If Ds(12) = 1 Then
1wreset
1wwrite &H55
1wverify Dsid12(1) 'wysylam adres 12 czujnika
1wwrite &HBE
I12 = 1wread(2)
End If
'--------konwersja temp dla wszystkich dsow
1wreset
1wwrite &HCC
1wwrite &H44
'Return
'******************************************************************************'
'**************************PROCEDURA 1WIRE-TEMPERATURA_READ********************'
'******************************************************************************'
'Temp_read:
I1 = I1 * 10
I1 = I1 / 16
Ss = Str(i1)
Ss = Format(ss , " 0.0")
Temp(1) = Ss
I2 = I2 * 10
I2 = I2 / 16
Ss = Str(i2)
Ss = Format(ss , " 0.0")
Temp(2) = Ss
I3 = I3 * 10
I3 = I3 / 16
Ss = Str(i3)
Ss = Format(ss , " 0.0")
Temp(3) = Ss
I4 = I4 * 10
I4 = I4 / 16
Ss = Str(i4)
Ss = Format(ss , " 0.0")
Temp(4) = Ss
I5 = I5 * 10
I5 = I5 / 16
Ss = Str(i5)
Ss = Format(ss , " 0.0")
Temp(5) = Ss
I6 = I6 * 10
I6 = I6 / 16
Ss = Str(i6)
Ss = Format(ss , " 0.0")
Temp(6) = Ss
I7 = I7 * 10
I7 = I7 / 16
Ss = Str(i7)
Ss = Format(ss , " 0.0")
Temp(7) = Ss
I8 = I8 * 10
I8 = I8 / 16
Ss = Str(i8)
Ss = Format(ss , " 0.0")
Temp(8) = Ss
I9 = I9 * 10
I9 = I9 / 16
Ss = Str(i9)
Ss = Format(ss , " 0.0")
Temp(9) = Ss
I10 = I10 * 10
I10 = I10 / 16
Ss = Str(i10)
Ss = Format(ss , " 0.0")
Temp(10) = Ss
I11 = I11 * 10
I11 = I11 / 16
Ss = Str(i11)
Ss = Format(ss , " 0.0")
Temp(11) = Ss
I12 = I12 * 10
I12 = I12 / 16
Ss = Str(i12)
Ss = Format(ss , " 0.0")
Temp(12) = Ss
Wg. mnie robię to bezsensownie . I rzeczywiście tak jest bo przy 2-3 czujnikach pracuje to poprawnie ale przy 12 pojawiają się błędy bo nie czekam na konwersję.
Nie mam pojęcia jak to ogarnąć.
Reasumując, bo trochę namąciłem sporą ilością kodu.
Używając timera generuję sobie "polecenia" skoku do podprogramów i np.
- przy pierwszym impulsie od timera wysyłam zapytanie do czujników (może być do wszystkich na raz)
- przy kolejnym impulsie (mogę sobie ustawić że 1s później niż zapytanie) odczytuję sobie temperaturę z czujników ( może być od jednego lub od wszystkich)
Zatem:
1.Chciałbym na początku programu sprawdzić ile jest podłączonych czujek ( ale to wiem jak)
2.Odczytać ID każdego istniejącego czujnika (wszystkie na raz)
3.Zapisać ID każdego czujnika do zmiennej (najlepiej String)
4.W jakimś momencie chciałbym wyslać zapytanie do czujnika np.10
5.W jakimś kolejnej chwili chciałbym zczytać sobie temperaturę z wybranego czujnika.
Trochę zamieszałem ale nie potrafię tego napisać prościej.
