! 03 mai 2017 ! version grafique avec thermometre et grafes evolution !.. à suivre : stockage dans fichier !! ========================= RFO-BASIC! Launcher v0.8 File transfered over LAN at -5586106594400 KB/s (13311 bytes in -0.000 second) >Exit code: 1 ============================ !! Progr$="DS18B20_x2_BT_16F1847_170503.bas" ! 28/04/2017 !RFO-BASIC! Launcher v0.8 !File transfered over LAN at 17454 KB/s !(17873 bytes in 0.001 second) !>Exit code: 1 !28/04/2017 ! version RFO basic 01.91 ! test avec archos ! Liaison BlueTooth HC06-0539R rouge avec Archos ! liaison UART -USB via cable Prolific (et Pilote version 2008 ) ! Terterm 19200 COM15 ! Alim 3.8V !Appli PIC16F en MikroC !#define Versus !#define Source !#define Projet !#define Hardware ! ! 12-11-2013 ! passage en mode GRAFIQUE !! ! Probleme chargement fichier image ! ATTENTION, ceux ci doivent etre present dans l'Archos Rfo-basic/data !--------------------- !connect !Hardware: !Module Bluetooth Rouge HC06_0536R relié directement sur URT 16F1847 !Alim 3,6V pour l'ensemble PIC et module BT !seuls TX et RX sont connecte !Archos 43 it !Association avec Bluetooth code =1234 ! dim ObjFixe[1] dim Obj[10] dim ObjStatus[10] dim ObjDiscordance[10] dim Bm[10] dim ArrPlan[1] dim Thermo[2] dim rec_Array$[5] % was 16 .. ATTENTION , ne pas dimensionner si usage de split debug.on A$=" " texte$=" " msgR$= " " msgE$= " " ! exemple de Trame recue !msgR$="j=116;T1= 22.56;T2= 22.81" ! text pointer for temperatures,and p0 for status msg ! p1,p2,p3,p4, et p0 print "init variables" nb=0 k1=0 nb=0 NumTrame=0 KL=0 premier=0 J3=0 K3=0 L3=0 M3=0 Longueur=0 I4=0 J4=0 B4$=" " ! touched zones t1=0 t2=0 t3=0 t4=0 NomFichier$="DS18B20_170502.log" SaveDatas$="DS18B20_2.txt" Texte$=" Status " Status$=" Status " TempInt$=" 20.00°C" TempExt$=" 19.99°C" Tex=20.0 Tin=20.0 Dummy=0.0 Old_Tin=20.0 Old_Tex=20.0 Kfilter=1.0 ! pour grafique Old_Y1=348 y1=348 Old_Y2=348 y2=275 Old_x0=275 x0=275 ttx=275 % position Y axe des X ! scaling sens Y : 255 pixel pour delta 40° scaling = 250/40 !Thermometer value displayd TH1 & TH2 ! delta Y theorique=250 ajustement graphique 245 ! delta degre C pas1=242/(40+10) pas2=242/(35-10) test=0 % 0=Avec BT 1=en test,pas de BT print "PC Asus Win10.1 Basic_Launcher V0.8 SCi" print "Version basic : 01.91" Device DV$ print "Device Info : "; DV$ print "En liaison BlueTooth avec" print "Directory : C:\_MikroC\_MesProjets_MikroC\_16F1847_OWS_DS18B20" print "Projet MikroC Pro V.701 : 16F1847_OWS_2x18B20_temper_2017.mcppi" print "Source MC : _16F1847_OWS_2xDS18B20_Temp_LCD_I2C" print "Hardware : RB5 TX UART RB2 RX UART" !WiFi.info {{}{, }{, } !{, }{,}} Wifi.info SSID$,,MAC$,IP$ print "SSID : ";SSID$ print "MAC @ : ";MAC$ print "IP @ : ";IP$ pause 3000 TIME Year$, Month$, Day$, Hour$, Minute$, Second$ for i=1 to 3 ObjStatus[i]=0 % par defaut next i if Test=0 then popup "Start before 16F1847 2xDS18B20 Interface ..",0,0,4 end if !Gr.open alpha, red, green, blue {, gr.open 255,0,0,0,0 % Alpha=255=opaque,R,G,B, x => 1=status barre haut pause 200 gr.orientation 0 % force Landscape ! Recupere les parametres de l'ecran w=largeur et h=hauteur gr.screen w,h gr.render !gr.color alpha, red, green, blue, fill !http://www.proftnj.com/RGB3.htm !gr.color 255,255,255,255,1 % blanc !gr.color 255,255,0,0,1 % rouge !gr.color 255,255,255,255,1 % blanc !gr.color 255,0,255,0,1 % Vert !gr.color 255,0,0,255,1 % bleu !gr.color 255,0,0,0,1 % Noir !gr.color 255,255,255,153,1 %Jaune clair !gr.color 255,255,0,153,1 %Jaune vif !gr.color 255,102,0,255,1 % Violet print "chargement des images" gr.bitmap.load ArrPlan[1],"Arriere_plan_2_DS18B20.jpg" gr.bitmap.draw ObjFixe[1],Arrplan[1],1,1 pause 500 gr.bitmap.load bm[1],"bluetooth_icon72x72.jpg" gr.bitmap.load bm[2],"Case_cochee_V.jpg" gr.bitmap.load bm[3],"Case_cochee_V.jpg" gr.bitmap.load bm[4],"Case_Un_cochee.jpg" pause 500 gr.bitmap.draw Obj[1],Bm[1],720,5 % icone BT gr.bitmap.draw Obj[2],Bm[2],720,360 % case à cocher verte gr.bitmap.draw Obj[3],Bm[3],720,405 % case à cocher verte gr.bitmap.draw Obj[4],Bm[4],720,405 % case uncochee ! reperage Touch zones cases à cocher !gr.color 255,255,0,0,0 %rouge , vide !Gr.rect Rect1, 720,360,755,400 !Gr.rect Rect2, 720,405,755,445 gr.set.stroke 0 !Gr.rect , left, top, right, bottom gr.color 255,0,0,255,1 % bleu Gr.rect Thermo[1],60,95,65,345 gr.color 255,255,0,153,1 Gr.rect Thermo[2],180,95,185,345 pause 500 ttx=273 x1=273 x2=274 y1=348 y2=349 debug.print "creation de petits cercles pour grafiques" gr.set.stroke 2 gr.color 255,255,0,0,1 % rouge y1=348 gr.circle cir1,ttx,y1,2 gr.color 255,0,0,255,1 % bleu y2=348 gr.circle cir2,ttx,y2,2 ! p0 Trame brute reçue via BlueTooth (en bas de l'ecran) gr.set.stroke 1 gr.text.size 12 gr.text.bold 1 gr.color 255,0,0,255,1 %bleu gr.text.draw p0,25,470,Texte$ ! p1,p2 Valeurs num. temperatures en petits caractere haut du thermometre gr.text.size 12 gr.color 255,0,255,0,1 % vert gr.text.draw p1,30,30,TempExt$ gr.text.size 12 gr.color 255,255,0,0,1 %rouge gr.text.draw p2,150,30,TempInt$ ! p3 , p4 Valeurs num. temperatures en gros caractere gr.set.stroke 3 gr.text.size 48 gr.color 255,255,0,0,1 % rouge gr.text.draw p3,515,60,TempInt$ gr.color 255,0,0,255,1 % bleu gr.text.draw p4,285,60,TempExt$ ! p5 status gr.set.stroke 1 gr.text.size 12 gr.text.bold 1 gr.color 255,0,0,0,1 %noir gr.text.draw p5,300,470,Status$ gr.text.size 24 gr.show Obj[1] gr.show Obj[2] gr.show Obj[3] gr.render gr.Show p0 gr.Show p1 gr.Show p2 gr.Show p3 gr.Show p4 gr.Show p5 gr.hide Obj[1] gr.hide Obj[2] gr.hide Obj[3] gr.hide Obj[4] gr.render pause 500 print 10 !! -------- TEST -------------------------------- print "TH1" ! simule evolution sur la gamme de mesure thermometre for Tex=-10 to 40 step 1 n1=1 gosub MAJ_Thermo next Tex !debug.print "TH2" for Tin=10 to 35 step 1 n1=2 gosub MAJ_Thermo next Tin ------------------------------------------------------ !! !! !======== test ================== ObjStatus[3]=1 for k1=1 to 230 print k1 Status$="K1="+ format$(" ####",K1) print Status$ if (ObjStatus[3]=1) & (mod(k1,10)=0)then gr.modify p5,"text",Status$ gr.render pause 1000 endif pause 100 next k1 end ! ============================= !! new_connection: tts.init if (test=1) then popup "Simulation liaison BT..",0,0,4 gr.Hide Obj[5] gr.render else Texte$="Ouverture liaison BT" gosub Refresh_Status print "open BT" bt.open pause 1500 print "15" bt.connect print "20" !Read status until a connection is made popup "Connecting..",0,0,3 alarme = clock() + 32000 s=0 while (s <>3) bt.status s pause 500 if (clock() > alarme) then tts.speak "Taim oute for connecte" pause 2000 ! w_r.break bt.close pause 2000 bt.reconnect endif repeat print "s=";s print "30" gr.show Obj[1] bt.device.name Device$ Texte$=Device$+"_connecté" debug.print Texte$ tts.speak Texte$ gosub Refresh_Status gr.render endif Main_Loop: nb=0 ! ------------------- MAIN LOOP ------ Do print "debut Main_loop" ! Read status to insure that we remain connected. ! If disconnected, program reverts to listen mode. ! In that case, ask user what to do. !Debug.print 35 t1=0 t2=0 t3=0 if (Test=0) then bt.status s if (s <> 3) then debug.print "Connection perdue" Texte$="connection perdue ! " gosub Refresh_Status gr.hide Obj[5] gr.render goto new_connection endif !debug.print "Lecture BT" gosub ReadBT ! Read messages until the message queue is empty ! boucle pour ne pas fractionner le message if (dr=1) then debug.print "MyBT : " ;msgR$ if(len(msgR$)>30) then Texte$=left$(msgR$,30) else Texte$=msgR$ endif gosub Refresh_Status ! print 40 k1=k1+1 ! debug.print "k1=";k1 endif ! Send a alive flag nb=nb+1 debug.print "nb=";nb if (nb >360) then msgE$= "ALIVE" +chr$(13) Texte$="ALIVE" gosub Refresh_Status ! debug.print 50 bt.write msgE$ debug.print "Archos: "; msgE$ nb=0 endif ! == Traitement trame recue == KL=len(msgR$) print "Lg Tr=";KL recept$=msgR$ if (KL>30) then KL=0 % anomalie !debug.print 71 longueur=0 if KL>28 then ! decomposition les elements du message BT gosub My_Split debug.print "nb elem rec_Array$ : ";longueur for i=1 to longueur debug.print i,rec_Array$[i] next i debug.print 73 ! == Extraction N° trame == debug.print " N° trame=";a$ a$=rec_Array$[1] i=len(a$) A$=right$(a$,i-2) print " N° trame=";a$;" ";i debug.print "Traitement Trame" gosub Traitement_Trame endif % KL>28 % si longueur trame OK Gosub Test_Cases_a_cocher Gosub Traite_SauveGarde if (msgR$="Fin") then D_u.break endif ! image intermediaire du RUN de l'application if (k1=50) then debug.print msgR$ console.save "DS18B20_Trame.txt" Gr.save "DS18B20_runing_screen.jpg" gr.render endif ! active un leger filtrage (par defaut) apres 5 mesures if(K1>5) & ObjStatus[3]=1 then Kfilter=0.8 endif debug.print "End of loop" until (k1>500) ! ------------ end of MAIN loop ------------------- Texte$="Fin normale apres 500 boucles" gosub Refresh_Status pause 6000 fini: bt.close Debug.print "fin normale" Console.save Progr$+".txt" pause 4000 end !=========================================== ReadBT: ! Read messages until the message queue is empty ! boucle pour ne pas fractionner le message A1$="" MsgR$="" !gr.hide Obj[5] !gr.render dr=0 bt.status s if (s=3) then do bt.read.ready rr if (rr>0) then dr=1 bt.read.bytes A1$ MsgR$=MsgR$+A1$ endif until rr=0 debug.print "Read BT" gr.show Obj[5] else debug.print "decrochage BT" gr.hide Obj[5] gr render pause 1000 endif gr.render return MAJ_Thermo : if (n1=1) then !pas1=242/(40+10) j=345-pas1*(Tex+10) gr.hide Thermo[1] gr.color 255,0,0,255,1 % bleu !gr.color 255,0,255,0,1 % Vert Gr.rect Thermo[1],60,j,65,345 gr.show Thermo[1] gr.hide p3 gr.modify p3,"text",TempInt$ gr.show p3 gr.render endif if (n1=2) then !pas2=242/(35-10) j=345-pas2*(Tin-10) gr.hide Thermo[2] gr.color 255,255,0,0,1 % rouge !gr.color 255,255,0,153,1 Gr.rect Thermo[2],180,j,185,345 gr.show Thermo[2] gr.hide p4 gr.modify p4,"text",TempExt$ gr.show p4 gr.render endif return Refresh_Status : gr.hide p0 gr.color 255,0,0,255,1 % blue gr.modify p0, "text",Texte$ gr.show p0 gr.color 255,255,0,0,1 % rouge y1=350-Tin*scaling % 6.375 gr.circle cir1,ttx,y1,3 gr.color 255,0,0,255,1 % bleu y2=350-Tex*scaling gr.circle cir2,ttx,y2,3 gr.render if (ttx>760) then ttx=275 ttx++ return Traitement_Trame: ! == extraction Temper Ext == ! debug.print rec_Array$[2] if (left$(rec_Array$[2],3)="T1=") then TempExt$= right$(rec_Array$[2],7) Dummy= val(TempExt$) if (Dummy > 42.0) then Dummy=42.0 endif !debug.print "Dummy=";Dummy Tex=Dummy * Kfilter + Old_Tex *(1-KFilter) Old_Tex=Tex TempExt$=format$(" ##.##",Tex)+"°C" debug.print "TempExt$=";TempExt$ gr.text.size 12 gr.color 255,0,255,0,1 % vert gr.modify p1, "text",TempExt$ n1=1 gosub MAJ_Thermo endif ! == extraction Temper Int == ! debug.print rec_Array$[3] if (left$(rec_Array$[3],3)="T2=") then TempInt$= right$(rec_Array$[3],7) Dummy=val(TempInt$) !debug.print "Dummy=";Dummy Tin=Dummy * Kfilter + Old_Tin *(1-KFilter) Old_Tin=Tin TempInt$=format$(" ##.##",Tin)+"°C" debug.print "TempInt$=";TempInt$ gr.text.size 12 gr.color 255,255,0,153,1 %Jaune vif gr.modify p2, "text",TempInt$ n1=2 gosub MAJ_Thermo endif gr.render return My_Split: ! La Difference avec la fonction basic split qui necessite un tableau NON dimensionné ! avant usage .. donc ne pas ooublier le undim ! ! est qu'il n' y a besoin de dimensionner qu'une seule fois le tableau à son maxi ! et surtout que la fonction est rerentrante ! debug.print "My_Split" J3=1 L3=1 longueur=0 do M3= Is_In(";",recept$,L3) K3=len(recept$) if (M3>0) then rec_Array$[J3]=mid$(recept$,L3,M3-1) longueur=longueur + 1 recept$=right$(recept$,K3-M3) J3=J3+1 endif until M3=0 return !=============================== Test_Cases_a_Cocher: ! reperage Touch zones 2 cases à cocher !gr.color 255,255,0,0,0 %rouge , vide !Gr.rect Rect1, 720,360,755,400 !Gr.rect Rect2, 720,405,755,445 t2=0 gr.bounded.touch t2,720,360,755,400 gr.render if (t2=1) then Tone 500,250 endif if (t2=1) & (ObjStatus[2]=0) then Gr.show Obj[2] ObjStatus[2]=1 tts.speak "Memo" t2=0 gr.render endif if (t2=1) & (ObjStatus[2]=1) then Gr.Hide Obj[2] ObjStatus[2]=0 tts.speak "MemO Stop" t2=0 gr.render endif !======== t3=0 gr.bounded.touch t3, 720,405,755,445 gr.render if (t3=1) then Tone 600,250 endif if (t3=1) & (ObjStatus[3]=0) then Gr.show Obj[3] ObjStatus[3]=1 tts.speak "Filtrage" KFilter=0.2 t3=0 endif if t3=1 & ObjStatus[3]=1 then Gr.Hide Obj[3] ObjStatus[3]=0 tts.speak "Non Filtré" KFilter=1.0 t3=0 endif gr.render return !======================================= Traite_SauveGarde: !debug.print "Traite action case à cocher MEMO" ! zones t2 à t3 if ((ObjStatus[2]=1) & (mod(k1,10)=0)) then !sauvegarde datas sur fichiers ou database popup "Sauvegarde sur fichier" gr.render SaveDatas$="DS18B20_2.txt" gr.modify p5,"text",SaveDatas$ gr.render pause 1000 file.exists b, SaveDatas$ if ( b>0 ) then text.open a, myfile, SaveDatas$ else text.open w, myfile, SaveDatas$ endif SaveDatas$=TempExt$+";"+TempInt$+chr$(13) text.writeln myfile, Savedata$ text.close myfile ! ftp.open "ftp.site.com", 21, "username", "password" ! ftp.put "myusers.txt", "/public_html/myusers.txt" ! ftp.close gr.modify p5,"text"," " gr.render popup "Saved" gr.render pause 2000 endif if ObjStatus[2]=0 file.exists b, SaveDatas$ if ( b>0 ) then text.close myfile endif endif return ! ==================================== TestNum: J4=0 ! test si numerique for i4=3 to len(A$) b4$=mid$(A$,i4,1) ! Debug.print "i4=";i4,"B4$=";B4$, J4= Is_In(B4$,"0123456789",1) ! debug.print "JJ=";JJ if J4=0 then F_n.break endif next i4 if (J4=0) then debug.print "A$=";A$;" Not Num" else debug.print "A$=";A$;" OK" end if return !================================ OnError: debug.print GETERROR$() Debug.print "sortie sur Erreur" fin: Console.save "Err_"+Prog$+".txt" pause 2000 end