2016-08-26 27 views
2

BBC Microbitをデジタルクロック、具体的にはバイナリデジタルクロックに変えることは楽しい考えだと思っていました。私はちょうどそれをするためにPythonで少しのコードをノックしました:マイクロビットで10進数を2進数に変換する

from microbit import * 

def makeBinary(intValue,padding): 
    number = intValue 
    returnValue = "" 
    brightness = 4 #value 0 to 8 
    while number > 0: 
     bit = number % 2 
     if bit > 0: 
      bit = brightness 
     quotient = number/2 
     returnValue = str(bit)+returnValue 
     number = quotient 
    for i in range(len(returnValue),padding): 
     returnValue = "0"+returnValue 
    return returnValue 

timeAdvance = 0 
minuteAdvance = 0 
hourAdvance = 0 
secondCounter = 0 
while True: 
    if button_a.was_pressed(): 
     #advance hours 
     hourAdvance = hourAdvance + 1 
     if hourAdvance > 23: 
      hourAdvance = 0 
     timeAdvance = (hourAdvance*60*60*1000)+(minuteAdvance*60*1000) 
    elif button_b.was_pressed(): 
     #advance minutes 
     minuteAdvance = minuteAdvance + 1 
     if minuteAdvance > 59: 
      minuteAdvance = 0 
     timeAdvance = (hourAdvance*60*60*1000)+(minuteAdvance*60*1000) 
    else: 
     #calculate and display time 
     if (running_time()-secondCounter) > 1000: 
      secondCounter = running_time() 
      seconds = (running_time()/1000)%60 
      minutes = ((running_time()+timeAdvance)/1000/60)%60 
      hours = ((running_time()+timeAdvance)/1000/60/60)%24 
      pmString = "0" 
      addthirtyMString = "00000" 
      addthirtySString = "00000" 
      if hours>12: 
       pmString = "9" 
       hours = hours - 12 
      if minutes>29: 
       addthirtyMString = "00900" 
       minutes = minutes - 30 
      if seconds>29: 
       addthirtySString = "00900" 
       seconds = seconds - 30 
      hourString = makeBinary(hours,4) 
      minuteString = makeBinary(minutes,5) 
      secondString = makeBinary(seconds,5) 
      time = Image(pmString+hourString+":"+minuteString+":"+addthirtyMString+":"+secondString+":"+addthirtySString) 
      display.show(time) 

問題は動作しません!番号は0だから10時48分01秒AMが(誤って)

**** 
***** 

***** 

として表示されていない限り、すべての1を返すバイナリフィールドでMicrobit結果でそれを実行これは

* * 
* * 
    * 
    * 

として表示されるべきですam/pm ledとadd 30 seconds/add 30 minutesマーカーがうまくいけば、これは明らかに10進数のバイナリ表現(makeBinary関数)の書式設定の問題です。私は最初にこれを行うために 'format'を使用しようとしました - しかし、microPythonは、少なくともマイクロビットで、明らかにそれを好きではありません。

makeBinaryを「実際の」コンピュータに実行すると、正常に動作します。誰もがここで気にならないかもしれない考えを持っていますか? MicroBitを混乱させる可能性のある関数を使用せずに10進数をバイナリ文字列に変換する他の簡単な方法については何か提案はありますか?

答えて

2

マイクロビットはマイクロpythonのためにpython 3を使用します。つまり、2つの整数の除算は、整数ではなく浮動小数点値を返すことがよくあります。あなたが明示的に整数除算をしたい場合は、要約すると(また、Pythonの2で動作します)//を使用する必要があります。時間以来

  Py 2   Py 3 and microbit 
35/10  3    3.5 
35 // 10 3    3 
35.0/10 3.5    3.5 

は、それがintを期待make_binary()機能を、混乱され、floatとして出ています。

 quotient = number // 2 

[...]

 seconds = (running_time()//1000)%60 
     minutes = ((running_time()+timeAdvance)//60000)%60 
     hours = ((running_time()+timeAdvance)//3600000)%24 

は部門との最初の問題を修正する必要があります。

コンピュータにpython 3をインストールして使用すると、デバッグが容易になる場合があります。

さて、Pythonはすでに文字列

>>> bin(58) 
'0b111010' 

としてバイナリ表現を整数を受け取り、返すbin()機能を持っており、あなたのコードは、これを使用しての代わりに、独自に書くべきです。

+0

このJamesさんに感謝します - あなたの整数/浮動小数点の答えは、法案に完全に合っています!実際、私はビンを試しましたが、マイクロビットは0bのトリミングと必要な長さのパディングでワーブラーを投げました(おそらく、私自身がPython 3でフォーマットを誤解しているためです)。それはすべて今働く。 – headbanger

関連する問題