Cortina de agua (5 / 6 paso)

Paso 5: código

SOFTWARE:

Para el PIC18F2445 actuar como un circuito integrado, hemos creado un proyecto de MPLab con un script en python llamado para controlar las funciones de la válvula.

Original propuesta de función:
Nuestra intención original de este proyecto era leer imágenes y traducirlos a sus homólogos de agua. Hemos intentado encontrar imágenes con la pixelación baja por lo que se podrían recrear. Para subir y establecer la imagen como una cuadrícula de 8 X 8 (puesto que nuestro aparato tenía ocho válvulas) utilizamos python imaging library (PIL) para subir nuestra imagen jpeg de tablero de ajedrez.

Código de ejemplo:

importar imagen
tiempo de importación

DEF loadPic (filename ='checkerboard.jpeg ', umbral = 3, tamaño = (50,50)):
im =Image.open('checkerboard.jpeg').show()
x_length, y_length = im.size
imprimir [x_length y_length]
x2_length = 2# dio un valor arbitrario, por lo que esto funciona
y2_length = 2
x1_length = x1_length-x2_length
y1_length = y_length-y2_length

clase TestTable():
DEF __init__:
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):
retorno 10

DEF GetNumberCols(self):
retorno 10

DEF IsEmptyCell (self, fila, col):
devolverá False

GetValue (self, fila, col) Def:
return 0

DEF SetValue (self, fila, columna, valor):
pasar

DEF GetColLabelValue (self, col):
volver self.colLabels[col]

DEF GetRowLabelValue (self, fila):
volver self.rowLabels[row]

Hemos sido capaces de dividir la imagen en una cuadrícula de tal al asignar las filas y caracteres de la columna por lo que podría hacer referencia. Esto determina que si una spot(row,column) estaba vacía (blanca) nos asigna una asignación de get.color para designar el número 1 por 0 para el blanco y negro. Cada punto tendría que pasar a través de un if otra declaración para hacer tales tareas.

Una declaración de ejemplo para el punto A1. Observe que después de la asignación del comando también está asignado. En este caso controla el pin RB0.

Código de ejemplo:

Si A1==(1,0):
cell_value = 1
Imprimir "blanco"
SET_RBO = 1
set_rb0_callback()

Elif A1==(0,1):
cell_value = 1
Imprimir "blanco"
SET_RBO = 1
set_rb0_callback()

Elif A1==(1,1):
cell_value = 1
Imprimir "blanco"
SET_RB0 = 1
set_rb0_callback()

Elif A1==(0,0):
cell_value = 0
Imprimir "negro"
clr_rb0_callback()

Estos comandos repiten para este punto y para los restantes pines RB0-RB7.

Después de recoger la información de la imagen tenemos que enviar a través del usb a nuestro código de MPLab. Hicimos esto inicializando el usb y cada comando.

Código de ejemplo:

de import Tkinter *
ctypes de importación

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()

buffer = ctypes.c_buffer(8)

raíz = Tk()
root.title ('cortina de agua')
FM = Frame(root)

DEF update_status():
USB.control_transfer (dev, 0xC0, SET_RA8, 0, 0, 1, buffer)
status.Configure (texto = ord(buffer[0])) % rb7 actualmente es % d.
root.After (50, update_status)

DEF set_rb0_callback():
USB.control_transfer (dev, 0 x 40, SET_RB0, 0, 0, 0, buffer)

DEF clr_rb0_callback():
USB.control_transfer (dev, 0 x 40, CLR_RB0, 0, 0, 0, buffer)

DEF set_rb1_callback():
USB.control_transfer (dev, 0 x 40, SET_RB1, 0, 0, 0, buffer)

DEF clr_rb1_callback():
USB.control_transfer (dev, 0 x 40, CLR_RB1, 0, 0, 0, buffer)

DEF set_rb2_callback():
USB.control_transfer (dev, 0 x 40, SET_RB2, 0, 0, 0, buffer)

DEF clr_rb2_callback():
USB.control_transfer (dev, 0 x 40, CLR_RB2, 0, 0, 0, buffer)

DEF set_rb3_callback():
USB.control_transfer (dev, 0 x 40, SET_RB3, 0, 0, 0, buffer)

DEF clr_rb3_callback():
USB.control_transfer (dev, 0 x 40, CLR_RB3, 0, 0, 0, buffer)

DEF set_rb4_callback():
USB.control_transfer (dev, 0 x 40, SET_RB4, 0, 0, 0, buffer)

DEF clr_rb4_callback():
USB.control_transfer (dev, 0 x 40, CLR_RB4, 0, 0, 0, buffer)

DEF set_rb5_callback():
USB.control_transfer (dev, 0 x 40, SET_RB5, 0, 0, 0, buffer)

DEF clr_rb5_callback():
USB.control_transfer (dev, 0 x 40, CLR_RB5, 0, 0, 0, buffer)

DEF set_rb6_callback():
USB.control_transfer (dev, 0 x 40, SET_RB6, 0, 0, 0, buffer)

DEF clr_rb6_callback():
USB.control_transfer (dev, 0 x 40, CLR_RB6, 0, 0, 0, buffer)

DEF set_rb7_callback():
USB.control_transfer (dev, 0 x 40, SET_RB7, 0, 0, 0, buffer)

DEF clr_rb7_callback():
USB.control_transfer (dev, 0 x 40, CLR_RB7, 0, 0, 0, buffer)

DEF set_duty_callback(value):
USB.control_transfer (dev, 0 x 40, SET_DUTY, int(value), 0, 0, buffer)

Ahora el problema que nos enfrentamos a partir de este momento en fue que no pudimos llamar a una compleja colección de pins con una solicitud de contador de tiempo que no era cíclico. Hemos sido capaces de crear nuestras propias imágenes simples que utilizan básicas retrasos repetidos que las válvulas de encendido y apagado, pero ninguno que pudiera tener en las entradas de la red. Por lo tanto, que no ha podido compilar imágenes complejas. Por lo tanto, nos cambió el rumbo para crear imágenes simples que podrían traducirse en función de la válvula.

Nuevo objetivo de Software

La nueva misión de nuestro software fue tomar imágenes simples que podrían ser controlados con un ciclo de retraso.

Importar las bibliotecas de python apropiados y asignar valor a leerse en MPLab.

Código de ejemplo:

de import Tkinter *
ctypes de importación

##TEXTBOX_VAL = 17
##CLR_LED = 18
SET_DUTY = 17
DOT = 18
LINEA = 19
TABLERO DE AJEDREZ = 20
HALF_HALF = 21

Inicializa el USB.

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

buffer = ctypes.c_buffer(8)

Definir imágenes quería que se ejecutarán en el ciclo de reloj.

DEF dot_callback():
USB.control_transfer (dev, 0 x 40, punto, 0, 0, 0, buffer)

DEF line_callback():
USB.control_transfer (dev, 0 x 40, línea, 0, 0, 0, buffer)

DEF checkerboard_callback():
USB.control_transfer (dev, 0 x 40, damero, 0, 0, 0, buffer)

DEF halfhalf_callback():
USB.control_transfer (dev, 0 x 40, HALF_HALF, 0, 0, 0, buffer)

DEF set_duty_callback(value):
USB.control_transfer (dev, 0 x 40, SET_DUTY, int(value), 0, 0, buffer)

DEF update_status():
root.After (50, update_status)

Hacer un botón de cuadro de texto así que podemos controlar qué imágenes muestran en qué tiempo (aka el botón!)

Código de ejemplo:

raíz = 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 (lado = izquierda)
## Button(fm, text = 'CLR', command = CLR_display).pack (lado = a la derecha)
Button(FM, Text = 'DOT', Command = dot_callback).Pack (lado = a la derecha)
Button(FM, Text = 'LINE', Command = line_callback).Pack (lado = a la derecha)
Button(FM, Text = 'CHECKERBOARD', Command = checkerboard_callback).Pack (lado = a la derecha)
Button(FM, Text = 'HALF and HALF', Command = halfhalf_callback).Pack (lado = a la derecha)
FM.Pack(Side = Top)
dutyslider = escala (raíz, from_ = 0, a = 255, Oriente = HORIZONTAL, showvalue = FALSE, comando = set_duty_callback)
dutyslider.set(128)
dutyslider.Pack(Side = Top)

Escriba en un error si el dispositivo USB no se encuentra.

Código de ejemplo:

dev = usb.open_device (0x6666, 0x0003, 0)
Si dev < 0:
no imprimir "emparejar dispositivo found...\n"
otra cosa:
RET = usb.control_transfer (dev, 0 x 00, 0 x 09, 1, 0, 0, buffer)
Si ret < 0:
Imprimir "No se puede enviar la solicitud estándar de SET_CONFIGURATION. \n"
root.After (50, update_status)
root.mainloop()
USB.close_device(dev)

Ahora en el código de MPLab. Utilizamos un programa de solicitud proveedor USB estándar, sin embargo tenemos que definir todos los comandos al principio.

#define SET_RB0 0 x 01 / / solicitud de específicos del proveedor para configurar (es decir, hacer alto) RA0
#define CLEAR_RB0 0 x 02 / / solicitud de específicos del proveedor para configurar (es decir, hacer; baja) RA0
#define SET_RB1 0 x 03 / / solicitud de específicos del proveedor para configurar (es decir, hacer alto) RA1
#define CLEAR_RB1 0 x 04 / / solicitud de específicos del proveedor para configurar (es decir, hacer baja) RA1
#define SET_RB2 0 x 05 / / solicitud de específicos del proveedor para configurar (es decir, hacer alto) RA2
#define CLEAR_RB2 0 x 06 / / solicitud de específicos del proveedor para configurar (es decir, hacer baja) RA2
#define SET_RB3 0x07 / / solicitud de específicos del proveedor para configurar (es decir, hacer alto) RA3
#define CLEAR_RB3 0x08 / / solicitud de específicos del proveedor para configurar (es decir, hacer baja) RA3
#define SET_RB4 0 x 09 / / solicitud de específicos del proveedor para configurar (es decir, hacer alto) RB4
#define CLEAR_RB4 0x0A / / solicitud de específicos del proveedor para configurar (es decir, hacer baja) RB4
#define SET_RB5 0x0B / / solicitud de específicos del proveedor para configurar (es decir, hacer alto) RB5
#define CLEAR_RB5 0x0C / / solicitud de específicos del proveedor para configurar (es decir, hacer baja) RB5
#define SET_RB6 0x0D / / solicitud de específicos del proveedor para configurar (es decir, hacer alto) RB6
#define CLEAR_RB6 0x0E / / solicitud de específicos del proveedor para configurar (es decir, hacer baja) RB6
#define SET_RB7 0x0F / / solicitud de específicos del proveedor para configurar (es decir, hacer alto) RB7
#define CLEAR_RB7 0 x 10 / / solicitud de específicos del proveedor para configurar (es decir, hacer l0w) RB7
#define TEXTBOX_VAL 0x11 / / petición de específicos del proveedor para al 7 segmentos LED
#define CLR_LED 0x12 / / solicitud de específicos del proveedor para borrar 7 segmento LED
#define SET_DUTY 0x11
#define punto 0x12
#define línea 0 x 13
#define tablero 0x14
#define HALF_HALF 0x15

Luego podemos seguir escribiendo nuestras peticiones de proveedor para el USB. La siguiente es una petición para RB0 con el comienzo de la función entero.

void VendorRequests(void) {}
interruptor (USB_buffer_data[bRequest]) {}
caso SET_RB0:
PORTBbits.RB0 = 1; configurar RA0 alta
BD0I.byteCount = 0 x 00; Conde de EP0 en bytes el valor 0
BD0I.status = 0xC8; envíe paquetes como DATA1, conjunto UOWN bit
rotura;

Hicimos esto para cada pin RB0-RB7 que nos permita ser capaces de probar y facilitar los medios de depuración.

En la creación de imágenes como el damero empezamos de la misma manera como una solicitud de pin específico, pero nos asignaron el encendido y apagado de las válvulas con 0 y 1 (cada número va a uno de los ocho pines). Esto permitirá el uso múltiple de las operaciones simultáneas de pin.

Código de ejemplo:

caso SET_DUTY:

DEBER = USB_buffer_data [wValue];
BD0I.byteCount = 0 x 00; Conde de EP0 en bytes el valor 0
BD0I.status = 0xC8; envíe paquetes como DATA1, conjunto UOWN bit

caja tablero de ajedrez:

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

mientras que {} (1)

Temp = TMR0L; enganchar el byte de orden alto del contador Timer0 en TMR0H leyendo TMR0L

Con estas modificaciones de la escritura que hemos podido detalle un programa que puede traducir a imágenes de la red al agua muestra.

* vea abajo para el código real.

Artículos Relacionados

Aspersor de agua simple.

Aspersor de agua simple.

Regar su jardín debe hacerse preferentemente con agua de lluvia. Sin embargo, a veces usando agua del grifo es inevitable. En tal caso uno debe, como con todos los recursos naturales, ser eficiente y sensible.¿Alguna vez has notado cómo un agujero pe
DIY Aquaponic Vertical ventana agricultura

DIY Aquaponic Vertical ventana agricultura

Esto es para la entrada de Instructables concurso:Hizo una combinación de proyecto-Sistema hidropónico;-Sistema aqua-cultura;-Elevación de aire de tecnología;Ventajas-Reciclaje + reutilización + reducción de desechos (botellas de refresco) en camas d
BRICOLAJE Vertical Aquaponic sistema con bomba de aire comprimido agrícola

BRICOLAJE Vertical Aquaponic sistema con bomba de aire comprimido agrícola

Hizo una combinación de proyecto-Sistema hidropónico;-Sistema aqua-cultura;-Elevación de aire de tecnología;Ventajas-Reciclaje + reutilización + reducción de desechos (botellas de refresco) en camas de crecimiento útil,-Arreglo de cultivo vertical ah
Cómo arreglar su swamp cooler ("Overclock" él 50%)

Cómo arreglar su swamp cooler ("Overclock" él 50%)

pantano funciona ok hasta llegar a 94 grados. En ese momento, dejan de enfriamiento, porque la bomba no puede obtener suficiente agua de las almohadillas para mantenerlos húmedos. Así que aumentando la cantidad de agua va a las almohadillas en un 50%
De crecimiento-jarra-olla de

De crecimiento-jarra-olla de

¿Cuál es mejor que sí mismo crecido cultivos orgánicos que pueden llevar a la mesa?Para poder obtener cultivo orgánico, 100% seguro sin pesticidas o cualquier otro agente químico añadido, la mejor manera es crecer nuestros cultivos caseros. Esto es m
Espolvorear-Master 5000

Espolvorear-Master 5000

Estaba inspirado por lo menos un otro aspersor PVC instructable para crear mi propio, versión más grande.  Lo que ves aquí es el producto final en todo su esplendor.  Mi esposa le gusta referirse a él como el "espolvorear-Master 5000". No sé por
Exhibición de LED sale como esta

Exhibición de LED sale como esta

1. Exhibición de LED está hecha de pequeñas luces LED.  Las pequeñas luces led tienen tres colores, es decir. verde, rojo, azul. Este tres colores pueden ser integrado a todos los colores.Generalmente, el LED se puede hacer dos tipos: DIP y SMD.El pr
Calentador de agua solar para mochila usando las botellas de agua y una cortina de coche

Calentador de agua solar para mochila usando las botellas de agua y una cortina de coche

después de probar varios métodos, este es el mejor método que encontré para calentar una pequeña cantidad de agua para la rehidratación de alimentos liofilizados mochila usando sólo el sol como fuente de energía. Mis objetivos eran hacer un simple pe
PHloat2 DIY agua ácida prueba escultura y kit con arduino

PHloat2 DIY agua ácida prueba escultura y kit con arduino

pHloatpHloat es un kit de bricolaje para uso junto con un microcontrolador arduino seminuevo / preexistente. Su propósito es poner a prueba los niveles de pH en ríos, lagos y arroyos debido a la afluencia de aire y agua contaminación causada a menudo
Molde-gratis hack de cortina de ducha (de verdad)

Molde-gratis hack de cortina de ducha (de verdad)

A pesar de las cortinas de ducha se anuncian a menudo como "libre de moho", es sólo cuestión de tiempo antes de que el goop desagradable hace un nuevo hogar. Este instructable le llevará a través del proceso de prolongar la vida de una cortina d
Piscina de Zeevah Elite perrito agua aves / tazón de fuente de baño

Piscina de Zeevah Elite perrito agua aves / tazón de fuente de baño

si su perro les gusta nadar en tiempo caliente, esta es la perfecta combinación piscina / tazón de fuente de agua para usted! Este es el proyecto de mi padre - hemos completado entre los dos el sábado en una media hora.Sólo mi padre pensaría de esto.
Jarra/lámparas de acuario de agua

Jarra/lámparas de acuario de agua

he encontrado dos jarras de agua de plástico de 5 galones en la basura alguna vez allá.  Ahora que podía haber simplemente les regresé para el depósito en la tienda, pero que no habría sido divertido u original.  En su lugar, tratando de decorar mi c
Proyecto de la lámpara.  Agregar nueva vida con luz nocturna interna y la cortina pintada

Proyecto de la lámpara. Agregar nueva vida con luz nocturna interna y la cortina pintada

hace un tiempo compré una lámpara de mesa florero de cristal en un mercado de pulgas.  Yo no quería pero fue el final del día y la señora quería deshacerse de él, para que ella no tener que embalar para arriba y llevarlo a casa.   Se cotizaba a $20 p
Tienen una cortina de ducha libre de moho en la bañera

Tienen una cortina de ducha libre de moho en la bañera

no sólo es una cortina de ducha libre de moho posible, es fácil!Paso 1: Lo que se necesita1 - un pequeño gancho para sujetar a la pared por encima de la bañera.  Esto puede ser un poco plástico gancho 'pegajoso' si tienes paredes de azulejos lisos, o