wGD5
Usuario (Argentina)
Hola a todos!!! En mi web agregue una foto del proyecto funcionando en un protoboard http://www.otrapc.com.ar/?p=48 Este es mi primer post y voy a publicar algo que a varios de ustedes les va a servir. Cuando hice este trabajo no encontre mucha info al respecto, asique voy a dejar todo, esquema electrico y el código fuente del pic. Es un sensor de temperatura simple hecho con un LM35 y un PIC16F873A que expresará la temperatura medida en un display lcd de 16x2 (16 caracteres, 2 lineas) Usa una tensión de referencia (Vref) interna que es de 5 Volts. y el conversor es de 10 bits. El cristal que uso en este caso es de 10 MHz. Dejo primero el circuito eléctrico. Esta img me la pasó un profesor, muestra como conectar la alimentación del display. Yo en mi caso en vez de poner una resistencia de 4,7K puse un potenciometro de 5K para poder regular el contraste de los caracteres del display. Foto del LM35: Diagrama de pines del 16f873a Programación del PIC: (Utilizar PIC C Compiler - CCS) #include <TermLM35-LCD.h> #define LCD_ENABLE_PIN PIN_B2 #define LCD_RS_PIN PIN_B0 #define LCD_RW_PIN PIN_B1 #include <lcd.c> #byte portc = 07 void main() { lcd_init(); // Iniciar el display set_tris_b(0x00); // Tris B seteado en 0 (Todo el puerto B como salida) set_tris_c(0x00); // Tris C seteado en 0 (Todo el puerto C como salida) portc = 0b00000000; // Todas las salidas del puerto B con valor lógico bajo // Variables para uso posterior en programa int i; long value; float temper; setup_adc_ports(ALL_ANALOG); setup_adc(ADC_CLOCK_INTERNAL); setup_spi(SPI_SS_DISABLED); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_ccp1(CCP_OFF); setup_comparator(NC_NC_NC_NC); // Las siguientes lineas muestran un mensaje de inicio lcd_putc("Iniciando"); // Función para escribir en el disp. delay_ms(250); // Retardo de 250 milisegundos. lcd_putc("f"); // Borrar todos los caracteres lcd_putc("Iniciando."); delay_ms(250); lcd_putc("f"); lcd_putc("Iniciando.."); delay_ms(250); lcd_putc("f"); lcd_putc("Iniciando..."); delay_ms(250); lcd_putc("f"); lcd_putc("Termometron"); lcd_putc("Digital"); delay_ms(1500); lcd_putc("f"); // Este mensaje ya queda fijo lcd_putc("Temp. actual:"); lcd_gotoxy(9,2); // Ir al caracter 9 de la segunda linea. lcd_putc("oC"); lcd_gotoxy(1,2); do{ for(i=3;i==6;i++) { lcd_gotoxy(i,2); lcd_putc(" "); } lcd_gotoxy(3,2); set_adc_channel(0); // Seleccionar el Pin de lectura (RA0) delay_us(50); // Retardo de 50 microsegundos value=read_adc(); // Guardar el resultado de la lectura analógica en "value" temper=(0.488758*(float)value); // Pasar el valor en binario a ºC printf(lcd_putc,"%02.1f", temper); // Mostrar la temperatura en pantalla delay_ms(500); }WHILE(TRUE); // Bucle infinito } Aca les dejo un poco de informacion del LM35 de la página uControl: dijo:Sus características más relevantes son: Precisión de ~1,5ºC (peor caso), 0.5ºC garantizados a 25ºC. No linealidad de ~0,5ºC (peor caso). Baja corriente de alimentación (60uA). Amplio rango de funcionamiento (desde -55º a + 150ºC). Bajo costo. Baja impedancia de salida. Su tensión de salida es proporcional ala temperatura, en la escala Celsius. No necesita calibración externa y es de bajo costo. Funciona en el rango de alimentación comprendido entre 4 y 30 voltios. Como ventaja adicional, el LM35 no requiere de circuitos adicionales para su calibración externa cuando se desea obtener una precisión del orden de ±0.25 ºC a temperatura ambiente, y ±0.75 ºC en un rango de temperatura desde 55 a 150 ºC. La baja impedancia de salida, su salida lineal y su precisa calibración inherente hace posible una fácil instalación en un circuito de control. Debido a su baja corriente de alimentación (60uA), se produce un efecto de autocalentamiento reducido, menos de 0.1 ºC en situación de aire estacionario. El LM35 tiene un rango de 10mV/°C o sea que para 1°C voy a tener 10mV, para 2°C 20mV y así hasta 1V (100°C). Por lo tanto nuestro valor máximo que va a leer nuestro pic va a ser 1V, lo cual usando un Vref interno de 5V "nos estarian sobrando" 4V por asi decirlo y hace menos precisa la lectura (+/- 0.3 °C) pero podriamos reducir este error usando una tension de referencia externa de 2.5V en el pin 5 del pic, pero para ello habria que indicar en el programa que se usara un Vref externo. Es una aplicación sencilla de pocos materiales y tambien pueden modificarla para tener un reloj que cada tanto muestre la temperatura u otras cosas. Cualquier duda dejen un comentario o manden un MP, no tengo problema en ayudarlos. Saludos! (Cuando encuentre la foto de la plaqueta andando la subo)
Hola a todos!!! Para mi segundo post voy a compartir con ustedes un trabajito simple que me toco hacer hace unos años en electrónica digital. Se trata de un teclado numérico simple que utiliza un codificador 74147, compuerta NAND 4011 y un decodificador 7448. Todos dirán que es mucho mas facil hacerlo con un pic, hasta con un 16F84 se podria hacer, pero este trabajo fue cuando estabamos aprendiendo los primeros conceptos de electrónica digital. Les dejo el trabajo. Descripción del proyecto. El proyecto que llevamos a cabo fue, como el título dice, un teclado que es capaz de mostrar un número de 00 a 99 según le indiquemos en el teclado. Son dos circuitos similares (2 plaquetas) donde usamos un codificador 74147 (Decimal a BCD), un 4011 (Compuertas NAND) y un decodificador 7448 (BCD a 7 Segmentos, excitador para display). El 74147 trabaja con niveles bajos en sus 9 entradas y entrega en su salida compuesta por 4 pines (negados) un código BCD. Éste es un integrado que trabaja con prioridad alta lo cual vamos a poder observar en la tabla 1. El 4011 es un circuito integrado por 4 compuertas NAND. La función que cumple en este proyecto es negar cada pin de salida del 74147 para poder trabajar de forma correcta con el 7448. El 7448 es un decodificador de código BCD a 7 segmentos (Ver tabla 2) y es capaz de excitar un display como dije antes, lo cual nos permite evitar el uso de transistores en el proyecto. A la salida de este integrado debemos poner resistencias para limitar la tensión y corriente evitándonos así quemar el display que como ya sabemos está compuesto por diodos LED. El circuito trabaja con 9V de alimentación (Vcc) y 5V para las entradas del 74147. Diseño en PCB Wizard de la plaqueta La plaqueta de arriba corresponde a las decenas y la de abajo a las unidades. Diseño en PCB Wizard de la plaqueta (Para imprimir) Circuito eléctrico en Proteus Componentes: 2 Plaquetas pertinax de 15cm x 6cm 18 Borneras dobles Resistencias 2 displays de 7 segmentos Cátodo Comúm 2 IC 74147 (IC1 & IC 3) 2 IC 7448 (IC2 & IC4) 2 IC CD4011 (IC5 & IC6) Tabla de verdades Diagrama en bloques Explicación del funcionamiento El circuito lo que hace es con un 74147 generar un BCD “invertido” que corresponde a la configuración de entradas. Las salidas de este integrado están conectadas con el 4011 que son 4 compuertas nand que se encargan de negar o sea “invertir” el BCD permitiéndole así al 7448 poder decodificar ya que no trabaja con valores lógicos LOW, el 7448 transforma éste BCD en 7 segmentos para ser mostrados en el display. El sistema se encuentra compuesto por 2 circuitos eléctricamente conectados de igual manera. El trabajo cuenta con dos teclados (uno que corresponde a las decenas y el otro a las unidades), al poseer prioridad, si tocamos por ejemplo el número 7 y al mismo tiempo número 3 vamos a ver en el display el número 7 y no el 3. De esta forma obtenemos un visor de 100 valores (00 - 99). Espero que les sirva, sobre todo a los que se estan iniciando en el hermoso mundo de la electrónica! Un saludo para todos!
Hola gente! Me preguntaron varias veces como hacer “juntar” las peliculas con los subtitulos, entonces este post va a ser un mini tutorial de como hacerlo. (Lo traigo desde mi blog OTRAPC ) Hay varias formas, pero voy a explicar como lo hago yo. Para empezar, van a necesitar el VLC Media Player, que lo pueden descargar gratis desde SourceForge. Instalan el soft y luego lo ejecutan y abren una pelicula (Media -> Open File) Cuando inicie la película, van a Video -> Subtitle Track -> Open File Seleccionan el archivo de subtitulos correspondiente: Una vez seleccionado, la película ya está con subtitulos! Espero que les sirva. Saludos! Otros aportes mios: Descarga subtitulos desde Cuevana fácilmente. Generador de claves md5 aleatorias - VB.NET Electrónica Digital: Teclado Numérico Simple 21 Sensor de temperatura con LM35 y PIC16F873A

Hola gente, hoy vengo a compartir algo interesante, seguramente a muchos les va a servir. Lo traigo de mi blog OTRAPC Seguramente muchas veces se preguntaron, al igual que yo, como hacer para obtener nuestra foto de perfil, portada, nombre, o algo de nuestro facebook (o quizás el de algun amigo). Hay varias formas de hacerlo, yo les voy a mostrar una forma fácil de hacerlo, mediante mi querida amiga Graph API de facebook. En la documentación de desarrolladores de facebook podrán ver mas en detalle todo lo que se puede hacer. Para obtener la información básica de un usuario mediante esta API solo tenemos que ir al navegador y poner https://graph.facebook.com/, por ejemplo: https://graph.facebook.com/4 (Mark Zuckerberg) El navegador nos va a devolver esto: { "id": "4", "name": "Mark Zuckerberg", "first_name": "Mark", "last_name": "Zuckerberg", "link": "https://www.facebook.com/zuck", "username": "zuck", "gender": "male", "locale": "en_US" } Bien, así funciona... Pero de que nos sirve? Si yo quiero usar eso en mi querido amigo "VB"! Entonces... Manos a la obra (? Primero que nada abrimos un proyecto nuevo en vb.net, y le ponemos el nombre que queremos. Yo me diseñé un form de la siguiente forma, ustedes pueden hacerlo como más les guste Ahora vamos con el código! Hace un tiempo publiqué como usar la clase WebClient (System.Net.WebClient) y como hacer un GET con ella, hoy nos va a hacer falta! Antes de empezar, va a ser necesario que descarguen la siguiente librería JSON .NET, mas abajo explicaré para que nos va a servir. Tendremos que agregar la referencia de la dll que descargamos del link de arriba, una vez hecho eso, empezamos con nuestro código! Primero que nada, vamos a escribir los siguientes Imports que nos haran falta (para ordenarnos un poco y no escribir tanto) Imports Newtonsoft.Json Imports System.Net Imports System.Text En el evento Click del boton que pusimos para realizar la búsqueda vamos a realizar todo. Primero declaramos nuestras variables: Dim web As New WebClient, obj As Object Dim link As String = "https://graph.facebook.com/" & txtID.Text txtID es el Textbox donde pondremos la ID del usuario que queremos buscar. Abrimos un Try (No se por qué la carita de emoción jajaja) Try obj = JsonConvert.DeserializeObject(Encoding.UTF8.GetString(web.DownloadData(link))) Catch ex As Exception MsgBox("Error: " & ex.Message) End Try Bien, veamos que es lo que esta pasando ahí! (Si, no es mucho pero vale la pena explicar un poco). Para hacerlo mas facil vamos de adentro para afuera en los parentesis: web.DownloadData(link) Esto ya lo explique en otra publicación, nos devuelve un array de bytes con la respuesta del servidor. Encoding.UTF8.GetString(web.DownloadData(link)) Convertimos de Byte() (La respuesta explicada anteriormente) a String, si lo vemos hasta aca vamos a tener lo mismo que nos devuelve el navegador como explique mas arriba. JsonConvert.DeserializeObject(Encoding.UTF8.GetString(web.DownloadData(link))) Acá llegamos a lo interesante! Estamos usando la librería que descargamos anteriormente. Para qué nos sirve? Como vimos, la respuesta está en formato JSON y se nos haría un poco complicado tratar con estos datos en crudo en vb.net entonces esta librería nos permite adaptar este tipo de datos a uno mas fácil de manejar en .NET, lo que nos devuelve la función DeserializeObject es un objeto que podremos manejar a gusto y placer. Podríamos haber hecho una clase para manejar estos datos, pero no es el fin del post explicar eso, asique nos limitamos a usar un objeto, que en este caso lo declaramos como "obj". Cómo hacemos para mostrar estos datos? De la siguiente forma: lblID.Text = obj("id").value lblName.Text = obj("name").value lblUsername.Text = obj("username").value lblIdioma.Text = obj("locale").value Select Case obj("gender").value Case "male" : lblSexo.Text = "Hombre" Case "female" : lblSexo.Text = "Mujer" End Select Como podemos ver id, name, username, gender, locale son todos los nombres dentro del objeto json que responde el servidor, y la propiedad .value nos devuelve el valor que contiene el mismo. Entonces "name": "Mark Zuckerberg", en nuestro código va a ser obj("name", "Mark Zuckerber" lo vamos a obtener con obj("name".value Haciendo esto, vamos a llevar todo lo que nos respondío el servidor a labels, textbox, o en donde lo necesitemos en .NET El ejemplo de como nos quedo en el form: Aca el código completo: Imports Newtonsoft.Json Imports System.Net Imports System.Text Public Class frmMain Private Sub btnActualizarDatos_Click(sender As Object, e As EventArgs) Handles btnActualizarDatos.Click Dim web As New WebClient, obj As Object Dim link As String = "https://graph.facebook.com/" & txtID.Text Try obj = JsonConvert.DeserializeObject(Encoding.UTF8.GetString(web.DownloadData(link))) lblID.Text = obj("id").value lblName.Text = obj("name").value lblUsername.Text = obj("username").value Select Case obj("gender").value Case "male" : lblSexo.Text = "Hombre" Case "female" : lblSexo.Text = "Mujer" End Select lblIdioma.Text = obj("locale").value Catch ex As Exception MsgBox("Error: " & ex.Message) End Try End Sub End Class Saludos a todo, espero que les sirva, cualquier duda me preguntan. Suerte!
Hola gente! Hace mucho que no posteo nada! Hoy vengo a dejar algo bien sencillito, hecho en Visual Basic .NET Esto lo traigo de mi blog: http://www.otrapc.com/ Se trata de una clase que nos va a servir para generar claves aleatorias en MD5. Por un lado, se obtiene una cadena de caracteres random de longitud aleatoria, como por ejemplo: Si somos un poco paranoicos con el tema de las claves, esto nos puede servir muchisimo (Sobre todo si nos gusta cambiarlas una vez a la semana) siempre y cuando guardemos la clave por algun lado jaja Vamos a lo importante! El código Public Class clsKey Public Function getRandomKey() As String Dim strRand As String = Nothing, r As New Random, n As Integer n = Math.Round(r.Next(1, 10)) For i = 0 To n strRand &= Chr(Math.Round(r.Next(33, 122))) Next Return strRand End Function Public Function MD5_EP(ByVal StrPass As String) As String Dim md5 As New MD5CryptoServiceProvider Dim byteHash() As Byte, ret As String = Nothing byteHash = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(StrPass)) md5.Clear() For Each bs As Byte In byteHash ret &= bs.ToString("x2";) Next Return ret End Function Public Function getMD5Pass() As String Return MD5_EP(getRandomKey()) End Function End Class Para usarlo pueden crear una clase nueva en su proyecto y pegan el código. Luego llaman las funciones. Si se fijan, son 3 funciones. getRandomKey() nos devuelve una clave aleatoria (Mostrada en la tabla mas arriba). MD5_EP(clave) nos devuelve la cadena "clave" en md5. Y getMD5Pass() nos devuelve una cadena random en md5. Saludos