' ========================================================================= 'KVAR ATT GÖRA '1: Styra till och från slag beroende på fuktvärden i grunden (norra och södra) ' eller aktiverad brytare från "hus" enheten '2: Styra till och från slag beroende på vatten nivån ' eller aktiverad brytare från "hus" enheten '3: Skicka tillbaka svar på status ON/off på alla enheter '4: Beräkna avfuktad volym och lagra undan den månadsvis på EEprom '5: Beräkna gångtid, förbrukad effekt på fläkt och avfuktare och lagra undan månadsvis ' ' ' ' ' ' ' ' ========================================================================= ' {$STAMP BS2p} ' {$PBASIC 2.5} ' ' ========================================================================= ' -----[ Program Description ]--------------------------------------------- ' -----[ Revision History ]------------------------------------------------ ' -----[ I/O Definitions ]------------------------------------------------- TxSig PIN 0 'Serial output to Transmitter RxSig PIN 14 'Serial input to REciever FAN PIN 10 'Grön LED Simulerar på fläkt Avfuktare PIN 11 'Grön LED Simulerar på avfuktare Pump PIN 12 'Gul Led simulerar pump på av Lampa PIN 13 'Röd Led simulerar lampa Ping PIN 15 'Ping))) IO pin ' -----[ Constants ]------------------------------------------------------- PingScale CON $0CD ' raw x 0.80 = uS T19K2 CON 110 'Baudrate 19200 Trigger CON 13 ' 'mm: 1 enhet är 0.80 = uS. 13 är mao = 10,4 us i längd. Denna trigger används för att bestämma tiden som sändning skall göras RawToMm CON 22090 ' 1 / 2.967 (with ** & V=337m/s som gäller vi 12,5 grader celcius) IsHigh CON 1 ' for PULSOUT IsLow CON 0 cs CON 1 'AD omvandlarens "Enable/Disable" pinne serDin CON 3 'Serial data in från MAX på PIN3 SerDo CON 2 'Serial data ut till MAX på PIN2 serClk CON 4 'SerialClock ut till MAX ' -----[ Variables ]------------------------------------------------------- rawDist VAR Word ' raw measurement mm VAR Word TempN VAR Byte 'Temp norra delen mot dungen TempS VAR Byte 'Temp Södra delen mot Vägen FuktN VAR Word 'Fukt Norra delen mot Dungen ' FuktS VAR Word 'Fukt Södra delen mot Vägen MINUTE VAR Byte 'Förlupnasekunder för att mäta flöden Voltoffset VAR Byte 'För att räkna hur mycket inspänningen understiger 5V Fan_ON_OFF VAR Bit 'Indikator för fläkt På eller av Avfukt_ON_OFF VAR Bit 'Indikator för avfukt På eller av Pump_on_off VAR Bit 'Indikator för pump på eller av Lamp_on_off VAR Bit 'Indikator för lampa på eller av Fan_ON_OFF_ACK VAR Bit 'Indikator för fläkt På eller av Avfukt_ON_OFF_ACK VAR Bit 'Indikator för avfukt På eller av Pump_on_off_ACK VAR Bit 'Indikator för pump på eller av Lamp_on_off_ACK VAR Bit 'Indikator för lampa på eller av RSSI VAR Word 'Signalstyrkan för motagning n VAR Byte 'Räknare för simulering av tillslag Checksum1 VAR Nib Checksum2 VAR Nib '*******ADCstart Channel VAR Nib 'set channel to 0 for if your using CH0. 1 if your using Ch1 and so on. Chsel VAR Byte 'channel selec RawADCin VAR Word 'ADC värde X Y VAR Word 'Filtrerat värde in Y ADCin VAR Word 'ADC filter output Z i VAR Nib j VAR Nib 'Kolla starten på första ADC omvandlingen för att initialisera alla värden ofiltrarat. k VAR Nib '*******ADC slut ' -----[ EEPROM Data ]----------------------------------------------------- ' -----[ Initialization ]-------------------------------------------------- ' -----[ Program Code ]---------------------------------------------------- j=0 HIGH cs INPUT 7 'ACKNOWLEGE för Fläkt Main: DO GOSUB Sonar ' get sensor value from SOnar GOSUB chkADC GOSUB Transmitt GOSUB Recieve PAUSE 50 GOSUB ACknowledge GOSUB Styrning LOOP 'main loop END ' -----[ Subroutines ]----------------------------------------------------- ACknowledge: IF (IN7 = 0) THEN FAN_ON_OFF_ACK=0 ELSE FAN_ON_OFF_ACK=1 ENDIF RETURN Styrning: IF Lamp_ON_OFF=1 THEN FOR n=0 TO 20 HIGH 10 PAUSE 10 LOW 10 PAUSE 10 NEXT ELSE LOW 10 ENDIF IF Pump_ON_OFF=1 THEN FOR n=0 TO 20 HIGH 11 PAUSE 10 LOW 11 PAUSE 10 NEXT ELSE LOW 11 ENDIF IF Avfukt_ON_OFF=1 THEN FOR n=0 TO 20 HIGH 12 PAUSE 10 LOW 12 PAUSE 10 NEXT ELSE LOW 12 ENDIF IF Fan_ON_OFF=1 THEN FOR n=0 TO 20 HIGH 13 PAUSE 10 LOW 13 PAUSE 10 NEXT ELSE LOW 13 ENDIF RETURN Sonar: Ping = IsLow ' make trigger 0-1-0 PULSOUT Ping, Trigger ' activate sensor PULSIN Ping, IsHigh, rawDist ' measure echo pulse rawDist = rawDist */ PingScale ' convert to uS rawDist = rawDist / 2 ' remove return trip 'Nedan korigerar jag för att det är hypotenusan man mäter och ej riktig längd 'Vidare har jag en del oskalat samt två skalade för att ej överskrida 65536 i beräkningarna. mm = rawDist ** RawToMm MAX 255 mm = mm MIN 10 IF RawDist<256 THEN 'Max är ca 75mm med denna tid RawDist=(RawDist*RawDist-(39*39)) '39us motsvarar halva avståndet i us mellan sändare och mottagare Rawdist=SQR(RawDist) mm = rawDist ** RawToMm mm=mm-6 ELSE IF Rawdist*3/4<256 THEN 'MAX ÄR ca 105 mm med detta RawDist=RawDist*3/4 RawDist=(RawDist*RawDist-(30*30)) '39us/4*3 är ca 30 motsvarar halva avståndet i us mellan sändare och mottagare Rawdist=SQR(RawDist) mm = rawDist ** RawToMm mm=mm*4/3 mm=mm-10 ELSE mm = rawDist ** RawToMm mm=mm-11 ENDIF ENDIF RETURN Transmitt: checksum1=checksum1+1 HIGH 8 PULSOUT TxSig,10000 'Skickar en synk puls till motagaren För BS" var längden 1200 men detta gällde för BS2 med 2 us per cykel, för samma tid på BS2P blir det 2/0,8*1200=3000 SEROUT TxSig,18447,["abc",checksum1,mm, TempN, FuktN.HIGHBYTE,FuktN.LOWBYTE] PAUSE 10 SEROUT TxSig,18447,[TempS,FuktS.HIGHBYTE,FuktS.LOWBYTE] PAUSE 10 SEROUT TxSig,18447,[Fan_ON_OFF,FAN_ON_OFF_ACK,Avfukt_ON_OFF,Pump_on_off,Lamp_on_off,RSSI,checksum2] 'SEROUT Tpin {\Fpin}, Baudmode, {Pace,} {Timeout, Tlabel,} [Out DATA] 'I tried also to send them in a single serout but the performance was worse LOW 8 HIGH FAN PAUSE 10 LOW FAN RETURN ' Baudmode skiljer mellan BS2 och BS2P Recieve: DEBUG"WAIT for RECIEVING", CR PUT 16, Fan_ON_OFF PUT 17, Avfukt_ON_OFF PUT 18, Pump_on_off PUT 19, Lamp_on_off HIGH 9 PAUSE 10 SERIN RxSig,18447,100,No_Data,[WAIT("jkl"),checksum1,Fan_ON_OFF,Avfukt_ON_OFF,Pump_on_off,Lamp_on_off,checksum2] LOW 9 IF checksum2=5 THEN ELSE checksum1=2 checksum2=5 GET 16, Fan_ON_OFf GET 17, Avfukt_ON_OFF GET 18, Pump_on_off GET 19, Lamp_on_off ENDIF HIGH 13 'REcieving indicator LED on PIN1 PAUSE 50 LOW 13 RETURN No_Data: DEBUG "TIMED out!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", CR checksum1=5 RETURN chkADC: FOR i = 0 TO 7 'read channel 0 to 7 LOW cs 'enable channel =i 'set Channel = x, x being a nubmer between 0 to 7 depending on the channel you are using LOOKUP channel, [142, 206,158,222,174,238,190,254],chsel 'tell Adc what channel SHIFTOUT SerDo, serClk, MSBFIRST,[chsel] 'send the channel data HIGH cs LOW SerDo LOW cs IF i=0 THEN SHIFTIN serDin, serClk,MSBPOST,[RawADCin\12] 'Gäller kanal 0 GOSUB FilterADC ELSE IF i=1 THEN SHIFTIN serDin, serClk,MSBPOST,[RawADCin\12] 'Gäller kanal 1 GOSUB FilterADC ELSE IF i=2 THEN SHIFTIN serDin, serClk,MSBPOST,[RawADCin\12] 'Gäller kanal 2 GOSUB FilterADC ELSE IF i=3 THEN SHIFTIN serDin, serClk,MSBPOST,[RawADCin\12] 'Gäller kanal 3 GOSUB FilterADC ELSE IF i=4 THEN SHIFTIN serDin, serClk,MSBPOST,[RawADCin\12] 'Gäller kanal 4 GOSUB FilterADC DEBUG "RSSI= ", DEC ADCin,CR ELSE IF i=5 THEN SHIFTIN serDin, serClk,MSBPOST,[RawADCin\12] 'Gäller kanal 5 GOSUB FilterADC IF ADCin >250 THEN TempN=249 ELSE TempN= ADCin.LOWBYTE MAX 300 TempN= TempN MIN 50 ENDIF ELSE IF i=6 THEN SHIFTIN serDin, serClk,MSBPOST,[RawADCin\12] 'Gäller kanal 6 GOSUB FilterADC FuktN=ADCin/10*161/(500-(voltoffset/10))*100-2600/10+4 'bygger på formeln (Vut/Vin-0,16)*1/0,0062 FuktN=FuktN MAX 999 FuktN=FuktN MIN 0 DEBUG "Fukten är =", DEC FuktN,CR DEBUG "Temperaturen är=", DEC TempN, CR ELSE SHIFTIN serDin, serClk,MSBPOST,[RawADCin\12] 'Gäller kanal 7 GOSUB FilterADC Voltoffset= (2500-ADCin)*2 MAX 500 'Hälften av 5000 är 2500. Om jag mäter 2473 blir Voltoffset= Voltoffset MIN 0 'underspänning 27mV*2=54mV. DEBUG "Underpänning mot 5V =", DEC Voltoffset," mV", CR ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF HIGH cs NEXT RETURN FilterADC: 'Denna lagar undan ett initial värde på sensorn för IF J=i THEN 'minska filtertiden i början Y=rawADCin*16 J=j+1 PUT (i*2),Y.HIGHBYTE PUT (i*2+1),Y.LOWBYTE ELSE:ENDIF GET (i*2),Y.HIGHBYTE 'Hämtar föregående värde GET (i*2+1),Y.LOWBYTE 'Hämtar föregående värde Y = Y ** 61441 + rawADCin ' smoothing function PUT (i*2),Y.HIGHBYTE 'LAgrar undan nytt värde PUT (i*2+1),Y.LOWBYTE 'LAgrar undan nytt värde ADCin = Y/16 'Beräknar filtrerat ADCin värde RETURN