Advertisement
tiodocomputador

Código de climatizacao para avicultura.

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