En fråga om moduler i micropython

Permalänk
Medlem

En fråga om moduler i micropython

Jag har en python fil i micropython som hanterar utmatning till en liten oled skärm. Jag har skapat en funktion som matar ut text som man anger som ett argument till skärmen. Jag skulle vilja kunna importera den filen i en annan python fil och sen använda funktionen där för att få lite snyggare kod och använda funktionen för utmatning.

Problemet är att import funktionerna som ingår i den första inte verkar köras när jag importerar den i en annan python fil.

Vad är bästa lösningen för importerna och variabler som ingår i en modul som man importerar i en annan ska köras automatiskt?

Permalänk
Medlem

Du måste kalla rn funktion för att den ska köras.

Vad sägs om att du laddar upp koden någonstans så att vi kan se hur den ser ut. Svårt att säga utan att se vad du försöker åstadkomma.

Visa signatur

CCNP Enterprise + SPCOR
FCSS Network Security

Permalänk
Medlem

Ja det kanske är lite rörigt i beskrivningen, här är koden.

Först har vi oled.py man kan använda för att mata ut text på oled displayn:

oled.py

# Test the I2C connections # Tony Goodhew - 1st Jan 2024 - for thepihut.com import time from machine import Pin, I2C, ADC import ssd1306 import array # Needed for polygons WIDTH = 128 # oled display width HEIGHT = 64 # oled display height sda=machine.Pin(0) # Data pin scl=machine.Pin(1) # Clock pin i2c=machine.I2C(0,sda=sda, scl=scl, freq=400000) # Connection controller 0 oled = ssd1306.SSD1306_I2C(128, 64, i2c) # Initialise ssd1306 display # ======== ssd1306 set up for I2C ======== def sendtext(text): oled.fill(0) # Clear screen to BLACK oled.text(text,1,1,30) # Draw text in buffer - WHITE oled.show() # Display the buffer

Sen har jag en fil test.py där jag importerar oled.py och vill skicka text till funktionen sendtext. Problemet är att jag då får meddelandet: "NameError: name 'machine' isn't defined". Problemet verkar vara att import satserna i toppen av oled.py inte körs om jag anropar sendtext funktionen från en annan fil.

Här är test.py klassen:

import oled.py oled.sendtext("hello world")

Hoppas detta klargjorde problemet något bättre

Permalänk

Nu har jag ingen vana i micropython, men generellt i python: I och med att du har importerat Pin från machine-modulen:
from machine import Pin, I2C, ADC

Så behöver du inte anropa machine.Pin senare i koden, utan kan anropa Pin direkt.

I vanliga python så har man inte heller import oled.py utan bara import oled
Det kan eventuellt vara det som ställer till det med importena i din oled-fil

Permalänk
Medlem

Tog bort .py ändelsen från import oled.py i test.py men det hjälper inte, den tycker fortfarande att "machine isnt defined". Det funkar fint om jag kör oled.py direkt men det jag vill helst undvika det.

Permalänk
Medlem

Provade du det andra tipset du fick... att ta bort "machine." på de tre ställena som du använder dom?

Normalt när man gör en "FROM" import i python så hamnar dom i root namnrymden och man ska då inte prefixa med machine.

Permalänk

Hur ligger filerna i förhållande till varandra?
För att importera så som du skrivit behöver filerna ligga i samma folder.

Permalänk
Datavetare

Som redan nämnts är felet i import-delen.

Om vi antar att det finns en main.py som ser ut så här

import oled oled.sendtext("Hello, world!")

så kan oled.py t.ex. se ut så här

import machine WIDTH = 128 # oled display width HEIGHT = 64 # oled display height sda = machine.Pin(0) # Data pin scl = machine.Pin(1) # Clock pin i2c = machine.I2C(0, sda=sda, scl=scl, freq=400000) # Connection controller 0 # ... def sendtext(text): print(text)

eller så här

from machine import Pin, I2C, ADC WIDTH = 128 # oled display width HEIGHT = 64 # oled display height sda = Pin(0) # Data pin scl = Pin(1) # Clock pin i2c = I2C(0, sda=sda, scl=scl, freq=400000) # Connection controller 0 # ... def sendtext(text): print(text)

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer