Rideau d’eau (5 / 6 étapes)

Étape 5: Code

Logiciel :

Afin que les PIC18F2445 d’agir comme un circuit intégré, nous avons créé un projet MPLab avec un script python appelé pour contrôler les fonctions de la vanne.

Original proposé fonction :
Notre intention initiale de ce projet était de lire les images et les traduire en équivalents d’eau. Nous avons essayé de trouver des images avec faible pixelisation alors qu’ils étaient peuvent être recréées. Afin de télécharger et de définir l’image comme une grille 8 X 8 (étant donné que notre appareil avait huit soupapes), nous avons utilisé le python imaging library (PIL) pour télécharger notre image jpeg de damier.

Exemple de Code :

importer Image
moment de l’importation

def loadPic (filename ='checkerboard.jpeg ', seuil = 3, taille = (50,50)) :
im =Image.open('checkerboard.jpeg').show()
x_length, y_length = im.size
imprimer [x_length, y_length]
x2_length = 2# a donné une valeur arbitraire ici, juste pour que cela fonctionne
y2_length = 2
x1_length = x1_length-x2_length
y1_length = y_length-y2_length

classe 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) :
retour 10

def GetNumberCols(self) :
retour 10

def IsEmptyCell (self, row, col) :
renvoient la valeur False

DEF GetValue (Gites, row, col) :
retourne 0

def SetValue (auto, ligne, col, valeur) :
Pass

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

def GetRowLabelValue (self, rangée) :
retour self.rowLabels[row]

On peut diviser l’image en une telle grille tout en assignant les lignes et les caractères de la colonne, donc ils pourraient être référencés. Cela a déterminé que si un spot(row,column) était vide (blanc), nous avons attribué une affectation de get.color pour désigner le numéro 1 pour le noir et 0 pour les blancs. Chaque tache devra passer par un if instruction else pour rendre ces affectations.

Une déclaration d’exemple pour l’A1 spot. Notez que, après la cession, la commande est également affectée. Dans ce cas, il contrôle la broche RB0.

Exemple de Code :

si A1==(1,0) :
cell_value = 1
imprimer « blanc »
SET_RBO = 1
set_rb0_callback()

Elif A1==(0,1) :
cell_value = 1
imprimer « blanc »
SET_RBO = 1
set_rb0_callback()

Elif A1==(1,1) :
cell_value = 1
imprimer « blanc »
SET_RB0 = 1
set_rb0_callback()

Elif A1==(0,0) :
cell_value = 0
imprimer « noir »
clr_rb0_callback()

Ces commandes Répéter pour cet endroit et pour les autres broches RB0-RB7.

Après la collecte des données de l’image, nous avons eu à envoyer par l’intermédiaire de l’usb à notre code de MPLab. Nous l’avons fait en initialisant l’usb et chaque commande.

Exemple de Code :

de Tkinter import *
importer 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()

tampon = ctypes.c_buffer(8)

racine = Tk()
root.title ("rideau d’eau")
FM = Frame(root)

def update_status() :
USB.control_transfer (dev, 0xC0, SET_RA8, 0, 0, 1, tampon)
Status.configure (text = « rb7 est actuellement de % d. » % ord(buffer[0]))
root.after (50, update_status)

def set_rb0_callback() :
USB.control_transfer (dev, 0 x 40, SET_RB0, 0, 0, 0, tampon)

def clr_rb0_callback() :
USB.control_transfer (dev, 0 x 40, CLR_RB0, 0, 0, 0, tampon)

def set_rb1_callback() :
USB.control_transfer (dev, 0 x 40, SET_RB1, 0, 0, 0, tampon)

def clr_rb1_callback() :
USB.control_transfer (dev, 0 x 40, CLR_RB1, 0, 0, 0, tampon)

def set_rb2_callback() :
USB.control_transfer (dev, 0 x 40, SET_RB2, 0, 0, 0, tampon)

def clr_rb2_callback() :
USB.control_transfer (dev, 0 x 40, CLR_RB2, 0, 0, 0, tampon)

def set_rb3_callback() :
USB.control_transfer (dev, 0 x 40, SET_RB3, 0, 0, 0, tampon)

def clr_rb3_callback() :
USB.control_transfer (dev, 0 x 40, CLR_RB3, 0, 0, 0, tampon)

def set_rb4_callback() :
USB.control_transfer (dev, 0 x 40, SET_RB4, 0, 0, 0, tampon)

def clr_rb4_callback() :
USB.control_transfer (dev, 0 x 40, CLR_RB4, 0, 0, 0, tampon)

def set_rb5_callback() :
USB.control_transfer (dev, 0 x 40, SET_RB5, 0, 0, 0, tampon)

def clr_rb5_callback() :
USB.control_transfer (dev, 0 x 40, CLR_RB5, 0, 0, 0, tampon)

def set_rb6_callback() :
USB.control_transfer (dev, 0 x 40, SET_RB6, 0, 0, 0, tampon)

def clr_rb6_callback() :
USB.control_transfer (dev, 0 x 40, CLR_RB6, 0, 0, 0, tampon)

def set_rb7_callback() :
USB.control_transfer (dev, 0 x 40, SET_RB7, 0, 0, 0, tampon)

def clr_rb7_callback() :
USB.control_transfer (dev, 0 x 40, CLR_RB7, 0, 0, 0, tampon)

def set_duty_callback(value) :
USB.control_transfer (dev, 0 x 40, SET_DUTY, int(value), 0, 0, tampon)

Maintenant le problème que nous avons rencontrés de ce point sur était que nous n’étions pas en mesure d’appeler un ensemble complexe de pins avec une demande de minuterie qui n’est pas cyclique. Nous avons pu créer nos propres images simples utilisé base retards répétés qui a transformé les vannes sur et en dehors, mais aucun qui pourrait avoir dans les entrées de la grille. Par conséquent, nous pas capable de compiler les images complexes. Par conséquent, nous avons changé de Cap pour créer des images simples qui pourraient être traduits en fonction de la vanne.

Nouvel objectif du logiciel

La nouvelle mission de notre logiciel a été de prendre des images simples qui pourraient être contrôlés par un cycle de retard.

Importer les bibliothèques python approprié et attribuer la valeur à lire MPLab.

Exemple de Code :

de Tkinter import *
importer ctypes

##TEXTBOX_VAL = 17
##CLR_LED = 18
SET_DUTY = 17
DOT = 18
LIGNE = 19
DAMIER = 20
HALF_HALF = 21

Initialiser le port USB.

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

tampon = ctypes.c_buffer(8)

Décrivez les images recherchées qui seront déroulera dans le cadre du cycle de minuterie.

def dot_callback() :
USB.control_transfer (dev, 0 x 40, DOT, 0, 0, 0, tampon)

def line_callback() :
USB.control_transfer (dev, 0 x 40, LINE, 0, 0, 0, tampon)

def checkerboard_callback() :
USB.control_transfer (dev, 0 x 40, damier, 0, 0, 0, tampon)

def halfhalf_callback() :
USB.control_transfer (dev, 0 x 40, HALF_HALF, 0, 0, 0, tampon)

def set_duty_callback(value) :
USB.control_transfer (dev, 0 x 40, SET_DUTY, int(value), 0, 0, tampon)

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

Faire un bouton zone de texte alors que nous pouvons contrôler Quelles images peuvent affiche à quelle heure (aka en appuyant sur le bouton!)

Exemple de Code :

racine = 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 (côté = gauche)
## Button(fm, text = 'CLR', command = CLR_display).pack (côté = droite)
Button(FM, text = 'DOT', Command = dot_callback).Pack (côté = droite)
Button(FM, text = 'LINE', Command = line_callback).Pack (côté = droite)
Button(FM, text = 'CHECKERBOARD', Command = checkerboard_callback).Pack (côté = droite)
Button(FM, text = 'HALF and HALF', Command = halfhalf_callback).Pack (côté = droite)
FM.Pack(Side = Top)
dutyslider = échelle (racine, from_ = 0, to = 255, orienter = HORIZONTAL, showvalue = FALSE, commande = set_duty_callback)
dutyslider.Set(128)
dutyslider.Pack(Side = Top)

Écrire une erreur si le périphérique USB n’est pas trouvé.

Exemple de Code :

dev = usb.open_device (0x6666, 0x0003, 0)
Si dev < 0 :
n’imprimer « Aucune correspondance dispositif found...\n »
autre chose :
RET = usb.control_transfer (dev, 0 x 00, 0 x 09, 1, 0, 0, tampon)
Si ret < 0 :
Print « impossible d’envoyer des SET_CONFIGURATION standard demande. \n »
root.after (50, update_status)
root.mainloop()
USB.close_device(dev)

Maintenant au code MPLab. Nous utilisons un programme de demande fournisseur USB standard, mais on doit définir toutes les commandes au début.

#define SET_RB0 0 x 01 / / spécifiques au fournisseur demande à définir (c'est-à-dire faire élevé) RA0
#define CLEAR_RB0 0 x 02 / / spécifiques au fournisseur demande à définir (c'est-à-dire faire ; faible) RA0
#define SET_RB1 0 x 03 / / spécifiques au fournisseur demande à définir (c'est-à-dire faire élevé) RA1
#define CLEAR_RB1 0 x 04 / / spécifiques au fournisseur demande à définir (c'est-à-dire, rendre faible) RA1
#define SET_RB2 0 x 05 / / spécifiques au fournisseur demande à définir (c'est-à-dire faire élevé) RA2
#define CLEAR_RB2 0 x 06 / / spécifiques au fournisseur demande à définir (c'est-à-dire, rendre faible) RA2
#define SET_RB3 0 x 07 / / spécifiques au fournisseur demande à définir (c'est-à-dire faire élevé) RA3
#define CLEAR_RB3 0 x 08 / / demande de spécifiques au fournisseur pour définir (c'est-à-dire, rendre faible) RA3
#define SET_RB4 0 x 09 / / spécifiques au fournisseur demande à définir (c'est-à-dire faire élevé) RB4
#define CLEAR_RB4 0x0A / / spécifiques au fournisseur demande à définir (c'est-à-dire, rendre faible) RB4
#define SET_RB5 0x0B / / spécifiques au fournisseur demande à définir (c'est-à-dire faire élevé) RB5
#define CLEAR_RB5 0x0C / / spécifiques au fournisseur demande à définir (c'est-à-dire, rendre faible) RB5
#define SET_RB6 0x0D / / spécifiques au fournisseur demande à définir (c'est-à-dire faire élevé) RB6
#define CLEAR_RB6 0x0E / / spécifiques au fournisseur demande à définir (c'est-à-dire, rendre faible) RB6
#define SET_RB7 0x0F / / spécifiques au fournisseur demande à définir (c'est-à-dire faire élevé) RB7
#define CLEAR_RB7 0 x 10 / / spécifiques au fournisseur demande à définir (c'est-à-dire faire l0w) RB7
#define TEXTBOX_VAL 0 x 11 / / demande spécifiques au fournisseur de mettre 7 segment LED
#define CLR_LED 0 x 12 / / demande spécifiques au fournisseur pour effacer 7 segment LED
#define SET_DUTY 0 x 11
#define DOT 0 x 12
#define ligne 0 x 13
#define damier 0 x 14
#define HALF_HALF 0 x 15

Nous pouvons alors procéder en écrivant nos demandes de fournisseur pour l’USB. Voici une demande pour RB0 avec le début de la fonction entière.

void VendorRequests(void) {}
commutateur (USB_buffer_data[bRequest]) {}
affaire SET_RB0 :
PORTBbits.RB0 = 1 ; la valeur de RA0 haute
BD0I.byteCount = 0 x 00 ; nombre d’octets EP0 IN la valeur 0
BD0I.Status = 0xC8 ; Envoyer le paquet comme DATA1, UOWN bit de la valeur
rupture ;

Nous l’avons fait pour chaque broche RB0-RB7 pour nous permettre de pouvoir tester et faciliter les moyens de débogage.

En créant des images comme le damier, nous avons commencé de la même manière comme une demande de code pin spécifique, mais nous avons attribué le sur et hors les vannes avec 0 et 1 (chaque numéro passe à l’un des huit broches). Ceci permettre l’usage multiple des opérations simultanées broche.

Exemple de Code :

affaire SET_DUTY :

SERVICE = USB_buffer_data [wValue] ;
BD0I.byteCount = 0 x 00 ; nombre d’octets EP0 IN la valeur 0
BD0I.Status = 0xC8 ; Envoyer le paquet comme DATA1, UOWN bit de la valeur

cas de damier :

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

tandis que (1) {}

Temp = TMR0L ; verrou de l’octet de poids fort du compteur Timer0 dans TMR0H en lisant TMR0L

Ces modifications de script, que nous avons pu en détail sur un programme qui peut se traduire par des images de grille à l’eau affiche.

* Voir ci-dessous pour le code réel.

Articles Liés

Arrosage d’eau simple.

Arrosage d’eau simple.

Arroser votre jardin devrait préférablement être fait avec l'eau de pluie. Cependant, parfois en utilisant l'eau du robinet est inévitable. Dans ce cas on devrait, comme avec toutes les ressources naturelles, être efficace et raisonnable.Déjà remarqu
Cheval de corbillard tiré pliable

Cheval de corbillard tiré pliable

Horse Drawn corbillardTroy CrivelloneCe corbillard tiré de cheval a été construit pour être transportés et stocké non assemblé. Mon travail fait les cadres tube carré et les bases qu'ils intègrent. Cela a été fait de s'asseoir sur une table de confér
Comment réparer votre swamp cooler ("overclocker" 50 %)

Comment réparer votre swamp cooler ("overclocker" 50 %)

refroidisseurs marais fonctionnent bien jusqu'à ce qu'il atteigne 94 degrés. À ce moment-là, ils cessent de refroidir aussi bien, parce que la pompe ne peut pas obtenir assez d'eau sur les patins pour les garder humides. Donc en augmentant la quantit
Saupoudrer-Master 5000

Saupoudrer-Master 5000

Je me suis inspiré pour créer mon propre, version agrandie au moins un autre arroseur PVC instructable.  Ce que vous voyez ici est le produit fini dans toute sa splendeur.  Ma femme aime se réfèrent à lui comme le « saupoudrer-Master 5000 ». Je ne sa
Elite Doggie Swimming Pool de Zeevah / eau bol / Bird Bath

Elite Doggie Swimming Pool de Zeevah / eau bol / Bird Bath

si votre chien aime se baigner par temps chaud, c'est la combinaison parfaite de piscine / bol d'eau pour vous ! Il s'agit de projets de mon père - nous il terminé entre nous deux samedi dans environ une demi-heure.Seul mon père pense que cela...Pour
Moule-gratuit hack de rideau de douche (pour de vrai)

Moule-gratuit hack de rideau de douche (pour de vrai)

Même si les rideaux en douche est souvent annoncés comme « moule-libre », ce n'est qu'une question de temps avant que le méchant goop fait une nouvelle maison. Cette instructable vous mènera à travers le processus de prolonger la vie d'un rideau de d
Avoir un rideau de douche gratuite de moisissure dans votre baignoire

Avoir un rideau de douche gratuite de moisissure dans votre baignoire

non seulement est un rideau de douche gratuite moule possible, c'est facile !Étape 1: Ce que vous aurez besoin1 - un petit crochet à fixer au mur au-dessus de la baignoire.  Cela peut être un peu en plastique crochet « collantes » si vous avez des mu
Transform Thrift Store rideaux - Alter & Create cantonnières

Transform Thrift Store rideaux - Alter & Create cantonnières

rideaux sont coûteux et finissent généralement par être beaucoup trop long pour vos fenêtres. J'ai récemment acheté des rideaux de soie d'un magasin d'aubaines pour 2 $. Ils étaient trop longues, donc j'ai décidé de les ourler. Aussi, mon bureau à do
Convertir une eau chaude Chauffage dans un poêle à bois

Convertir une eau chaude Chauffage dans un poêle à bois

environ 6 ans, avec le coût du chauffage de ma maison à la hausse, j'ai commencé à regarder les dessins pour les poêles à bois. Dans les nouvelles de la terre mère (Issue # 49 - janvier/février 1978), j'ai trouvé un article prometteur sur l'utilisati
Laiteux fenêtre - rideaux de fortune

Laiteux fenêtre - rideaux de fortune

Quand on vit sur un budget d'étudiants vous voulez dépenser le moins possible sur le loyer.En Allemagne, le concept du dortoir n'est pas aussi courant qu'aux États-Unis, la plupart des étudiants ici vivent dans le centre de la ville dans « shared com
Rideau de douche « Wet tortue »

Rideau de douche « Wet tortue »

de douche plus amusant avec douches monoparois.Si vous avez une douche simple paroi dans une baignoire, comme moi et vous pas capable de garder toute la douche l'eau à l'intérieur de la baignoire, que vous aurez un plancher de salle de bain très humi
Domotique : Rideaux

Domotique : Rideaux

Déteste avoir à ouvrir et fermer vos rideaux manuellement ? Haine pour revenir du travail/école et votre chambre est sombre et lugubre ? Voulez-vous des rideaux qui s'ouvrent et se ferme ? Ensuite vous devez Dr drapé !Dr. drapé est un projet DIY faci
Remplacer votre AC avec buanderie, rideaux de cristal et d’un ventilateur

Remplacer votre AC avec buanderie, rideaux de cristal et d’un ventilateur

même si nous avons eu un été chaud et collant la ville l'année dernière, j'ai seulement utilisé l'AC une fois dans mon bureau face Sud. Cette année je suis se débarrasser de la grande fenêtre laide unité et son remplacement par des fraises des bois.L
Comment construire un bassin d’eau en cours d’exécution pour le développement de plusieurs photos analogiques

Comment construire un bassin d’eau en cours d’exécution pour le développement de plusieurs photos analogiques

la construction d'une salle sombre pour développer vos photos est facile. Acheter les matériaux nécessaires et couvrir vos fenêtres. Après avoir développé les photos, vous devriez les mettre dans une bassine d'eau en cours d'exécution. Vous pouvez ac