Advertisement
tiodocomputador

Granja

Dec 28th, 2013
477
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.69 KB | None | 0 0
  1. // Laboratorio J011y R0g3r
  2. // ta na hora de pensar num nome serio pra esse Laboratorio :D
  3. // Código para controle de temperatura em aviário. Define uma temperatura-base (padrão é 28 graus),
  4. // que pode ser alterado e visualizado num display, assim como a temperatura do ambiente.
  5. // 1 grau abaixo da temperatura-base, liga um relay que aciona a primeira linha de ventiladores.
  6. // Acima da temperatura-base, aciona a segunda linha de ventiladores.
  7. // 2 graus acima da temperatura-base, aciona a bomba de aspersão de água.
  8. // Um botão simples permite acionar manualmente a bomba.
  9. //
  10. // Apoio: Laboratorio de Garagem - labdegaragem.com
  11. // Agradecimentos a valiosa ajuda dos amigos:
  12. // Almir, Jonatas, Jucelei, Rogerio, Euclides, Marcelo, Renyer, fredsant,Yure, (esqueci alguem???)
  13. // alem da tremenda paciencia da minha esposa pra me aguentar falando nisso dia e noite :D
  14.  
  15. int LATCH1 = 2;
  16. int DATA1 = 3;
  17. int CLK1 = 4;
  18. // define os pinos de latch, data e clock do 74HC595 que controla o display da temperatura do ambiente
  19.  
  20. int LATCH2 = 5;
  21. int DATA2 = 6;
  22. int CLK2 = 7;
  23. // define os pinos de latch, data e clock do 74HC595 que controla o display da temperatura definida como base
  24.  
  25. // latch: pino 12 no 74hc595
  26. // data: pino 14 no 74hc595
  27. // clock: pino 11 no 74hc595
  28. // ver datasheet (boa sorte!)
  29.  
  30. int desce = 8;
  31. // pino do botao que reduz a temperatura-base em meio grau
  32. int sobe = 9;
  33. // pino do botao que aumenta a temperatura-base em meio grau
  34. int agua = 10;
  35. // pino do botao que liga a bomba dos aspersores de agua, independente da temperatura
  36. int vent1 = 13;
  37. // pino que liga a primeira linha de ventiladores, quando (temperatura >= (tempbase - 1 grau)) E (temperatura < tempbase)
  38. int vent2 = 12;
  39. // pino que liga a segunda linha de ventiladores, quando (temperatura >= tempbase) E (temperatura <= (tempbase + 1 grau))
  40. int bomba = 11;
  41. // pino que liga a bomba dos aspersores, quando temperatura > (tempbase + 1 grau)
  42. int tempbase=280;
  43. // temperatura-base, notem que estou trabalhando com 10x a temperatura real
  44. // para facilitar a codificacao dos displays de 7 segmentos, que so trabalha com numeros binarios e inteiros
  45.  
  46. int sensor = A0;
  47.  
  48. // Renyer, essa eh a parada de matrizes que eu queria te mostrar, usando o tipo byte:
  49. byte digito1[10]= {
  50.   B11111100,B01100000,B11011010,B11110010,B01100110,B10110110,B10111110,B11100000,B11111110,B11110110};
  51. byte digito2[10]= {
  52.   B11111101,B01100001,B11011011,B11110011,B01100111,B10110111,B10111111,B11100001,B11111111,B11110111};
  53. byte digito3[10]= {
  54.   B11111100,B01100000,B11011010,B11110010,B01100110,B10110110,B10111110,B11100000,B11111110,B11110110};
  55. byte digito4[10]= {
  56.   B11111100,B01100000,B11011010,B11110010,B01100110,B10110110,B10111110,B11100000,B11111110,B11110110};
  57. byte digito5[10]= {
  58.   B11111101,B01100001,B11011011,B11110011,B01100111,B10110111,B10111111,B11100001,B11111111,B11110111};
  59. byte digito6[10]= {
  60.   B11111100,B01100000,B11011010,B11110010,B01100110,B10110110,B10111110,B11100000,B11111110,B11110110};
  61. // matrizes de 10 termos, cada um define um Byte diferente para cada
  62. // digito de 0 a 9 no display, ou seja, liga um conjunto especifico de portas do 74hc595
  63. // que acende um conjunto especifico de LEDs.
  64.  
  65. void setup()
  66. {
  67.   Serial.begin(9600);
  68.  
  69.   pinMode(A0, INPUT);
  70.  
  71.   pinMode(LATCH1, OUTPUT);
  72.   pinMode(CLK1, OUTPUT);
  73.   pinMode(DATA1, OUTPUT);
  74.  
  75.   pinMode(LATCH2, OUTPUT);
  76.   pinMode(CLK2, OUTPUT);
  77.   pinMode(DATA2, OUTPUT);  
  78.  
  79.   pinMode(desce, INPUT);
  80.   pinMode(sobe, INPUT);
  81.   pinMode(agua, INPUT);
  82.  
  83.   pinMode(vent1, OUTPUT);
  84.   pinMode(vent2, OUTPUT);
  85.   pinMode(bomba, OUTPUT);  
  86.  
  87. }
  88.  
  89. void loop()
  90. {
  91.   int t=1000;
  92.   long intervalo = 5000;
  93.   long previousMillis = millis();
  94.   //rever onde fica e quantos milisegundos dura.
  95.  
  96.   int value = analogRead(sensor);
  97.   float millivolts = (value / 1024.0) * 5000;
  98.   float temperatura = millivolts / 8.97; //sensor output is 10mV per degree Celsius.
  99.   float celsius = millivolts / 10; // sensor output is 10mV per Serial.print(celsius);
  100.   Serial.print("Temperatura = ");
  101.   Serial.print(temperatura);
  102.   Serial.println(" graus Celsius.");
  103.  
  104.   int unidade1;
  105.   int dezena1;
  106.   int centena1;
  107.  
  108.   int unidade2;
  109.   int dezena2;
  110.   int centena2;
  111.  
  112.   {
  113.     {
  114.       int displaytemp = (10*temperatura);
  115.       // trabalhando com 10x a temperatura pra facilitar com o display de 7 segmentos.
  116.  
  117.       // Esse eh a dica do Almir e do Jucelei que fechou minhas duvidas:
  118.       // Eu tava quebrando a cabeca naquele dia mas tava cansado demais pra deduzir uma coisa tao simples:
  119.       //separar digitos tempbase exemplo: 285
  120.       centena1 = (displaytemp/100);
  121.       //285/100=2 apenas o numero inteiro é captado  
  122.       dezena1 = ((displaytemp - (centena1*100)) / 10);
  123.       //285-(2*100)/10 ou seja,285-200 (=85/10=8,5) apenas 8 é jogado no inteiro
  124.       unidade1 = displaytemp - ((100*centena1) + (10*dezena1));
  125.       // 285-(200+80) ou (285 - 280) = 5  
  126.       //Essa e a dica do Jonatas:
  127.       digitalWrite(LATCH1, LOW);
  128.       shiftOut(DATA1, CLK1, LSBFIRST, digito1[centena1]); //primeiro CI recebe 1 Byte
  129.       shiftOut(DATA1, CLK1, LSBFIRST, digito2[dezena1]);  //segundo CI recebe 1 Byte
  130.       shiftOut(DATA1, CLK1, LSBFIRST, digito3[unidade1]); //terceiro CI recebe 1 Byte
  131.       digitalWrite(LATCH1, HIGH);
  132.       delay(t);
  133.       // Depois de fritar muito o cerebro que percebi como funciona o esquema de latch-clock-data.
  134.       // Na animacao que o Jonatas me mostrou parecia que o bit enviado pelo Arduino para o 74hc595
  135.       // deslocava-se da primeira porta ate a ultima: Q1, Q2, ... Q8.
  136.       // Mas quem se desloca eh o CI que recebe o Byte: a cada vez que o clock muda de estado ( 0 || 1 ),
  137.       // o CI transfere o endereco de recebimento para o proximo CI da fila.
  138.       // O PCF-8574A tem 3 bits (000 a 111) que definem qual o endereco de cada CI.
  139.       // Ja no 74HC595, o proximo endereco eh definido pela ligacao entre os pinos 9 e 14.
  140.       // O proximo CI eh aquele cujo pino 14 estiver ligado ao pino 9 do CI que acabou de receber o Byte.
  141.       // Facil, neh? ;
  142.     }
  143.  
  144.     {
  145.       centena2 = (tempbase/100);
  146.       dezena2 = ((tempbase - (centena2*100)) / 10);
  147.       unidade2 = tempbase - ((100*centena2) + (10*dezena2));
  148.       digitalWrite(LATCH2, LOW);
  149.       shiftOut(DATA2, CLK2, LSBFIRST, digito4[centena2]); // escreve a centena no display
  150.       shiftOut(DATA2, CLK2, LSBFIRST, digito5[dezena2]); // escreve a dezena no display
  151.       shiftOut(DATA2, CLK2, LSBFIRST, digito6[unidade2]); // escreve a unidade no display
  152.       digitalWrite(LATCH2, HIGH);
  153.       delay(t);
  154.     }
  155.     {
  156.       while(abs(millis()) - previousMillis < intervalo)
  157.       {  
  158.         if ((digitalRead(sobe) == HIGH) && (tempbase!=0))
  159.         {
  160.           tempbase = tempbase + 5;
  161.           centena2 = (tempbase/100);
  162.           dezena2 = ((tempbase - (centena2*100)) / 10);
  163.           unidade2 = tempbase - ((100*centena2) + (10*dezena2));
  164.           digitalWrite(LATCH2, LOW);
  165.           shiftOut(DATA2, CLK2, LSBFIRST, digito4[centena2]);
  166.           shiftOut(DATA2, CLK2, LSBFIRST, digito5[dezena2]);
  167.           shiftOut(DATA2, CLK2, LSBFIRST, digito6[unidade2]);
  168.           digitalWrite(LATCH2, HIGH);
  169.           delay(t);
  170.         }
  171.  
  172.         if ((digitalRead(desce) == HIGH) && (tempbase!=0))
  173.         {
  174.           tempbase = tempbase - 5;
  175.           centena2=(tempbase/100);
  176.           dezena2=((tempbase-(centena2*100))/10);
  177.           unidade2=tempbase-((100*centena2) + (10*dezena2));
  178.           digitalWrite(LATCH2, LOW);
  179.           shiftOut(DATA2, CLK2, LSBFIRST, digito4[centena2]);
  180.           shiftOut(DATA2, CLK2, LSBFIRST, digito5[dezena2]);
  181.           shiftOut(DATA2, CLK2, LSBFIRST, digito6[unidade2]);
  182.           digitalWrite(LATCH2, HIGH);
  183.           delay(t);
  184.         }
  185.  
  186.         // Daqui pra frente eh matematica, dai foi so nadar de bracada,
  187.         // mas ainda to fucando nos livros de C
  188.         // pra enxugar esse codigo:
  189.         if (((10*temperatura) < (tempbase-10)) && (digitalRead(agua) == LOW) && (tempbase!=0))
  190.         {
  191.           digitalWrite(vent1, LOW);
  192.           digitalWrite(vent2, LOW);
  193.           digitalWrite(bomba, LOW);
  194.         }
  195.  
  196.         else if (((10*temperatura) < (tempbase-10)) && (digitalRead(agua) == HIGH) && (tempbase!=0))
  197.         {
  198.           digitalWrite(vent1, LOW);
  199.           digitalWrite(vent2, LOW);
  200.           digitalWrite(bomba, HIGH);
  201.         }
  202.  
  203.         else if (((tempbase-10) <= (10*temperatura)) && ((10*temperatura) < tempbase) && (digitalRead(agua) == LOW) && (tempbase!=0))
  204.         {
  205.           digitalWrite(vent1, HIGH);
  206.           digitalWrite(vent2, LOW);
  207.           digitalWrite(bomba, LOW);
  208.         }
  209.  
  210.         else if (((tempbase-10) <= (10*temperatura)) && ((10*temperatura) < tempbase) && (digitalRead(agua) == HIGH) && (tempbase!=0))
  211.         {
  212.           digitalWrite(vent1, HIGH);
  213.           digitalWrite(vent2, LOW);
  214.           digitalWrite(bomba, HIGH);
  215.         }
  216.  
  217.         else if ((tempbase <= (10*temperatura)) && ((10*temperatura) < (tempbase+20)) && (digitalRead(agua) == LOW) && (tempbase!=0))
  218.         {
  219.           digitalWrite(vent1, HIGH);
  220.           digitalWrite(vent2, HIGH);
  221.           digitalWrite(bomba, LOW);
  222.         }
  223.  
  224.         else if ((tempbase <= (10*temperatura)) && ((10*temperatura) < (tempbase+20)) && (digitalRead(agua) == HIGH) && (tempbase!=0))
  225.         {
  226.           digitalWrite(vent1, HIGH);
  227.           digitalWrite(vent2, HIGH);
  228.           digitalWrite(bomba, HIGH);
  229.         }
  230.  
  231.         else if ((((tempbase+20) <= (10*temperatura)) && (digitalRead(agua) == LOW) && (tempbase!=0)) || (((tempbase+20) <= (10*temperatura)) && (digitalRead(agua) == HIGH) && (tempbase!=0)))
  232.         {
  233.           digitalWrite(vent1, HIGH);
  234.           digitalWrite(vent2, HIGH);
  235.           digitalWrite(bomba, HIGH);
  236.         }      
  237.       }
  238.     }
  239.   }
  240. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement