Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * USART + PWM + TEMP.c
- *
- * Created: 27.06.2017 20:16:56
- * Author : Anatoly Tsirkunenko
- */
- #define F_CPU 8000000
- #define BAUD 9600L
- #define UBRRL_value ((F_CPU/(BAUD*16))-1)
- #include <avr/io.h>
- #include <stdio.h>
- #include <avr/interrupt.h>
- #include "dht11.h"
- #include <util/delay.h>
- unsigned int num = 0, num1 = 1, num2 = 'n', num3 = 'n', dhtflag = 1000, incdec1, incdec2, incdec3;
- unsigned char rxcount = 0, receive, i, t1, t2, h1, h2, LED = 0,
- lum = 0, luminosity = 0, color, PWM_1, PWM_2, PWM_3, flagPWM1 = 0, flagPWM2 = 0, flagPWM3 = 0,
- analizer[10] = {'0','1','2','3','4','5','6','7','8','9'};
- volatile unsigned char buffer;
- int8_t temperature, humidity;
- void UART_SEND_CHAR(unsigned char value)
- {
- while(!(UCSRA & (1 << UDRE)));
- UDR = value;
- }
- void UART_SEND_STR(char str[])
- {
- i = 0;
- while(str[i] != '\0')
- {
- UART_SEND_CHAR(str[i]);
- ++i;
- }
- }
- void DispHumidity()
- {
- h1 = humidity / 10;
- h2 = humidity % 10;
- UART_SEND_STR("Humidity: ");
- UART_SEND_CHAR(analizer[h1]);
- UART_SEND_CHAR(analizer[h2]);
- UART_SEND_STR("%\n");
- }
- void DispTemperature()
- {
- t1 = temperature / 10;
- t2 = temperature % 10;
- UART_SEND_STR("Temperature: ");
- UART_SEND_CHAR(analizer[t1]);
- UART_SEND_CHAR(analizer[t2]);
- UART_SEND_STR(" C\n");
- }
- void DispHelp()
- {
- UART_SEND_STR("Use:\n/ to start a string, # to end\n1-3 to light diodes\nT and H for temperature and humidity\nYou can combine command i.e.:\n/123#, /TH#");
- }
- void DispError()
- {
- UART_SEND_STR("ERROR!\nType h for help");
- }
- void DispStatus()
- {
- UART_SEND_STR("Current status:\n");
- UART_SEND_STR("Red: ");
- UART_SEND_CHAR(analizer[PWM_1/100]);
- UART_SEND_CHAR(analizer[(PWM_1/10)%10]);
- UART_SEND_CHAR(analizer[PWM_1%10]);
- UART_SEND_STR("\n");
- UART_SEND_STR("Green: ");
- UART_SEND_CHAR(analizer[PWM_2/100]);
- UART_SEND_CHAR(analizer[(PWM_2/10)%10]);
- UART_SEND_CHAR(analizer[PWM_2%10]);
- UART_SEND_STR("\n");
- UART_SEND_STR("Blue: ");
- UART_SEND_CHAR(analizer[PWM_3/100]);
- UART_SEND_CHAR(analizer[(PWM_3/10)%10]);
- UART_SEND_CHAR(analizer[PWM_3%10]);
- UART_SEND_STR("\n");
- }
- void DispLum(unsigned char char1, char char2)
- {
- UART_SEND_STR("Luminance ");
- if(char2) UART_SEND_CHAR('+');
- else UART_SEND_CHAR('-');
- UART_SEND_CHAR(analizer[char1/100]);
- UART_SEND_CHAR(analizer[(char1/10)%10]);
- UART_SEND_CHAR(analizer[char1%10]);
- UART_SEND_STR("%\n");
- }
- void descriptor()
- {
- for(i = 0; i<10; ++i)
- {
- if(analizer[i] == num1) num1 = i;
- if(analizer[i] == num2) num2 = i;
- if(analizer[i] == num3) num3 = i;
- }
- if((num2 != 'n') && (num3 != 'n')) num = num1*100 + num2*10 + num3;
- else if((num2 != 'n') && (num3 == 'n')) num = num1*10 + num2;
- else num = num1;
- num1 = 1; num2 = 'n'; num3 = 'n';
- if(num < 1) num = 1;
- incdec1 = (OCR1A * num)/100;
- incdec2 = (OCR1B * num)/100;
- incdec3 = (OCR2 * num)/100;
- if(num > 255) num = 255;
- }
- void PWM_change(unsigned char char1, unsigned char char2, unsigned char char3, unsigned char char4)
- {
- cli();
- while(!(flagPWM1 && flagPWM2 && flagPWM3))
- {
- if(!flagPWM1)
- {
- if(OCR1A < char1) ++OCR1A;
- else if(OCR1A > char1) --OCR1A;
- else flagPWM1 = 1;
- }
- if(!flagPWM2)
- {
- if(OCR1B < char2) ++OCR1B;
- else if(OCR1B > char2) --OCR1B;
- else flagPWM2 = 1;
- }
- if(!flagPWM3)
- {
- if(OCR2 < char3) ++OCR2;
- else if(OCR2 > char3) --OCR2;
- else flagPWM3 = 1;
- }
- _delay_ms(1);
- if(char4 == 2) _delay_ms(1);
- }
- char1 = 0; char2 = 0; char3 = 0;
- flagPWM1 = 0; flagPWM2 = 0; flagPWM3 = 0;
- sei();
- }
- ISR(USART_RXC_vect)
- {
- buffer = UDR;
- if(!receive)
- {
- switch(buffer)
- {
- case 'R': LED = 1;
- receive = 1;
- rxcount = 1;
- break;
- case 'G': LED = 2;
- receive = 1;
- rxcount = 1;
- break;
- case 'B': LED = 3;
- receive = 1;
- rxcount = 1;
- break;
- case '+': luminosity = 1;
- receive = 1;
- rxcount = 1;
- break;
- case '-': luminosity = 2;
- receive = 1;
- rxcount = 1;
- break;
- case 'h': DispHelp();
- break;
- case 'T': DispTemperature();
- break;
- case 'H': DispHumidity();
- break;
- case 'S': DispStatus();
- DispTemperature();
- DispHumidity();
- break;
- case '0': PWM_change(0,0,0,2);
- DDRB &= (0 << DDB1)|(0 << DDB2)|(0 << DDB3);
- break;
- case '1': DDRB |= (1 << DDB1)|(1 << DDB2)|(1 << DDB3);
- PWM_change(PWM_1,PWM_2,PWM_3,2);
- break;
- default: DispError();
- break;
- }
- }
- else
- {
- if(buffer == '#')
- {
- UART_SEND_CHAR(num1);UART_SEND_CHAR(num2);UART_SEND_CHAR(num3);
- descriptor();
- color = LED;
- lum = luminosity;
- LED = 0;
- rxcount = 0;
- receive = 0;
- }
- else
- {
- if(rxcount == 1) num1 = buffer;
- if(rxcount == 2) num2 = buffer;
- if(rxcount == 3) num3 = buffer;
- ++rxcount;
- }
- }
- }
- void init_port(void)
- {
- DDRB |= (1 << DDB1)|(1 << DDB2)|(1 << DDB3);
- }
- void init_PWM()
- {
- TCCR1A |= (1 << COM1A1)|(1 << COM1B1)|(1 << WGM10);
- TCCR1B |= (1 << CS11)|(1 << WGM12);
- TCCR2 |= (1 << COM21)|(1 << WGM21)|(1 << WGM20)|(1 << CS21);
- OCR1A = 1; OCR1B = 1; OCR2 = 1;
- PWM_1 = OCR1A; PWM_2 = OCR1B; PWM_3 = OCR2;
- }
- void init_UART()
- {
- UCSRB |= (1 << RXCIE)|(1 << TXEN)|(1 << RXEN);
- UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
- UBRRH = 0;
- UBRRL = UBRRL_value;
- OCR1A = 1; OCR1B = 1; OCR2 = 1;
- }
- int main(void)
- {
- init_port();
- init_PWM();
- init_UART();
- sei();
- UART_SEND_STR("Hello world\n");
- unsigned int character;
- while (1)
- {
- if(dhtflag == 1000)
- {
- humidity = dht11_gethumidity();
- temperature = dht11_gettemperature();
- dhtflag = 0;
- }
- ++dhtflag;
- _delay_ms(5);
- switch(color)
- {
- case 1: PWM_1 = num; flagPWM2 = 1; flagPWM3 = 1; color = 4;
- PWM_change(num,0,0,1);
- break;
- case 2: PWM_2 = num; flagPWM1 = 1; flagPWM3 = 1; color = 4;
- PWM_change(0,num,0,1);
- break;
- case 3: PWM_3 = num; flagPWM1 = 1; flagPWM2 = 1; color = 4;
- PWM_change(0,0,num,1);
- break;
- case 4: num = 0; color = 0; DispStatus();
- break;
- default: break;
- }
- switch(lum)
- {
- case 1: num1 = PWM_1 + incdec1;
- num2 = PWM_2 + incdec2;
- num3 = PWM_3 + incdec3;
- if(num1 > 255) num1 = 255;
- if(num2 > 255) num2 = 255;
- if(num3 > 255) num3 = 255;
- PWM_1 = num1; PWM_2 = num2; PWM_3 = num3;
- PWM_change(num1,num2,num3,1);
- lum = 3;
- character = 1;
- break;
- case 2: if(PWM_1 <= incdec1 ) num1 = 1;
- else num1 = PWM_1 - incdec1;
- if(PWM_2 <= incdec2 ) num2 = 1;
- else num2 = PWM_2 - incdec2;
- if(PWM_3 <= incdec3 ) num3 = 1;
- else num3 = PWM_3 - incdec3;
- PWM_1 = num1; PWM_2 = num2; PWM_3 = num3;
- PWM_change(num1,num2,num3,1);
- lum = 3;
- character = 0;
- break;
- case 3: lum = 0; luminosity = 0;
- DispLum(num,character); DispStatus();
- num = 0; num1 = 1; num2 = 'n'; num3 = 'n';
- break;
- default: break;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement