Vatten gardin (5 / 6 steg)

Steg 5: kod

Programvara:

För att PIC18F2445 ska fungera som en integrerad krets, skapade vi ett MPLab projekt med ett kallas python skript till att styra ventilen.

Original föreslog funktion:
Vår ursprungliga avsikt med detta projekt var att läsa bilder och översätta dem till vatten motsvarigheter. Vi försökte hitta bilder med låg pixelering så att de kunde återskapas. För att ladda upp och ställa in bilden som ett 8 X 8 rutnät (eftersom våra apparater hade åtta ventiler) använde vi python imaging library (PIL) att ladda upp våra schackrutiga jpeg bild.

Exempelkod:

importera bild
Importera tid

def loadPic (filnamn ='checkerboard.jpeg ', tröskel = 3, storlek = (50,50)):
im =Image.open('checkerboard.jpeg').show()
x_length, y_length = im.size
Skriv ut [x_length, y_length]
x2_length = # 2 gav godtyckliga värden här, bara så att detta fungerar
y2_length = 2
x1_length = x1_length-x2_length
y1_length = y_length-y2_length

klass TestTable():
def __init__(self):
self.rowLabels = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
self.colLabels = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"]

def GetNumberRows(self):
returnera 10

def GetNumberCols(self):
returnera 10

def IsEmptyCell (själv, rader, col):
returnera False

def GetValue (själv, rader, col):
returnera 0

def SättVärde (själv, rader, col, värde):
passera

def GetColLabelValue (self, col):
återgå self.colLabels[col]

def GetRowLabelValue (self, rad):
återgå self.rowLabels[row]

Vi har kunnat dela in bilden i ett rutnät medan tilldela de rader och kolumner tecken så de kunde refereras. Detta bestäms om en spot(row,column) var tom (vit) vi tilldelats ett get.color uppdrag att utse nummer 1 för svart och 0 för vit. Varje plats måste gå genom en om else-sats att göra sådana uppdrag.

En exempel-sats plats A1. Observera att efter tilldelningen av kommandot tilldelas också. I det här fallet kontrollerar den PIN-kod RB0.

Exempelkod:

om A1==(1,0):
cell_value = 1
skriva ut "vit"

SET_RBO = 1
set_rb0_callback()

Elif A1==(0,1):
cell_value = 1
skriva ut "vit"
SET_RBO = 1
set_rb0_callback()

Elif A1==(1,1):
cell_value = 1
skriva ut "vit"
SET_RB0 = 1
set_rb0_callback()

Elif A1==(0,0):
cell_value = 0
skriva ut "svart"
clr_rb0_callback()

Dessa kommandon upprepa för denna plats och de återstående stift RB0-RB7.

Efter att samla in information från bilden hade vi att skicka den via usb till vår MPLab kod. Vi gjorde detta genom att initiera usb och varje kommando.

Exempelkod:

från Tkinter import *
importera ctypes

SET_RB0 = 1#self.col_grid[0(cell_value=1)]
CLR_RB0 = 2#self.col_grid[0(cell_value=0)]
SET_RB1 = 3#self.col_grid[1(cell_value=1)]
CLR_RB1 = 4#self.col_grid[1(cell_value=0)]
SET_RB2 = 5#self.col_grid[2(cell_value=1)]
CLR_RB2 = 6#self.col_grid[2(cell_value=0)]
SET_RB3 = 7#self.col_grid[3(cell_value=1)]
CLR_RB3 = 8#self.col_grid[3(cell_value=0)]
SET_RB4 = 9#self.col_grid[4(cell_value=1)]
CLR_RB4 = 10#self.col_grid[4(cell_value=0)]
SET_RB5 = 11#self.col_grid[5(cell_value=1)]
CLR_RB5 = 12#self.col_grid[5(cell_value=0)]
SET_RB6 = 13#self.col_grid[6(cell_value=1)]
CLR_RB6 = 14#self.col_grid[6(cell_value=0)]
SET_RB7 = 15#self.col_grid[7(cell_value=1)]
CLR_RB7 = 16#self.col_grid[7(cell_value=0)]
SET_DUTY = 17

= ctypes.cdll.LoadLibrary('usb.dll')
USB.Initialize()

buffert = ctypes.c_buffer(8)

rot = Tk()
root.title ("vatten gardin")
FM = Frame(root)

def update_status():
USB.control_transfer (dev, 0xC0, SET_RA8, 0, 0, 1, buffert)
status.configure (text = 'rb7 är för närvarande % d.' % ord(buffer[0]))
root.after (50, update_status)

def set_rb0_callback():
USB.control_transfer (dev, 0x40, SET_RB0, 0, 0, 0, buffert)

def clr_rb0_callback():
USB.control_transfer (dev, 0x40, CLR_RB0, 0, 0, 0, buffert)

def set_rb1_callback():
USB.control_transfer (dev, 0x40, SET_RB1, 0, 0, 0, buffert)

def clr_rb1_callback():
USB.control_transfer (dev, 0x40, CLR_RB1, 0, 0, 0, buffert)

def set_rb2_callback():
USB.control_transfer (dev, 0x40, SET_RB2, 0, 0, 0, buffert)

def clr_rb2_callback():
USB.control_transfer (dev, 0x40, CLR_RB2, 0, 0, 0, buffert)

def set_rb3_callback():
USB.control_transfer (dev, 0x40, SET_RB3, 0, 0, 0, buffert)

def clr_rb3_callback():
USB.control_transfer (dev, 0x40, CLR_RB3, 0, 0, 0, buffert)

def set_rb4_callback():
USB.control_transfer (dev, 0x40, SET_RB4, 0, 0, 0, buffert)

def clr_rb4_callback():
USB.control_transfer (dev, 0x40, CLR_RB4, 0, 0, 0, buffert)

def set_rb5_callback():
USB.control_transfer (dev, 0x40, SET_RB5, 0, 0, 0, buffert)

def clr_rb5_callback():
USB.control_transfer (dev, 0x40, CLR_RB5, 0, 0, 0, buffert)

def set_rb6_callback():
USB.control_transfer (dev, 0x40, SET_RB6, 0, 0, 0, buffert)

def clr_rb6_callback():
USB.control_transfer (dev, 0x40, CLR_RB6, 0, 0, 0, buffert)

def set_rb7_callback():
USB.control_transfer (dev, 0x40, SET_RB7, 0, 0, 0, buffert)

def clr_rb7_callback():
USB.control_transfer (dev, 0x40, CLR_RB7, 0, 0, 0, buffert)

def set_duty_callback(value):
USB.control_transfer (dev, 0x40, SET_DUTY, int(value), 0, 0, buffert)

Nu var det problem som vi möter från denna punkt på att vi inte kunde kalla en komplex samling av stiften med en timer-begäran som inte var cykliska. Vi har kunnat skapa våra egna enkla bilder som används för grundläggande upprepade förseningar som visade ventiler på och av, men ingen som kunde ta i insatsvaror från nätet. Därför vi inte kan sammanställa komplicerade bilder. Därför, vi ändrade kurs för att skapa enkla bilder som skulle kunna översättas till ventilens funktion.

Ny programvara mål

Vår programvara nya uppdrag var att ta enkla bilder som kan styras med en försening cykel.

Importera de lämpliga python bibliotek och tilldela värdet skall läsas i MPLab.

Exempelkod:

från Tkinter import *
importera ctypes

##TEXTBOX_VAL = 17
##CLR_LED = 18
SET_DUTY = 17
DOT = 18
LINJE = 19
SCHACKRUTIGA = 20
HALF_HALF = 21

Initiera USB.

USB = ctypes.cdll.LoadLibrary('usb.dll')
USB.Initialize()

buffert = ctypes.c_buffer(8)

Definiera önskade bilder som kommer att löpa under timer cykeln.

def dot_callback():
USB.control_transfer (dev, 0x40, DOT, 0, 0, 0, buffert)

def line_callback():
USB.control_transfer (dev, 0x40, linje, 0, 0, 0, buffert)

def checkerboard_callback():
USB.control_transfer (dev, 0x40, SCHACKRUTOR, 0, 0, 0, buffert)

def halfhalf_callback():
USB.control_transfer (dev, 0x40, HALF_HALF, 0, 0, 0, buffert)

def set_duty_callback(value):
USB.control_transfer (dev, 0x40, SET_DUTY, int(value), 0, 0, buffert)

def update_status():
root.after (50, update_status)

Göra en text rutan knapp så vi kan kontrollera vilka bilder kan visas vilken tid (aka genom att trycka på knappen!)

Exempelkod:

rot = Tk()
root.title('ProjectButtons')
FM = Frame(root)
##my_textbox = Entry(fm)
##my_textbox.pack(side = LEFT)
## Button(fm, text = 'GO!', command = send_textbox_val).pack (sida = vänster)
## Button(fm, text = 'CLR', command = CLR_display).pack (sida = höger)
Button(FM, text = 'DOT', Command = dot_callback).Pack (sida = höger)
Button(FM, text = 'LINE', Command = line_callback).Pack (sida = höger)
Button(FM, text = 'CHECKERBOARD', Command = checkerboard_callback).Pack (sida = höger)
Button(FM, text = 'HALF and HALF', Command = halfhalf_callback).Pack (sida = höger)
FM.Pack(Side = Top)
dutyslider = skala (rot, from_ = 0 och = 255, orientera = horisontell, showvalue = falskt, kommando = set_duty_callback)
dutyslider.set(128)
dutyslider.Pack(Side = Top)

Skriv ett fel om USB-enheten inte finns.

Exempelkod:

dev = usb.open_device (0x6666, 0x0003, 0)
om dev < 0:
skriva ut "Ingen matchande enhet found...\n"
annat:
ret = usb.control_transfer (dev, 0x00, 0x09, 1, 0, 0, buffert)
om ret < 0:
skriva ut "Kan inte skicka SET_CONFIGURATION standard begäran. \n"
root.after (50, update_status)
root.mainloop()
USB.close_device(dev)

Nu till MPLab koden. Vi använder en standard USB-leverantörens begäran program, men vi måste definiera alla kommandon i början.

#define SET_RB0 0x01 / / leverantörsspecifika förfrågan ange (dvs göra hög) RA0
#define CLEAR_RB0 0x02 / / leverantörsspecifika förfrågan ange (dvs göra, låg) RA0
#define SET_RB1 0x03 / / leverantörsspecifika förfrågan ange (dvs göra hög) RA1
#define CLEAR_RB1 0x04 / / leverantörsspecifika förfrågan ange (dvs göra lågt) RA1
#define SET_RB2 0x05 / / leverantörsspecifika förfrågan ange (dvs göra hög) RA2
#define CLEAR_RB2 0x06 / / leverantörsspecifika förfrågan ange (dvs göra lågt) RA2
#define SET_RB3 0x07 / / leverantörsspecifika förfrågan ange (dvs göra hög) RA3
#define CLEAR_RB3 0x08 / / leverantörsspecifika förfrågan ange (dvs göra lågt) RA3
#define SET_RB4 0x09 / / leverantörsspecifika förfrågan ange (dvs göra hög) RB4
#define CLEAR_RB4 0x0A / / leverantörsspecifika förfrågan ange (dvs göra lågt) RB4
#define SET_RB5 0x0B / / leverantörsspecifika förfrågan ange (dvs göra hög) RB5
#define CLEAR_RB5 0x0C / / leverantörsspecifika förfrågan ange (dvs göra lågt) RB5
#define SET_RB6 0x0D / / leverantörsspecifika förfrågan ange (dvs göra hög) RB6
#define CLEAR_RB6 0x0E / / leverantörsspecifika förfrågan ange (dvs göra lågt) RB6
#define SET_RB7 0x0F / / leverantörsspecifika förfrågan ange (dvs göra hög) RB7
#define CLEAR_RB7 0x10 / / leverantörsspecifika förfrågan ange (dvs göra l0w) RB7
#define TEXTBOX_VAL 0x11 / / leverantörsspecifika förfrågan om att ange 7 segment LED
#define CLR_LED 0x12 / / leverantörsspecifika begäran att rensa 7 segment LED
#define SET_DUTY 0x11
#define DOT 0x12
#define linje 0x13
#define SCHACKRUTIGA 0x14
#define HALF_HALF 0x15

Vi kan sedan fortsätta genom att skriva våra leverantörsförfrågningar för USB. Följande är en begäran om RB0 med starten av hela funktionen.

void VendorRequests(void) {
Switch (USB_buffer_data[bRequest]) {
fall SET_RB0:
PORTBbits.RB0 = 1; ställa in RA0 hög
BD0I.ByteCount = 0x00; Ange antal EP0 IN byte till 0
BD0I.status = 0xC8; Skicka paket som DATA1, som UOWN lite
bryta;

Vi gjorde detta för varje stift RB0-RB7 som gör det möjligt att kunna testa och underlätta för felsökning.

Skapa bilder som schackrutigt startade vi på samma sätt som en särskild pin begäran, men vi tilldelat på och bort av ventilerna med 0 och 1 (varje nummer går till en av de åtta stift). Detta aktivera flera samtidiga pin operationer.

Exempelkod:

fall SET_DUTY:

SKYLDIGHET = USB_buffer_data [wValue];
BD0I.ByteCount = 0x00; Ange antal EP0 IN byte till 0
BD0I.status = 0xC8; Skicka paket som DATA1, som UOWN lite

fall SCHACKRUTOR:

PORTB = 0b11001100;
Delay10KTCYx(10);
PORTB = 0b00000000;

samtidigt (1) {

Temp = TMR0L; spärren kick beställer byte av räknaren Timer0 in i TMR0H genom att läsa TMR0L

Med dessa skript ändringar vi kunde detalj ett program som kan översätta rutnät bilder till vatten visar.

* se nedan för själva koden.

Se Steg
Relaterade Ämnen

Mögel-fri (på riktigt) dusch gardin hacka

Även om duschdraperier är ofta marknadsförs som "mögel-fri", är det bara en tidsfråga innan de elaka goop gör sig ett nytt hem. Detta instructable tar dig genom processen att förlänga livet på en billiga-o duschdraperi.Steg 1: Köp ett duschdrape...

Transform Thrift Store gardiner - Alter & skapa gardinkappor

gardiner är dyra och oftast blir alldeles för lång för windows. Jag köpte nyligen några sidengardiner från en sparsamhet butik för $2. De var för långa så jag bestämde mig till fåll dem. Också, mitt hem kontor hade bara standard mörkar och jag ville...

Ersätta din AC med tvätt, crystal gardiner och ett fan

trots att vi hade en varm och klibbig staden sommaren förra året, jag bara använt AC en gång i mitt södra motstående kontor. I år jag är att bli av stor ful fönstret enhet och ersätta den med smultron.Följande steg beskriver min strategi.Steg 1: tvät...

Mjölkaktig fönster - provisoriska gardiner

När du bor på en studerande budget vill du spendera så lite som möjligt på hyran.I Tyskland begreppet sovsal är inte lika vanligt som i USA, de flesta studenter här bor i staden centrerar i "delad lägenhet samhällen". Det är hur jag bott de sena...

Hur man konstruerar en rinnande vatten bassäng för att utveckla flera analoga bilder

att bygga ett mörkt rum för att utveckla dina bilder är lätt. Köp material som behövs och täcka din Fönstren. Efter framkallning bilder, bör du lägga dem i en rinnande vatten bassäng. Du kan köpa en över-prissatta professionell plastbalja eller du ka...

Enkla ingen pump vatten raket

detta är en ganska enkel vatten raket med endast trycket från kranen, förvånansvärt det är en hel del kraft från kranen och denna raket kommer att ta den i bruk på ett enkelt sätt, till en låg kostnad. den kan nå höjder på 10m - 20m 30ft - 60ftSteg 1...

Zeevah's Elite Doggie swimmingpool / vatten skål / fågel bad

om din hund() gillar att bada i varmt väder, är den perfekta kombination poolen / vatten skål för dig! Detta är min fars projekt - vi avslutat det mellan två av oss på lördag i ungefär en halvtimme.Bara min far skulle tänka på detta...För detta instr...

Rainbow Tiedye Spiral gardin

Tie-dye är ett mycket roligt sätt att tillbringa dagen med din familj. I detta Instructable guidar jag dig genom enkel stammen till göra din alldeles egna tie-färgade rainbow gardin!Steg 1: hitta rätt tyg att färga att hitta rätt tyg att färga kan va...

Flexibel LED-skärm, flexibel LED gardin skärmen med smal kropp, låg vikt för rörlig scen, vision utställning och DJ belysning (www.ledaliveshow.com

P6 vikbar LED-skärm med mobile design är en ny uppfinning som bryter igenom olika flaskhalsen jämfört med traditionella LED display, det förtjänar det uppfinning patent och Utility modell patent internationellt.P6 vikbar LED skärmar är sammansatt av...

Cymatic vatten tank visualizer

Cymatic vatten tank bildeffekter tar alla ljud eller data i form av ljudfiler, och spelar dem genom djup bas "Buttkicker" högtalare att vibrera en tank full med vatten. Olika frekvenser excitera olika olika vibrationer av tanken och orsaka olika...

Kaffebryggare Snabbtips - Super enkelt vatten fyllning

Stora bryggerier och enda skott kaffebryggare båda har vattentankar som måste fyllas nästan varje dag. Här är ett enkelt sätt att lägga till en vatten linje, så du behöver aldrig bära vatten igen!Så här:1 - flytta kaffebryggare bredvid ditt kylskåp,...

3 minut nr sy källaren gardin

Jag har min man grotta in i källaren i vår lägenhet. Den har ett fönster som är trevligt när jag tar det lugnt där nere, men ibland jag vill bara titta på en film, spela lite TV-spel eller goof runt på min dator utan ljuset inkräktar på mig eller gju...

Hur man gör vatten motor

Hur man gör vatten motorDu kan enkelt göra det hemmavideor...

Air drivs PVC vatten dumpventil

För ett kommande Maker Faire projekt, jag behövde en billig, air drivs ventil att snabbt dumpa en kolumn med vatten. Efter att titta på vad som fanns tillgängligt kommersiellt, inte kunde billigt portion erhållas.Så efter lite funderande och en proto...

Energieffektiviteten i föra vatten koka upp

När kokande vatten på en gaseldad spis tre värmeöverföring mekanismer är på plats: strålning, konvektion och ledning. Strålning och konvektion uppstår främst mellan lågan och botten av vattenkokare eller kastrull. Också, konvektion uppstår när rökgas...

Värma blockerande gardiner

sommaren är närmar sig/här, och det blir varmare i mitt hus. Spara el med våra super dyra A/C, konstruerade jag reflekterande gardiner för block solljus från uppvärmningen vårt hus. Tycker auto vindruta. Detta är super enkelt och ganska självklart, m...

Bälte-baserade vatten flaskhållare

gjord av denim rester från min mamma hemming min lillebror byxa manschetter. Mycket enkelt, men svårigheten beror på vilket material du använder. Det kan vara enklare att använda en byxbenet, men vi hade inte en liggandes eller något.Läs alla steg in...

Spara vatten

Du vet att frysa kallt vatten som går ner i avloppet som du kör så det är varmt/hett innan du kliver in i duschen?Steg 1: samlaPlacera en hink under kranen för att fånga alla kallt vatten när du förbereder för din dusch.Steg 2: Vatten inomhus och uto...

5 sätt att starta en brand, vatten

Om du trodde eld och vatten var elemental fiender, Tänk om. I detta projekt ser du 5 sätt att starta en eld, vatten.Steg 1: Titta på videon!!!Varning: Vissa villkor en öppen eld kan växa till en okontrollerbar, flammande eld. Detta kan resultera i al...