Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.14 KB | None | 0 0
  1. /*
  2.  * USART + PWM + TEMP.c
  3.  *
  4.  * Created: 27.06.2017 20:16:56
  5.  * Author : Anatoly Tsirkunenko
  6.  */
  7.  
  8. #define F_CPU 8000000
  9. #define BAUD 9600L
  10. #define UBRRL_value ((F_CPU/(BAUD*16))-1)
  11.  
  12. #include <avr/io.h>
  13. #include <stdio.h>
  14. #include <avr/interrupt.h>
  15. #include "dht11.h"
  16. #include <util/delay.h>
  17.  
  18. unsigned int num = 0, num1 = 1, num2 = 'n', num3 = 'n', dhtflag = 1000, incdec1, incdec2, incdec3;
  19. unsigned char rxcount = 0, receive, i, t1, t2, h1, h2, LED = 0,
  20.               lum = 0, luminosity = 0, color, PWM_1, PWM_2, PWM_3, flagPWM1 = 0, flagPWM2 = 0, flagPWM3 = 0,
  21.               analizer[10] = {'0','1','2','3','4','5','6','7','8','9'};
  22. volatile unsigned char buffer;
  23. int8_t temperature, humidity;
  24.  
  25. void UART_SEND_CHAR(unsigned char value)
  26. {
  27.     while(!(UCSRA & (1 << UDRE)));
  28.     UDR = value;
  29. }
  30.  
  31. void UART_SEND_STR(char str[])
  32. {
  33.     i = 0;
  34.     while(str[i] != '\0')
  35.     {
  36.         UART_SEND_CHAR(str[i]);
  37.         ++i;
  38.     }
  39. }
  40.  
  41. void DispHumidity()
  42. {
  43.     h1 = humidity / 10;
  44.     h2 = humidity % 10;
  45.     UART_SEND_STR("Humidity: ");
  46.     UART_SEND_CHAR(analizer[h1]);
  47.     UART_SEND_CHAR(analizer[h2]);
  48.     UART_SEND_STR("%\n");
  49. }
  50.  
  51. void DispTemperature()
  52. {
  53.     t1 = temperature / 10;
  54.     t2 = temperature % 10;
  55.     UART_SEND_STR("Temperature: ");
  56.     UART_SEND_CHAR(analizer[t1]);
  57.     UART_SEND_CHAR(analizer[t2]);
  58.     UART_SEND_STR(" C\n");
  59. }
  60.  
  61. void DispHelp()
  62. {
  63.     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#");
  64. }
  65.  
  66. void DispError()
  67. {
  68.     UART_SEND_STR("ERROR!\nType h for help");
  69. }
  70.  
  71. void DispStatus()
  72. {
  73.     UART_SEND_STR("Current status:\n");
  74.     UART_SEND_STR("Red: ");
  75.     UART_SEND_CHAR(analizer[PWM_1/100]);
  76.     UART_SEND_CHAR(analizer[(PWM_1/10)%10]);
  77.     UART_SEND_CHAR(analizer[PWM_1%10]);
  78.     UART_SEND_STR("\n");
  79.     UART_SEND_STR("Green: ");
  80.     UART_SEND_CHAR(analizer[PWM_2/100]);
  81.     UART_SEND_CHAR(analizer[(PWM_2/10)%10]);
  82.     UART_SEND_CHAR(analizer[PWM_2%10]);
  83.     UART_SEND_STR("\n");
  84.     UART_SEND_STR("Blue: ");
  85.     UART_SEND_CHAR(analizer[PWM_3/100]);
  86.     UART_SEND_CHAR(analizer[(PWM_3/10)%10]);
  87.     UART_SEND_CHAR(analizer[PWM_3%10]);
  88.     UART_SEND_STR("\n");
  89. }
  90.  
  91. void DispLum(unsigned char char1, char char2)
  92. {
  93.     UART_SEND_STR("Luminance ");
  94.     if(char2) UART_SEND_CHAR('+');
  95.     else UART_SEND_CHAR('-');
  96.     UART_SEND_CHAR(analizer[char1/100]);
  97.     UART_SEND_CHAR(analizer[(char1/10)%10]);
  98.     UART_SEND_CHAR(analizer[char1%10]);
  99.     UART_SEND_STR("%\n");
  100. }
  101.  
  102. void descriptor()
  103. {
  104.     for(i = 0; i<10; ++i)
  105.     {
  106.         if(analizer[i] == num1) num1 = i;
  107.         if(analizer[i] == num2) num2 = i;
  108.         if(analizer[i] == num3) num3 = i;
  109.     }
  110.     if((num2 != 'n') && (num3 != 'n'))          num = num1*100 + num2*10 + num3;
  111.     else if((num2 != 'n') && (num3 == 'n'))     num = num1*10 + num2;
  112.     else                                        num = num1;
  113.     num1 = 1;       num2 = 'n';         num3 = 'n';
  114.     if(num < 1)     num = 1;
  115.     incdec1 = (OCR1A * num)/100;
  116.     incdec2 = (OCR1B * num)/100;
  117.     incdec3 = (OCR2 * num)/100;
  118.     if(num > 255)   num = 255;
  119. }
  120.  
  121. void PWM_change(unsigned char char1, unsigned char char2, unsigned char char3, unsigned char char4)
  122. {
  123.     cli();
  124.     while(!(flagPWM1 && flagPWM2 && flagPWM3))
  125.     {
  126.         if(!flagPWM1)
  127.         {
  128.             if(OCR1A < char1) ++OCR1A;
  129.             else if(OCR1A > char1) --OCR1A;
  130.             else flagPWM1 = 1;
  131.         }
  132.         if(!flagPWM2)
  133.         {
  134.             if(OCR1B < char2) ++OCR1B;
  135.             else if(OCR1B > char2) --OCR1B;
  136.             else flagPWM2 = 1;
  137.         }
  138.         if(!flagPWM3)
  139.         {
  140.             if(OCR2 < char3) ++OCR2;
  141.             else if(OCR2 > char3) --OCR2;
  142.             else flagPWM3 = 1;
  143.         }
  144.         _delay_ms(1);
  145.         if(char4 == 2) _delay_ms(1);
  146.     }
  147.     char1 = 0; char2 = 0; char3 = 0;
  148.     flagPWM1 = 0; flagPWM2 = 0; flagPWM3 = 0;
  149.     sei();
  150. }
  151.  
  152. ISR(USART_RXC_vect)
  153. {
  154.     buffer = UDR;
  155.     if(!receive)
  156.     {
  157.         switch(buffer)
  158.         {
  159.             case 'R':       LED = 1;
  160.                             receive = 1;
  161.                             rxcount = 1;
  162.                             break;
  163.                        
  164.             case 'G':       LED = 2;
  165.                             receive = 1;
  166.                             rxcount = 1;
  167.                             break;
  168.                        
  169.             case 'B':       LED = 3;
  170.                             receive = 1;
  171.                             rxcount = 1;
  172.                             break;
  173.                        
  174.             case '+':       luminosity = 1;
  175.                             receive = 1;
  176.                             rxcount = 1;
  177.                             break;
  178.                            
  179.             case '-':       luminosity = 2;
  180.                             receive = 1;
  181.                             rxcount = 1;
  182.                             break;
  183.                            
  184.             case 'h':       DispHelp();
  185.                             break;
  186.                        
  187.             case 'T':       DispTemperature();
  188.                             break;
  189.            
  190.             case 'H':       DispHumidity();
  191.                             break;
  192.            
  193.             case 'S':       DispStatus();
  194.                             DispTemperature();
  195.                             DispHumidity();
  196.                             break;
  197.                        
  198.             case '0':       PWM_change(0,0,0,2);
  199.                             DDRB &= (0 << DDB1)|(0 << DDB2)|(0 << DDB3);
  200.                             break;
  201.                            
  202.             case '1':       DDRB |= (1 << DDB1)|(1 << DDB2)|(1 << DDB3);
  203.                             PWM_change(PWM_1,PWM_2,PWM_3,2);
  204.                             break;
  205.            
  206.             default:        DispError();
  207.                             break;
  208.         }
  209.     }
  210.     else
  211.     {
  212.         if(buffer == '#')
  213.         {
  214.             UART_SEND_CHAR(num1);UART_SEND_CHAR(num2);UART_SEND_CHAR(num3);
  215.             descriptor();
  216.             color = LED;
  217.             lum = luminosity;
  218.             LED = 0;
  219.             rxcount = 0;
  220.             receive = 0;
  221.         }          
  222.         else
  223.         {
  224.             if(rxcount == 1) num1 = buffer;
  225.             if(rxcount == 2) num2 = buffer;
  226.             if(rxcount == 3) num3 = buffer;
  227.             ++rxcount;
  228.         }
  229.        
  230.     }
  231. }
  232.  
  233. void init_port(void)
  234. {
  235.     DDRB |= (1 << DDB1)|(1 << DDB2)|(1 << DDB3);
  236. }
  237.  
  238. void init_PWM()
  239. {
  240.     TCCR1A |= (1 << COM1A1)|(1 << COM1B1)|(1 << WGM10);
  241.     TCCR1B |= (1 << CS11)|(1 << WGM12);
  242.     TCCR2 |= (1 << COM21)|(1 << WGM21)|(1 << WGM20)|(1 << CS21);   
  243.     OCR1A = 1; OCR1B = 1; OCR2 = 1;
  244.     PWM_1 = OCR1A; PWM_2 = OCR1B; PWM_3 = OCR2;
  245. }
  246.  
  247. void init_UART()
  248. {
  249.     UCSRB |= (1 << RXCIE)|(1 << TXEN)|(1 << RXEN);
  250.     UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
  251.     UBRRH = 0;
  252.     UBRRL = UBRRL_value;
  253.     OCR1A = 1; OCR1B = 1; OCR2 = 1;
  254. }
  255.  
  256. int main(void)
  257. {
  258.     init_port();
  259.     init_PWM();
  260.     init_UART();
  261.     sei();
  262.     UART_SEND_STR("Hello world\n");
  263.     unsigned int character;
  264.     while (1)
  265.     {
  266.         if(dhtflag == 1000)
  267.         {
  268.             humidity = dht11_gethumidity();
  269.             temperature = dht11_gettemperature();
  270.             dhtflag = 0;
  271.         }
  272.         ++dhtflag;
  273.         _delay_ms(5);
  274.         switch(color)
  275.         {
  276.             case 1:     PWM_1 = num; flagPWM2 = 1; flagPWM3 = 1; color = 4;
  277.                         PWM_change(num,0,0,1);
  278.                         break;
  279.                    
  280.             case 2:     PWM_2 = num; flagPWM1 = 1; flagPWM3 = 1; color = 4;
  281.                         PWM_change(0,num,0,1);
  282.                         break;
  283.                        
  284.             case 3:     PWM_3 = num; flagPWM1 = 1; flagPWM2 = 1; color = 4;
  285.                         PWM_change(0,0,num,1);
  286.                         break;
  287.                        
  288.             case 4:     num = 0; color = 0; DispStatus();
  289.                         break;
  290.    
  291.             default:    break;
  292.         }
  293.         switch(lum)
  294.         {
  295.             case 1:     num1 = PWM_1 + incdec1;
  296.                         num2 = PWM_2 + incdec2;
  297.                         num3 = PWM_3 + incdec3;
  298.                         if(num1 > 255) num1 = 255;
  299.                         if(num2 > 255) num2 = 255;
  300.                         if(num3 > 255) num3 = 255;
  301.                         PWM_1 = num1; PWM_2 = num2; PWM_3 = num3;
  302.                         PWM_change(num1,num2,num3,1);
  303.                         lum = 3;
  304.                         character = 1;
  305.                         break;
  306.                            
  307.             case 2:     if(PWM_1 <= incdec1 ) num1 = 1;
  308.                         else num1 = PWM_1 - incdec1;
  309.                         if(PWM_2 <= incdec2 ) num2 = 1;
  310.                         else num2 = PWM_2 - incdec2;
  311.                         if(PWM_3 <= incdec3 ) num3 = 1;
  312.                         else num3 = PWM_3 - incdec3;
  313.                         PWM_1 = num1; PWM_2 = num2; PWM_3 = num3;
  314.                         PWM_change(num1,num2,num3,1);
  315.                         lum = 3;
  316.                         character = 0;
  317.                         break;
  318.            
  319.             case 3:     lum = 0; luminosity = 0;
  320.                         DispLum(num,character); DispStatus();
  321.                         num = 0; num1 = 1; num2 = 'n'; num3 = 'n';
  322.                         break;
  323.            
  324.             default:    break;
  325.         }
  326.     }
  327. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement