Haberler

Wio Terminal ve Ardupy ile Pasta Grafiği ve Ölçüm Okuma

Wio Terminal’ı piyasaya sürdüğümüzden bu yana 3 ay geçti. Topluluktan birçok olumlu geri dönüş ve harika projeler aldık. Daha fazla bilgi için sürekli güncellenen blogumuza Wio Terminal için Kaynak Toplama: Topluluktan Eğitimler, İncelemeler ve Projeler başlığına bakabilirsiniz. Bu sevimli IoT cihazını beğendiğiniz için hepinize teşekkür ederiz!

Bu blogda, Wio Terminal’da pasta grafiği ve metre okumalarını göstermek için Ardupy’yi nasıl basit bir şekilde kullanacağınızı inceleyeceğim. Öncelikle, Seeed ekibi tarafından yeni piyasaya sürülen bu son derece kolay IDE hakkında henüz duymadıysanız, Ardupy’nin ne olduğunu anlamaya çalışalım.

ArduPy’nin Kısa Tanıtımı

ArduPy, Arduino ve MicroPython kombinasyonudur. MicroPython, donanımı kontrol etmek için evrensel Arduino API’sini kullanır, böylece yeni platformlarla hızlı bir şekilde uyumlu hale gelebilir. Aynı zamanda, aip paket yöneticisini sağlıyoruz. Favori Arduino kütüphanenizi bir MicroPython kütüphanesine dönüştürebilirsiniz. ArduPy aracılığıyla, fikirlerinizi hızlı bir şekilde doğrulamak, Python programlamayı öğrenmek ve Açık Kaynak donanımını öğrenmek için Python kullanabilirsiniz.

Başlarken

ArduPy ile başlamak için öncelikle aip – ArduPy Entegre Platformu‘nu kurmanız gerekiyor; bu, ArduPy geliştirmek ve ArduPy kartıyla etkileşimde bulunmak için bir yardımcı programdır. Kullanıcıların Ardupy ile hızlı bir şekilde başlamasını sağlar. aip, basit bir komut satırı aracı olarak tasarlanmıştır. Ardupy hakkında daha fazla ayrıntı bilmeden kendi Ardupy yazılımınızı özelleştirebilirsiniz.

macOS ile Kurulum

macOS kullanıcıları, ArduPy-aip’i kurmak için Terminal’de aşağıdakileri çalıştırabilir:

pip3 install ardupy-aip 

Not: macOS’ta Python 3‘ün kurulu olduğundan emin olun. Python 3’ü kurmak için, macOS için bir yazılım paket yöneticisi olan Homebrew‘u kullanabilirsiniz. Homebrew kurulduktan sonra, python 3’ü kurmak için aşağıdakileri çalıştırın: brew install python3. Ayrıca Python 3’ü resmi Python web sitesinden indirip kurabilirsiniz.

Windows ile Kurulum

Windows için ArduPy’nin en son sürümlerini aşağıdaki bölümden indirebilirsiniz. İndirildikten sonra, ikili aip‘yi PATH‘te bulunan bir dizine çıkarın.

VEYA eğer Python 3 ortamınız varsa, pip3 kullanarak da kurulum yapabilirsiniz:

pip3 install ardupy-aip 

Linux ile Kurulum

Linux kullanıcıları, ArduPy-aip’i kurmak için Terminal’de aşağıdakileri çalıştırabilir:

pip3 install ardupy-aip 

Not: Python 3’ün kurulu olduğundan ve pip3‘ün güncel olduğundan emin olun.

ArduPy-aip CLI ile Başlarken

aip ArduPy için bir Komut Satırı Arayüzü (CLI)‘dir, aip‘yi kullanarak ArduPy kütüphanelerini kurabilir, ArduPy yazılımını donanıma kolayca oluşturup yükleyebilirsiniz. Daha fazla bilgi almak için basitçe help komutunu kullanın:

aip help
  • Kart bilgilerini almak için:
aip board 
  • ArduPy ile bağlanan Arduino kütüphanelerini kurmak için:
aip install <ArduPy LibraryPath> 
# Örnek Kullanım: 
# aip install Seeed-Studio/seeed-ardupy-ultrasonic-sensor
  • ArduPy kütüphanelerini kaldırmak için:
aip uninstall <ArduPy LibraryPath> 
# Örnek Kullanım: 
# aip uninstall Seeed-Studio/seeed-ardupy-ultrasonic-sensor
  • Yüklenmiş ArduPy Kütüphanelerini listelemek için:
aip list
  • Yüklediğiniz kütüphaneleri ve temel ArduPy özelliklerini içeren ArduPy Yazılımını oluşturmak için:
aip build 
  • ArduPy Yazılımını donanıma yüklemek için:
aip flash 
  • Kartla etkileşimde bulunmak için (shell tabanlı dosya gezgini):
aip shell

Not: Bir kez ardupy-mpfshell‘e girdiğinizde, daha fazla bilgi ve komutlar için help komutunu kullanabilirsiniz.

  • Python dosyasını çalıştırmak için:
aip shell -n -c "runfile <YourPythonFilePath> [Path]"
# Örnek Kullanım:
# aip shell -n -c "runfile /Users/ansonhe/Desktop/ur.py"
  • Shell kullanarak dosyaları karta yüklemek için:
aip shell -n -c "put <YourPythonFilePath> [Path]"
# Örnek Kullanım:
# aip shell -n -c "put /Users/ansonhe/Desktop/ur.py"
 
  • REPL moduna girmek için:
aip shell -c "repl" 

ArduPy hakkında daha ayrıntılı talimatlar için lütfen ArduPy Başlangıç Kılavuzu‘nu ziyaret edin.

Acil Kullanımlar

Wio Terminal ile ArduPy kullanmanın sonuçlarını gösteren iki örnek burada:

Kullanım 1 (Pasta Grafiği):

aip shell -n -c "runfile <YourPythonFilePath> [Path]"
# Örnek Kullanım:
# aip shell -n -c "runfile F:\Ardupy-wio_terminal\PieChart.py

Tüm ayarlar düzgün bir şekilde kurulduysa, sonuç Wio Terminal ekranında aşağıdaki gibi görüntülenecektir.

Kullanım Kodu:

from machine import LCD, Sprite
import time, math

DEG2RAD = 0.0174532925
lcd = LCD()
lcd.fillScreen(lcd.color.BLACK)

# DAİRE SEGMENTLERİNİ ÇİZ
# x,y == dairenin merkezinin koordinatları
# start_angle = 0 - 359
# sub_angle   = 0 - 360 = alt açı
# r = yarıçap
# colour = 16 bit renk değeri

def fillSegment(x, y, startAngle, subAngle, r, color):
    # Segment başlangıcı için ilk koordinat çiftini hesapla
    sx = math.cos((startAngle - 90) * DEG2RAD)
    sy = math.sin((startAngle - 90) * DEG2RAD)
    x1 = sx * r + x
    y1 = sy * r + y

    # Her inc derecede renk blokları çiz
    for i in range(startAngle, startAngle+subAngle, 1):
        # Segment sonu için koordinat çiftini hesapla
        x2 = math.cos((i + 1 - 90) * DEG2RAD) * r + x
        y2 = math.sin((i + 1 - 90) * DEG2RAD) * r + y

        lcd.fillTriangle(int(x1), int(y1), int(x2), int(y2), x, y, color)

        # Bir sonraki segment için segment sonunu segment başlangıcına kopyala
        x1 = x2
        y1 = y2
    
def main():
    # 4 pasta grafik segmenti çiz
    fillSegment(160, 120, 0, 60, 100, lcd.color.RED)
    fillSegment(160, 120, 60, 30, 100, lcd.color.GREEN)
    fillSegment(160, 120, 60 + 30, 120, 100, lcd.color.BLUE)
    fillSegment(160, 120, 60 + 30 + 120, 150, 100, lcd.color.YELLOW)
    time.sleep(1)
    fillSegment(160, 120, 0, 360, 100, lcd.color.BLACK)

if __name__ == "__main__":
    while True:
        main()

Kullanım 2 (Meter):

aip shell -n -c "runfile  [Yol]"
# Örnek Kullanım:
# aip shell -n -c "runfile F:\Ardupy-wio_terminal\Meter.py"

Kullanım kodu:

“`html

from machine import LCD
import time, math

M_SIZE = 1.3333
LOOP_PERIOD = 35

ltx = 0
osx = M_SIZE * 120
osy = M_SIZE * 120
updateTime = 0
old_analog = -999
d = 0

tft = LCD()
tft.fillScreen(tft.color.BLACK)

def valmap(value, istart, istop, ostart, ostop):
  return ostart + (ostop - ostart) * ((value - istart) / (istop - istart))

def plotNeedle(value, ms_delay):
    global old_analog
    global osx, osy, ltx
    tft.setTextColor(tft.color.BLACK, tft.color.WHITE)
    if (value < -10):
        value = -10   # Değeri iğne son duraklarını taklit etmek için sınırla

    if (value > 110):
        value = 110
    
    while(value != old_analog):
        if (old_analog < value):
            old_analog+=1
        else:
            old_analog-=1
    
        if (ms_delay == 0):
            old_analog = value
        
        sdeg = valmap(old_analog, -10, 110, -150, -30) # Değeri açıya eşle
        # İğnenin ucu koordinatlarını hesapla
        sx = math.cos(sdeg * 0.0174532925)
        sy = math.sin(sdeg * 0.0174532925)

        # İğnenin başlangıç x delta'sını hesapla (pivot noktasında başlamaz)
        tx = math.tan((sdeg + 90) * 0.0174532925)

        # Eski iğne görüntüsünü sil
        tft.drawLine(int(M_SIZE * (120 + 20 * ltx - 1)), int(M_SIZE * (140 - 20)), int(osx - 1), int(osy), tft.color.WHITE)
        tft.drawLine(int(M_SIZE * (120 + 20 * ltx)), int(M_SIZE * (140 - 20)), int(osx), int(osy), tft.color.WHITE)
        tft.drawLine(int(M_SIZE * (120 + 20 * ltx + 1)), int(M_SIZE * (140 - 20)), int(osx + 1), int(osy), tft.color.WHITE)

        # İğnenin altındaki metni yeniden çiz
        tft.setTextColor(tft.color.BLACK);
        tft.drawCentreString("%RH", int(M_SIZE * 120), int(M_SIZE * 70), 4); # Font 4'ü önlemek için yorum satırı yap

        # Yeni iğne son koordinatlarını bir sonraki silme için sakla
        ltx = tx
        osx = M_SIZE * (sx * 98 + 120)
        osy = M_SIZE * (sy * 98 + 140)

        # İğneyi yeni pozisyonda çiz, magenta iğneyi biraz kalınlaştırır
        # İğneyi kalınlaştırmak için 3 çizgi çizer
        tft.drawLine(int(M_SIZE * (120 + 20 * ltx - 1)),int( M_SIZE * (140 - 20)), int(osx - 1), int(osy), tft.color.RED)
        tft.drawLine(int(M_SIZE * (120 + 20 * ltx)), int(M_SIZE * (140 - 20)), int(osx), int(osy), tft.color.MAGENTA)
        tft.drawLine(int(M_SIZE * (120 + 20 * ltx + 1)), int(M_SIZE * (140 - 20)), int(osx + 1), int(osy), tft.color.RED)

        if(math.fabs(old_analog - value) < 10):
            ms_delay += ms_delay / 5
        
        time.sleep(ms_delay)

def analogMeter():
    tft.fillRect(0, 0, int(M_SIZE * 239), int(M_SIZE * 126), tft.color.LIGHTGREY)
    tft.fillRect(5, 3, int(M_SIZE * 230), int(M_SIZE * 119), tft.color.WHITE)

    tft.setTextColor(tft.color.BLACK)

    # -50 ile +50 derece arasında her 5 derecede işaretler çiz
    for i in range(-50, 51, 5):
        # Uzun ölçek işaret uzunluğu
        tl = 15

        # Çizilecek işaretin koordinatları
        sx = math.cos((i - 90) * 0.0174532925)
        sy = math.sin((i - 90) * 0.0174532925)
        x0 = sx * (M_SIZE * 100 + tl) + M_SIZE * 120
        y0 = sy * (M_SIZE * 100 + tl) + M_SIZE * 140
        x1 = sx * M_SIZE * 100 + M_SIZE * 120
        y1 = sy * M_SIZE * 100 + M_SIZE * 140

        # Bölge doldurma için bir sonraki işaretin koordinatları
        sx2 = math.cos((i + 5 - 90) * 0.0174532925)
        sy2 = math.sin((i + 5 - 90) * 0.0174532925)
        x2 = sx2 * (M_SIZE * 100 + tl) + M_SIZE * 120
        y2 = sy2 * (M_SIZE * 100 + tl) + M_SIZE * 140
        x3 = sx2 * M_SIZE * 100 + M_SIZE * 120
        y3 = sy2 * M_SIZE * 100 + M_SIZE * 140

        # Sarı bölge sınırları
        if (i >= -50 and i < 0):
          tft.fillTriangle(int(x0), int(y0), int(x1), int(y1), int(x2), int(y2), tft.color.GREEN)
          tft.fillTriangle(int(x1), int(y1), int(x2), int(y2), int(x3), int(y3),tft.color.GREEN)
        
        # Yeşil Bölge sınırları
        if (i >= 0 and i < 25):
            tft.fillTriangle(int(x0), int(y0), int(x1), int(y1), int(x2), int(y2), tft.color.YELLOW)
            tft.fillTriangle(int(x1), int(y1), int(x2), int(y2), int(x3), int(y3), tft.color.YELLOW)
        
        # Turuncu bölge sınırları
        if (i >= 25 and i < 50):
            tft.fillTriangle(int(x0), int(y0), int(x1), int(y1), int(x2), int(y2), tft.color.ORANGE)
            tft.fillTriangle(int(x1), int(y1), int(x2), int(y2), int(x3), int(y3), tft.color.ORANGE)
        
        # Kısa ölçek işaret uzunluğu
        if (i % 25 != 0):
            tl = 8
        # İşaret uzunluğu değişirse koordinatları yeniden hesapla
        x0 = sx * (M_SIZE * 100 + tl) + M_SIZE * 120
        y0 = sy * (M_SIZE * 100 + tl) + M_SIZE * 140
        x1 = sx * M_SIZE * 100 + M_SIZE * 120
        y1 = sy * M_SIZE * 100 + M_SIZE * 140

        # İşareti çiz
        tft.drawLine(int(x0), int(y0), int(x1), int(y1), tft.color.BLACK)

        # Etiketlerin çizilip çizilmeyeceğini kontrol et, pozisyon ayarlamaları ile
        if (i % 25 == 0):
            x0 = sx * (M_SIZE * 100 + tl + 10) + M_SIZE * 120
            y0 = sy * (M_SIZE * 100 + tl + 10) + M_SIZE * 140

            if(i/25 == -2 ):
                tft.drawCentreString("0", int(x0), int(y0) - 12, 2)
            elif (i/25 == -1 ):
                tft.drawCentreString("25", int(x0), int(y0) - 9, 2)
            elif (i/25 == -0 ):
                tft.drawCentreString("50", int(x0), int(y0) - 7, 2)
            elif (i/25 == 1 ):
                tft.drawCentreString("75", int(x0), int(y0) - 9, 2)
            elif (i/25 == 2 ): 
                tft.drawCentreString("100", int(x0), int(y0) - 12, 2)
        
            # Şimdi ölçeğin yayını çiz
            # sx = math.cos((i + 5 - 90) * 0.0174532925)
            # sy = math.sin((i + 5 - 90) * 0.0174532925)
            # x0 = sx * M_SIZE * 100 + M_SIZE * 120
            # y0 = sy * M_SIZE * 100 + M_SIZE * 140
            # # Yay yayını çiz, son kısmı çizme
            # if (i < 50):
            #     tft.drawLine(int(x0), int(y0), int(x1), int(y1), tft.color.BLACK)

        tft.drawString("%RH", int(M_SIZE * (5 + 230 - 40)), int(M_SIZE * (119 - 20)), 2); # Birimler sağ altta
        tft.drawCentreString("%RH", int(M_SIZE * 120), int(M_SIZE * 70), 4); # Font 4'ü önlemek için yorum satırı yap
        tft.drawRect(5, 3, int(M_SIZE * 230), int(M_SIZE * 119), tft.color.BLACK); # Çerçeve çizgi çiz

        plotNeedle(0, 0)


def initial():
    analogMeter()
    updateTime = time.ticks_ms()
        
def main():
    global updateTime, d
    if (updateTime <= time.ticks_ms()):
        updateTime = time.ticks_ms() + 100
        d += 4
        if (d >= 360):
            d = 0
        
        value = 50 + 50 * math.sin((d+0)*0.0174532925)
        print(value)
        plotNeedle(value, 0)


if __name__ == "__main__":
    initial()
    while True:
        main()

“`

İlginç kullanımlar için WikiForum

Leave a Reply

Your email address will not be published. Required fields are marked *