PB -2- Arduino ile POT okuma
Arduino ile potansiyometre’den gelen 0-5V arası analog değeri okuyabiliyoruz. Bilgi olarak 0-1023 arası bir değeri seri port üzerinden PureBasic ile PC’ye alacağız..
Aşağıdaki kodu Arduino’ya yüklüyoruz..
void setup() {
Serial.begin(19200);
}
void loop() {
int pot = analogRead(A5); //poti'den gelen değeri okuyor
Serial.println(pot); //değeri, Araçlar > Seri Port Ekranından görebilirsin
delay(1000); //her saniyede bir yollar
}
Arduino IDE’de Araçlar ➡️ Seri Port Ekranı menüsünden, aşağıdaki pencereyi açıyoruz. Pot’u çevirince gelen bilginin değiştiğini görebilirsin..
PB kodu da aşağıdaki gibi oldu. Arduino, her saniye bilgi yolladığından, timer kullanarak okuma yaptık.
EnableExplicit
Enumeration
#win_main
#txt_lbl1
#txt_lbl2
#txt_value
#btn_start
#btn_stop
#btn_save
#btn_clear
#cmb_comPort
#serial_portNr
#list
#prgBar
#tmr_1
#file
EndEnumeration
UsePNGImageDecoder()
Global PortsFound = 0, Event, COMPort.s="", DataReceived.s
Global StartTime, Timeout = 1000, Result, i, Lines
Global *Buffer = AllocateMemory(128)
LoadFont(0, "Arial", 9) ; , #PB_Font_Bold)
SetGadgetFont(#PB_Default, FontID(0))
#win_flags = #PB_Window_SystemMenu | #PB_Window_ScreenCentered
OpenWindow(#win_main, 0, 0, 400, 250, "Arduino POT read", #win_flags)
ComboBoxGadget(#cmb_comPort, 110, 15, 80, 23)
TextGadget(#txt_lbl1, 10, 25, 280, 20, "Serial Port :")
TextGadget(#txt_lbl2, 200, 200, 70, 18, "Pot Değeri = ")
TextGadget(#txt_value, 275, 200, 100, 18, "")
ButtonGadget(#btn_start, 10, 70, 80, 50, "START")
ButtonGadget(#btn_stop, 110, 70, 80, 50, "STOP")
ButtonGadget(#btn_clear, 58, 130, 80, 50, "CLEAR")
ListViewGadget(#list, 200, 15, 190, 180)
ProgressBarGadget(#prgBar, 200, 220, 190, 20, 0, 1023)
LoadImage(0, "save.png")
ButtonImageGadget(#btn_save, 10, 202, 40, 40, ImageID(0))
Procedure Find_Ports()
Protected i
For i = 0 To 255
COMPort="COM"+Str(i+1)
If OpenSerialPort(i, COMPort, 19200, 0, 8, 1, #PB_SerialPort_NoHandshake, 1, 1)
AddGadgetItem(#cmb_comPort,-1, COMPort)
CloseSerialPort(i)
EndIf
Next
PortsFound=1
EndProcedure
Procedure Port_Control()
If IsSerialPort(#serial_portNr) : CloseSerialPort(#serial_portNr) : EndIf
COMPort = GetGadgetText(#cmb_comPort)
If COMPort = ""
MessageRequester("Error","First Select Port !", #PB_MessageRequester_Warning)
ProcedureReturn #False
Else
If IsSerialPort(#serial_portNr); if port open
ProcedureReturn #True
Else ; if port closed
OpenSerialPort(#serial_portNr, COMPort, 19200, 0, 8, 1, #PB_SerialPort_NoHandshake, 1, 1)
If IsSerialPort(#serial_portNr)
ProcedureReturn #True
Else
MessageRequester("Error","Port can't be opened !", #PB_MessageRequester_Error)
ProcedureReturn #False
EndIf
EndIf
EndIf
EndProcedure
Procedure Receive_Response()
Repeat
Event = WaitWindowEvent(20)
Result = AvailableSerialPortInput(#serial_portNr)
If Result
;While Result
FillMemory(*Buffer, 100)
ReadSerialPortData(#serial_portNr, *Buffer, Result)
DataReceived = PeekS(*Buffer, -1, #PB_Ascii)
;Result = AvailableSerialPortInput(#serial_portNr)
;Wend
Break
EndIf
Delay(1) ; Let system do other things
Until ElapsedMilliseconds() - StartTime > Timeout
If ElapsedMilliseconds() - StartTime > Timeout
MessageRequester("Error","Usb cable is disconnected or.." +
#LF$ + "Arduino isn't connected to the selected port or.." +
#LF$ + "You didn't wait 2-3 seconds when the port was first opened..",
#PB_MessageRequester_Error)
RemoveWindowTimer(#win_main, #tmr_1)
CloseSerialPort(#serial_portNr)
EndIf
EndProcedure
Repeat
Event = WaitWindowEvent()
If PortsFound=0
Find_Ports()
EndIf
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case #btn_start
SetGadgetText(#txt_value, "")
If IsSerialPort(#serial_portNr)
DisableGadget(#btn_start, #True) ; Start butonu pasif olur
DisableGadget(#btn_stop, #False) ; Stop butonu aktif olur
AddWindowTimer(#win_main, #tmr_1, 1000)
Else
Port_Control()
EndIf
Case #btn_stop
If IsSerialPort(#serial_portNr)
DisableGadget(#btn_stop, #True)
DisableGadget(#btn_start, #False)
RemoveWindowTimer(#win_main, #tmr_1)
CloseSerialPort(#serial_portNr)
EndIf
Case #btn_clear
ClearGadgetItems(#list)
Case #cmb_comPort
Port_Control()
Case #btn_save
Lines = CountGadgetItems(#list)
If CreateFile(#file, "data.txt")
For i = 0 To Lines - 1
WriteStringN(#file, GetGadgetItemText(#list, i))
Next
CloseFile(#file)
Else
MessageRequester("Error", "can't write the file", #PB_MessageRequester_Error)
End
EndIf
EndSelect
Case #PB_Event_Timer
If EventTimer() = #tmr_1
StartTime = ElapsedMilliseconds()
Receive_Response()
SetGadgetText(#txt_value, DataReceived)
DataReceived = Left(DataReceived, Len(DataReceived)-2) ; sondaki CRLF çıkarılıyor
AddGadgetItem(#list, -1, FormatDate("%dd.%mm.%yyyy", Date()) + Space(2) +
FormatDate("%hh:%ii:%ss", Date()) + Space(6) +
RSet(DataReceived, 4, "0"))
SetGadgetState(#list, CountGadgetItems(#list) - 1)
SetGadgetState(#list, -1)
SetGadgetState(#prgBar, Val(DataReceived))
EndIf
EndSelect
Until Event = #PB_Event_CloseWindow
FreeMemory(*Buffer)
End
Save.png dosyasını 30x30 pixel olarak kullandım.. Sağ klik ile indirebilirsin.
Png dosyasını buradan indirdim. Büyük olduğundan burada küçülttüm. Belgelerim altında, yeni dizin oluşturup, .png ve .pb dosyanı bu dizine kaydet. Kaydet’e tıklayınca listedeki bilgiler data.txt dosyasına yazdırılacaktır.
Youtube’da izleyebilirsin.. Yorum veya görüşlerini Youtube yorumlarına yazabilirsin..