Pequeño proyecto de Semáforo empleando I2C en Proteus-PICC
Se tiene como ejercicio planteado implementar un circuito, en el que se aplique la comunicación I2C, mediante algún dispositivo que cumpla el papel de esclavo y que sirva para realizar la comunicación I2C, como maestro se tiene al pic 18F4550 y como esclavo a un sensor de luz I2C.
Se procede a simular el circuito en Proteus antes de implementarlo físicamente, el circuito a implementar se refiere a unos semáforos que se accionan de acuerdo a un sensor de luz de comunicación serial I2C, el circuito se mostrará a continuación:
Fig1. Simulación del circuito I2C en Proteus |
Se ve 6 focos conectados al pic 18F4550, tres están conectados a los pines A0, A1 y A2, y los otros tres están conectaos a los pines C5, C6 y C7,se tiene un elemento para comunicación serial I2C que vendría a representar al sensor de luz que se implementará más adelante en el circuito físico. Se tiene también una pantalla GLCD, para verificar el encendido y apagado del semáforo.
Posteriormente se procede a crear el código para este problema planteado, en el programa PICC, para generar el código hexadecimal que será cargado al microcontrolador, este código se detallará más adelante. Luego que se carga el código en el pic18F4550, se procede a correr la simulación, vemos que el GLCD se enciende, se ve también una pequeña ventana en la esquina superior izquierda, la misma que indica la transferencia de información, por medio de la comunicación I2C.
Fig2. Mostrando el inicio de la comunicación I2C, y funcionamiento GLCD. |
Después de pulsar el botón BOT1, hasta que se cumpla condición 1000L que aparece en a pantalla GLCD, los semáforos empiezan a funcionar, el motivo por el que se colocó BOT1, fue para imitar el funcionamiento del sensor de luz I2C, ya que el elemento I2Cque aparece en la simulación, no se comporta igual que un sensor de luz, es decir no es accionado por luz, y por eso fue necesario usar el botón BOT1. El semáforo de la izquierda empieza en rojo, y el semáforo de la derecha empieza en verde.
Fig3. Primera secuencia de los semáforos |
Luego se ve en el semáforo del a derecha que este cambia a color amarillo después de un instante de tiempo, mientras que el semáforo de la izquierda permanece en rojo.
Fig4. Segunda secuencia de los semáforos |
Después de un pequeño instante de tiempo el semáforo de la izquierda cambia a verde, y el de la derecha cambia a rojo y se repite el ciclo de nuevo entre los dos semáforos.
Fig5. Última secuencia de los semáforos |
El código del programa creado en PICC, para resolver el ejercicio planteado se muestra a continuación:
#include <18F4550.h>
#device adc=8
#FUSES NOWDT,WDT128, XT,NOPROTECT,NOBROWNOUT //No Watch Dog Timer
#FUSES BORV20 //Brownout reset at 2.0V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES PBADEN //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES MCLR //Master Clear pin enabled
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL12 //Divide By 12(48MHz oscillator input)
#FUSES CPUDIV4 //System Clock by 4
#FUSES USBDIV //USB clock source comes from PLL divide by 2
#FUSES VREGEN //USB voltage regulator enabled
#FUSES ICPRT
#use delay(clock=4M)
#use i2c(Master,Fast,sda=PIN_B0,scl=PIN_B1)
#include <GLCD1.C>
#include <BH1750.c>
#use i2c(Master,Fast,sda=PIN_B0,scl=PIN_B1)
int16 set_point=50, luminosidad=0;
char texto1[]="sensor luz i2c ", texto2[]="prender semaforo", texto_sp[8], texto_tp[8];
void main()
{
port_b_pullups(TRUE);
setup_adc_ports(AN0_TO_AN1|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_psp(PSP_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_ccp1(CCP_PWM_FULL_BRIDGE|CCP_SHUTDOWN_AC_L|CCP_SHUTDOWN_BD_L);
output_low(PIN_C1);
GLCD_init(1); //Inicializo el GLCD, encendido.
GLCD_fillScreen(0); //Limpio la pantalla
GLCD_rect(5,5,123,59,0,1);
glcd_text57(7,10,texto1,1,1);
glcd_text57(20,20,texto2,1,1);
sprintf(texto_sp,"%lu L",set_point);
glcd_text57(55,32,texto_sp,1,1);
while(1)
{
//Lectura del sensor
luminosidad = (get_lux_value(cont_H_res_mode1,100));
if (luminosidad > 1000) luminosidad = 1000;
while (luminosidad<=set_point) // si es menor q el setpoint envia encender las luces
{
output_a(0b00000001);
output_c(0b00100000);delay_ms(9000);
if (input(PIN_E0)==1){break;}
output_a(0b00000001);
output_c(0b01000000);delay_ms(3000);
if (input(PIN_E0)==1){break;}
output_a(0b00000100);
output_c(0b10000000); delay_ms(9000);
if (input(PIN_E0)==1){break;}
output_a(0b00000010);
output_c(0b10000000); delay_ms(3000);
if (input(PIN_E0)==1){break;}
}
if (input(PIN_E0)==1)
{
output_low(PIN_C1);
output_low(PIN_C2);
output_low(PIN_C4);
glcd_text57(55,32,texto_sp,1,0);
set_point=set_point+50;
if (set_point>1000) set_point=0;
sprintf(texto_sp,"%lu L",set_point);
glcd_text57(55,32,texto_sp,1,1);
}
//GLCD_rect(80,45,115,55,1,0); //borro dato anterior de la glcd
output_low(PIN_C0);
output_low(PIN_C2);
output_low(PIN_C4);
glcd_text57(20,45,texto_tp,1,0);
sprintf(texto_tp,"%lu L",luminosidad); //Paso de entero a string
glcd_text57(20,45,texto_tp,1,1);
delay_ms(50);
}
}
Mira también, da clic sobre los siguientes enlaces:
No hay comentarios.:
Publicar un comentario