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..

image

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..

image

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



image

Save.png dosyasını 30x30 pixel olarak kullandım..   image    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..

Written on September 5, 2024