Fehlerkorrekturen
Verbesserungen - Science/Science+: verbesserte Frequenzerkennung - Science: Update des VOC und eCO2-Treibers - Dezimalzahlen werden neu immer mit zwei Stellen (anstelle von 5) ausgegeben.
Neue Funktionen
drawRectangleRounded(x,y,w,h,r)
Diese Funktion hiess im letzten Release drawRoundedRectangle, was jedoch zu einigen Konflikten bei bestehenden Scripts führte.
drawSpriteScaled(x,y,w,h,s,data)
Wie drawSprite, jedoch kann noch ein Skalierungsfaktor s angegeben werden. Wenn 1 angegeben wird, wird nichts skaliert. 2 bedeutet Verdoppelung etc.
textAlignment(alignment)
Damit lassen sich jetzt Strings, die mit drawText ausgegeben werden, links-, rechtsbündig oder zentriert ausgeben. (Werte: TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER, TEXT_ALIGN_RIGHT)
Neu im Editor
Fehlerkorrekturen
Neue Funktionen
Neues Design für das Menüsystem.
Neue Funktion:
isEqual(string1, string2)->bool
Diese Funktion vergleicht zwei Strings und gibt true oder false zurück.
Neue Funktion:
strCompare(string1,string2)->int
Diese Funktion vergleicht zwei Strings und liefert einen numerischen Wert, abhängig von der lexikografischen Ordnung. Bei “0” sind beide Strings identisch. Ein negativer Wert bedeutet, dass der erste String vor dem zweiten String einzuordnen ist.
Support für die Oxocard Science+
Die neue Science+ zusätzliche Sensoren. Zudem wurde der CO2 und VoC-Sensor von Renesas durch leistungsfähigere von Sensirion ersetzt. Folgende Funktionen sind neu:
getVOC()->float
getVOCIndex()->float
getNOx()->float
getNOxIndex()->float
getTOF8x8()->int[64]
getTOF4x4()->int[16]
Neu im Editor
Scripts können jetzt hoch- und runtergeladen werden.
Fehlerkorrekturen
Neu
Neue UART-, SPI- und Language-Funktionen.
Verbesserungen
Verbesserte Fehlermeldung wenn nicht mit dem WiFi verbunden.
Fehlerkorrekturen
Die Standard-Pixel-Offsets bei rotierten Bildschirmen wurden korrigiert (von 240 auf 239). Die clipRectangle()-Funktion wurde ebenfalls korrigiert. Es wurden diverse NanoPy-Fehler korrigiert: - Verkettung von binären Operationen - In-Place-Deklaration der statischen Arrays - Die implizite Deklaration einer Zeichenfolge ist jetzt 120 Zeichen lang, nicht (120 - 6) - Das Deklarieren einer Variablen durch Zurückgeben eines Arrays von einer Objektfunktion funktioniert jetzt korrekt
System-Funktionen
IO-Funktionen
Neu
HTTP request header können neu mit addRequestHeader(key, value) hinzugefügt und mit clearRequestHeaders() gelöscht werden.
Die Dateifunktionen wurden um writeLine(line) und readLine() erweitert. Mit diesen Funktionen kann nun wesentlich einfacher in/aus eine Datei geschrieben/gelesen werden.
Verbesserungen
Serverantworten einer postRequest()-Anfrage können jetzt ebenfalls mit den readRequest-Funktionen ausgelesen werden.
HTTPS Serverzertifikate werden nun jeweils zuerst mit dem internen CA store geprüft und nur im Fehlerfall direkt vom Zielserver angefragt.
Fehlerkorrekturen
Laufende PWMs werden beim Initialisieren eines GPIOs jetzt korrekt gestoppt.
Datei-Funktionen
Netzwerk-Funktionen
Neu kann man Bilder direkt in das nötige Byte-Format konvertieren lassen. Die Funktion befindet sich im Konstanten-Editor. Sie unterstützt maximal 24x24-Pixel-Bilder.
Neu
MQTT/MQTTS - Tauscht nun ganz einfach Daten übers Internet aus mit den neuen MQTT-Funktionen.
Die Oxocard unterstützt jetzt auch HTTPS-Requests. Serverzertifikate werden automatisch via unserem Server angefragt und im “certs”-Ordner der Oxocard abgelegt. Alternativ kann auch selbst ein Zertifikat im Dateisystem hinzugefügt werden und mit der selectCertificate()-Funktion darauf verwiesen werden.
Verbesserungen
getRequest() kann nun auch “chunked data” von einem Server zurückgeben.
writePWM() wurde verbessert, damit veränderte dutyCycle-Werte stufenloser ausgegeben werden.
Oxocard Science: Die einstellbaren Min-/Max-Offsetwerte der Sensoren wurden erhöht.
Fehlerkorrekturen
In der drawEllipse()-Funktion bei einer Rotation von 90° oder 270° wird nebst x & y jetzt auch rx & ry getauscht.
Netzwerk-Funktionen
Ab sofort ist der leistungsfähige NanoPy-Editor auch offline verfügbar. Das Projekt ist Open Source und kann inklusive Installationsanleitung von
heruntergeladen werden. Die Dokumentation kann über den Browser von dieser Seite gecached werden:
Um die Lesbarkeit der Dokumentation zu verbessern, wurden alle Parameter und Rückgabewerte der Funktionen aus den Titeln entfern. Dafür wurde jede Funktion mit einem Syntax-Eintrag erweitert.
Die Dokumentation wurde um eine Bibliothek-Kategorie erweitert. In dieser sind z.B. die interne IO- und die Cartridge-Bibliotheken beschrieben.
Es wurden neue Beispiel-Skripts für die Oxocard-Connect und den Cartridges hinzugefügt. Besonders erwähnenswert ist der Elektronik Kurs, welcher mit dem “Oxocard Connect Innovator Kit” durchgeführt werden kann.
Neu
Neu gibt es die onTimer()-Ereignisprozedur, welche mit setTimer(ms:long) einmalig oder mit setInterval(ms:long) wiederholt nach einer bestimmten Zeit aufgerufen werden kann.
Die Cartridge-Erkennung bei der Oxocard-Connect wurde verbessert. Sie läuft jetzt auch, wenn bereits ein Script ausgeführt wird.
Die interne “io.npy”-Bibliothek wurde hinzugefügt. Sie erlaubt es, mit nur zwei Funktionen IOs anzusteuern oder einzulesen.
Verbesserungen
Bei einem Neustart der Karte via NanoPy-Editor können nun auch Skripts mit “while 1:” verlassen werden.
“No WiFi connected”- oder “No Editor paired”-Warnung werden jetzt nicht mehr angezeigt, wenn eine Cartridge eingesteckt wird.
setPrecision(0) wird nun auch unterstützt und verhält sich gleich wie wenn man bei jedem Wert round() verwenden würde.
Fehlerkorrekturen
Die “LED FADE” Demo der Oxocard-Connect wurde umbenannt zu “LED RUNNING”.
Bei der seriellen Verbindung mach die Oxocard-Connect nun automatisch ein Reset und muss nicht mehr manuell via Menü ausgeschaltet und neu gestartet werden.
Math-Funktionen
Zeit-Funktionen
Wir lösen unser Versprechen ein uns werden schrittweise Designs und Code öffentlich machen.
Auf github finden sich neu die Schaltpläne und Designs sämtlicher Oxocards und Cartridges. In den BOM-Dateien (Bill of material) sind alle verwendeten Komponenten aufgeführt. Damit können Maker die Oxocard-Hardware auch auf andere Software-Plattformen migrieren.
Die Firmware der Oxocards ist aktuell noch nicht Open Source, kann aber jetzt neu jederzeit auf Oxocards geflasht werden. Dies ist notwendig, wenn die Karten z.B. mit der ESP-IDF oder mit Arduino überschrieben wurden. Sämtliche Cartridge-Firmware ist Open Source.
Neu
Benutzerskripts, die auf die Oxocard gespeichert wurden, können neu auch importiert werden:
# print_hello.npy das via "Meine Skripts" auf die Karte geladen wurde
def printHelloWorld():
print "Hello World!"
# main.npy
import print_hello
printHelloWorld() # Ausgabe: "Hello World!"
Unter Einstellungen gibt es neu die Rotation-Option, mit der die Bildschirmausrichtung bestimmt werden kann.
Alle “Oxoscript”-Texte wurden zu “NanoPy” geändert und alle “.tc”-Dateiendungen zu “.npy”.
Verbesserungen
Das Text-Eingabefeld von textInput() wird nun verlassen, wenn ein neues Skript auf die Karte geladen wurde.
Benutzer-IOs werden neu zurückgesetzt, wenn ein Skript verlassen oder ein neues Skript geladen wurde.
Die Timeout-Zeit bei einem Snapshot wurde auf 30 Sekunden erhöht.
Die Anzeige bei einem Kompilierfehler kann neu mit beliebigem Knopfdruck verlassen werden.
Fehlerkorrekturen
i2cReadByte() gibt jetzt auch 0 zurück, wenn das Lesen fehlschlug.
onClick() wird nun wie ursprünglich beabsichtigt nur einmal pro Klick ausgeführt und nicht mehrmals.
NanoPy-Beispiele, die onClick() falsch verwendeten, wurden korrigiert.
IO-Funktionen
System-Funktionen
Von der beliebten Programmiersprache Python gibt es verschiedene Varianten, zu denen nun die Sprache NanoPy hinzukommt. NanoPy ist eine vereinfachte Version von Python. Im Gegensatz zum Original ist sie statisch typisiert und kann daher mit deutlich geringeren Hardwareanforderungen betrieben werden. Sie ist speziell für Kleincomputer optimiert. Die Sprache basiert auf dem Python-Dialekt, enthält aber verschiedene Vereinfachungen, die den Einstieg und die Programmierung erleichtern. Bisher wurde die Sprache Oxoscript genannt. Aufgrund der sehr engen Verwandtschaft zu Python haben wir uns zu dieser Namensänderung entschlossen.
Verbesserungen
AP_SSID und AP_PASSWORD wurden verändert, damit es keine Konflikte mehr gibt, wenn sich mehrere Karten gleichzeitig im Accesspoint-Mode befinden.
Wenn setAutostart(true) aufgerufen wurde, wird nun bei einem Neustart der Oxocard für 3 Sekunden ein Fenster gezeigt, bei dem man die Autostartfunktion wieder ausschalten kann.
Die Oxocard-Science hat das “Flying Cow”-Game und zwei neue Demos erhalten. Mit der “SENSING RADAR”-Demo kann man tolle Sensor-Experimente durchführen, da man sieht wie sich die Werte über Zeit verändert haben.
Das WiFi Auswahlfenster wurde verschönert und um eine “Erneut Scannen”-Funktion erweitert.
System-Funktionen
Fehlerkorrekturen
strFind() und strSubstring() funktionieren jetzt auch mit Variablen (vorher nur mit Konstanten).
System-Funktionen
Sensor-Funktionen
Python oder nicht: du entscheidest
Dich nerven die Doppelpunkte hinter if/else/for/while/def und class? Diese haben wir der Python-Sprache abgeschaut. Wenn du diese magst, kannst du diese weiterhin schreiben. Falls nicht, kannst du sie jetzt auch einfach weglassen :-).
for i in 10:
if i < 5:
print ("tiefe Zahl")
else:
print ("grosse Zahl")
oder
for i in 10
if i < 5
print ("tiefe Zahl")
else
print ("grosse Zahl")
Vielen Einsteiger:innen bekunden Mühe mit den vielen Sondernzeichen, die wir von Python übernommen haben. Jetzt kannst du es wie in Python schreiben, oder du lässt die runden Klammern bei Funktionsaufrufen in folgenden Fällen einfach weg:
Python-kompatibel:
clear()
drawText(10,10, "Hello World")
update()
Alternative mit weniger Klammern:
clear
drawText 10,10, "Hello World"
update
Weil es so schön ist, hier nochmals ein Beispiel (keine Doppelpunkte, keine Klammern bei Funktionsaufrufe ohne Rückgabewert)
turnOn = false
def onDraw
if turnOn
background 255,255,255
else:
background 0,0,0
update
def onClick
b = getButtons()
if b.left
turnOn = false
elif b.right
turnOn = true
Rückgabewerte können jetzt auch offene Arrays zurückgeben
Bisher war es nur möglich, Array mit fixer Grösse zurückzugeben:
def test()->byte[20]:
return "Hello"
Neu kann die Grösse offen sein:
def test(t)->byte[]
a:byte[20]
a="byte[20]"
b:byte[10]
b="byte[10]"
if t%2 == 0
return a
else
return b
for i in 10
print test(i)
sizeof
Die sizeof-Funktion kann jetzt auch auf verschachtelte Listen angewendet werden.
Experimentell: neue Serialisierungsfunktion für Objekte
Mit « lassen sich neu Objekte in Bytearrays umwandeln und umgekehrt. So kann man Objekt direkt beispielsweise in Dateien speichern. Wir werden diesen Befehl bald vor allem für erweiterte Kommunikationsbeispiele verwenden, z.B. zur Kommunikation zwischen Koprozessoren, Sensoren (I2C), aber auch für Funkprotokolle.
Das Beispiel speichert den Inhalt des Objekts v in einem Bytearray buf:
v = vector(x=10,y=20)
buf << v
Damit kann man die Daten wieder zurückschreiben:
buf = [0,0,32,65,0,0,160,65]
v:vector
v << buf
print v.toString()
Lade hier jetzt die kostenlose Kurzdokumentation zur Einführung in NanoPy runter:
Wir haben jetzt einen Youtube-Kanal, wo wir regelmässig neue Videos hochladen. Ein Besuch lohnt sich:
Fehlerkorrekturen
“print (1+2)+3” führt jetzt zu einem Fehler. Bei Beispielen mit Klammerausdrücken, darf print nicht ohne Klammern verwendet werden. Korrekt: print ((1+2)+3)
“print 10.0%4” führte zuvor zu einer Fehlermeldung.
“print 1+1” gibt jetzt 2 aus und nicht 11.
Die Funktionen stringToInt und stringToFloat können jetzt auch mit negativen Nummern umgehen.
Wir haben ein neues Game entwickelt. Dieses ist unter Beispiele > Spiele > Flying Cow zu finden :-)
Optimierung der Sprite-Ausgabe.
String-Funktionen
Bei korrekter Übergabe eines Arrays als Parameter einer Funktion wird nun keine Fehlermeldung mehr angezeigt.
2D-Funktionen
Netzwerk-Funktionen
String-Funktionen
Konstante Ausdrücke
Neu lassen sich auch in Konstanten einfache Berechnungen ausführen, sofern diese nur Zahlen bzw. andere Konstanten enthalten.
const ANGLE_30 = PI / 6
const SIZE = 100
Diese Berechnungen kann man nun auch bei der Deklaration von Arrays verwenden. Bisher war es nur möglich, einen fixen Wert oder eine Konstanten anzugeben.
const SIZE = 100
data:byte[SIZE * SIZE]
data2:byte[SIZE / 2]
Fehlerbehebungen
Bei verschachtelten Klassen mit integrierten Array-Datentypen wurden die Arrays nicht in jedem Fall korrekt initialisiert, wodurch die Arrays immer die Länge 0 hatten. Diese ist nun behoben.
Hier ein Beispiel einer KLasse SelectionList, welche eine eine Liste von Label-Objekten enthält, die je eine text-Variable mit einer Länge von 40 Bytes enthalten:
class Label:
i:float
x:byte
text:byte[40]
class SelectionList:
labels:Label[5]
def addText(text:byte[]):
labels[0].text = text
sl:SelectionList
sl.labels[0].x=1
sl.labels[0].i=1.5
sl.addText("ABC")
print(sl.labels[0].text)
print(sl.labels[0].i)
print(sl.labels[0].x)
Tritt unserem neuen Discord-Server bei, um direkt mit den Entwickler zu chatten und Teil der Oxocard-Community zu sein.
2D-Funktionen
Datei-Funktionen
System-Funktionen
IO-Funktionen
readADC(pinNr:byte, nSamples:long)->int
Neu lassen sich die Karten auch via USB-Kabel programmieren. Hierzu muss die Oxocard mindestens über Firmware Version 1.2.2 verfügen. Es funktioniert nur mit Chrome-Browser und je nach Betriebssystem müssen noch USB-Treiber installiert werden. Wenn man sich ausloggt, erscheint die neue Anmeldeseite, auf der weitere Informationen stehen.
Neu kann man Bilder vom Screen schiessen und sich im Browser anzeigen lassen. Hierzu gibt es in der Toolbar neben den Debugging-Werkzeugen das neue Kamera-Symbol. Dieses ist aktiv, wenn sich das Programm im Debugg-Mode befindet.
Wer Sensorik-Daten auf den PC/Mac übertragen möchte, kann dies nun über das Terminal-Fenster machen. Hierzu einfach die Daten mit dem print-Befehl in das Terminal-Fenster schicken (Achtung: das Terminal-Fenster muss offen sein, sonst wird nichts übertragen). Im Fenster gibt es neu am unteren Rand ein Download-Button, der die Daten in eine TXT-Datei exportiert.
Für die Weiterbearbeitung mit Excel empfiehlt es sich, das Terminal zuerst zu löschen. Wenn mehrere Daten geschickt werden sollen, einfach die Daten mit “;” abtrennen. z.B. print(wert1 + “;” + wert2 + “;” … )
Es gibt wieder viele neue Bespiele zu entdecken. Diese befinden sich unter “Beispiele”: - 2D: viele kleine Apps zeigen dir, wie du zweidimensionale Animationen bauen kannst. - 3D: mit der eingebauten 3D-Engine lassen sich auch einfache geometrische Objekte im dreidimensionalen Raum darstellen. - Spiele: hier finden sich weitere kleine Spiele, die als Basis für eigene Experimente dienen können. - Science-Parcours: diese Beispiele werden im separat erhältlichen Science Parcours benötigt. Mehr Information dazu via info@oxocard.ch
Die Demos wurden um eine sehr leistungsfähige Multimeter-App ergänzt. Damit lassen sich alle eingebauten Sensorwerte in einer übersichtlichen Skala beobachten.
Unter dem Ordner “Beispiele/3D” findet sich nun ein erstes Set von 3D-Animationen. Die Funktionen dazu werden in den nächsten Tage dokumentiert.
Neue Klassen
vector3D
Diese Klasse stellt folgende Funktionen zur Verfügung:
Neue Funktionen
Umbenannte Klassen
logValues wurde zu logValue umbenannt
Neue Klassen
Neue Funktionen
Klasse vector:
Klasse dateTime:
Neue Konstanten
File-Funktionen
Das Dateisystem der Oxocard kann nun mit einfachen Funktionen manipuliert werden. Damit können beispielsweise Texte oder Sensordaten gesammelt und persistiert werden. Bzw. auch nach einem Stromunterbruch wieder gelesen und weiterverarbeitet werden.
open(C_WRITE, "my_file.txt")
text = "Hello World!"
for c in text:
write(c)
close()
...
open(C_READ, "my_file.txt")
text:byte[13] # to hold "Hello World!"
for i in 13:
text[i] = read()
close()
setAutostart(enable)
Wenn die Autostartfunktion eingeschaltet wurde, wird bei einem Neustart der Oxocard (nach dem Verbinden mit dem Internet) direkt ins Startprogram gewechselt.
setAutostart(true)
turnOff()
Schaltet die Oxocard aus.
sleep(sec)
Schaltet die Oxocard aus und lässt sie nach x Sekunden wieder neustarten.
Sound-Funktionen
Es wurden viele neue Audio-Funktionen hinzugefügt, die es nun ermöglichen ganze Songs mit Code zu komponieren und abzuspielen.
setBPM(180)
beginSong()
noteAdvanced(C_NOTE_G, C_DURATION_1_8, C_OCTAVE_C4, C_ARTICULATION_STANDARD);
noteAdvanced(C_NOTE_A, C_DURATION_1_4, C_OCTAVE_C4, C_ARTICULATION_STANDARD);
noteAdvanced(C_NOTE_A, C_DURATION_1_8, C_OCTAVE_C4, C_ARTICULATION_STANDARD);
noteAdvanced(C_NOTE_REST, C_DURATION_1_8, C_OCTAVE_C5, C_ARTICULATION_STANDARD);
noteAdvanced(C_NOTE_A, C_DURATION_1_8, C_OCTAVE_C4, C_ARTICULATION_STANDARD);
noteAdvanced(C_NOTE_B, C_DURATION_1_8, C_OCTAVE_C4, C_ARTICULATION_STANDARD);
noteAdvanced(C_NOTE_C, C_DURATION_1_4, C_OCTAVE_C5, C_ARTICULATION_STANDARD);
noteAdvanced(C_NOTE_C, C_DURATION_1_8, C_OCTAVE_C5, C_ARTICULATION_STANDARD);
noteAdvanced(C_NOTE_REST, C_DURATION_1_8, C_OCTAVE_C5, C_ARTICULATION_STANDARD);
noteAdvanced(C_NOTE_C, C_DURATION_1_8, C_OCTAVE_C5, C_ARTICULATION_STANDARD);
noteAdvanced(C_NOTE_D, C_DURATION_1_8, C_OCTAVE_C5, C_ARTICULATION_STANDARD);
noteAdvanced(C_NOTE_B, C_DURATION_1_4, C_OCTAVE_C4, C_ARTICULATION_STANDARD);
noteAdvanced(C_NOTE_B, C_DURATION_1_8, C_OCTAVE_C4, C_ARTICULATION_STANDARD);
noteAdvanced(C_NOTE_REST, C_DURATION_1_8, C_OCTAVE_C5, C_ARTICULATION_STANDARD);
noteAdvanced(C_NOTE_A, C_DURATION_1_8, C_OCTAVE_C4, C_ARTICULATION_STANDARD);
noteAdvanced(C_NOTE_G, C_DURATION_1_8, C_OCTAVE_C4, C_ARTICULATION_STANDARD);
noteAdvanced(C_NOTE_A, C_OCTAVE_C4, 1.5, C_ARTICULATION_STANDARD);
noteAdvanced(C_NOTE_REST, C_DURATION_1_8, C_OCTAVE_C5, C_ARTICULATION_STANDARD);
#...
endSong()
playSong(true)
x=5
y=10
for i in [x..y]:
print(i)
Auch absteigende Reihen sind möglich:
for i in [-10..-20]:
print(i)
setPrecision(precision)
Formatiert beim Ausgeben von Float-Werten die Nachkommastellen:
f = 1.23931
setPrecision(2)
print(f) # "1.24"
clipRectangle(x,y,w,h)
Limitiert die Ausgabe bei den Zeichnungsbefehlen. Es wird nur im definierten Rechteck gezeichnet.
clipRectangle(0,0,240,120)
clear()
drawCircle(120,120,80)
update()
noClipping()
Setzt die clipping-Einstellung wieder auf den ganzen Schirm zurück.
drawImageMonoCentered(x,y,w,h,img)
Dieser Befehl ist identisch zu drawImageMono(..), jedoch wird das Bild mittig zur x/y-Koordinate gezeichnet (anstatt oben links). So ist es in Kombination mit den Befehlen rotate() und scale() nun möglich, ein Bild zentriert zu rotieren oder zu vergrössern/verkleinern.