m33600

termopar SPI e amperimetro trifasico nao invasivo saida i2c

May 24th, 2016
396
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.05 KB | None | 0 0
  1. /* www.copacabana.io  
  2.  *  Parte 2: inclusão da comunicação i2c
  3.  *  inclusão de leitura SPI de termopar
  4.  TA12-100 medidor trifasico não invasivo
  5.  feito em Arduino Pro Mini 328 16MHz 5V
  6. */
  7. #include "max6675.h"  // biblioteca do chip do termopar K SPI
  8.  
  9. int termoSPISO = 8;  // pino MISO
  10. int termoSPICS = 9;  // pino CS/SS
  11. int termoSPICLK = 7; // pino CLK
  12. MAX6675 termoSPI(termoSPICLK, termoSPICS, termoSPISO);
  13.  
  14. byte temperatura; // vai ler soh a parte inteira da temperatura que eh float
  15.  
  16.  
  17.  
  18. #include <Wire.h> // inclusão do i2c lib
  19. int address = 4;  // endereço escolhido i2c deste slave
  20.  
  21. int sensorR = A0; // pino analogico do sensor R
  22. int sensorS = A1; // pino analogico do sensor S
  23. int sensorT = A2; // pino analogico do sensor T
  24.  
  25.  
  26.  
  27. float voltagemResistorR;   // Voltagem medida atraves do resistor
  28. float correntePicoResistorR; // Corrente de pico medida atraves do resistor
  29. float correnteRMSresistorR; // Corrente RMS atraves do resistor
  30. float correnteRMSnoFioR;     // Corrente Real no fio R
  31.  
  32. float voltagemResistorS;   // Voltagem medida atraves do resistor
  33. float correntePicoResistorS; // Corrente de pico medida atraves do resistor
  34. float correnteRMSresistorS; // Corrente RMS atraves do resistor
  35. float correnteRMSnoFioS;     // Corrente Real no fio S
  36.  
  37. float voltagemResistorT;   // Voltage measured across resistor
  38. float correntePicoResistorT; // Peak Current Measured Through Resistor
  39. float correnteRMSresistorT; // RMS current through Resistor
  40. float correnteRMSnoFioT;     // Corrente Real no fio T
  41.  
  42. int i2cIntRmsR; // criamos variaveis para o payload i2c
  43. int i2cFracRmsR;
  44. int i2cIntRmsS;
  45. int i2cFracRmsS;
  46. int i2cIntRmsT;
  47. int i2cFracRmsT;
  48.  
  49.  
  50. void setup()
  51. {
  52.   Wire.begin(address); // inicializa o i2c
  53.   Wire.onRequest(onRequest); // engatilha para recepçao i2c de requests (interrupt)
  54.  
  55.   Serial.begin(9600);  // inicializa comunicação com serial monitor a 9600 8n1 cr/lf
  56.   pinMode(sensorR, INPUT);
  57.   pinMode(sensorS, INPUT);
  58.   pinMode(sensorT, INPUT);
  59. }
  60.  
  61. void onRequest() {  // interrupção i2c atendida aqui:
  62.  
  63.      /* Para transmitir por i2c, byte a byte, escolhi mudar de mA para
  64.  amperes, com apenas 1 casa decimal. A saida serial permanece com a precisão original
  65.  Então dois bytes por medida serão suficientes. ex: 1.2567 = 1 int + 2 fracionario = (1,2)
  66.  */  
  67. i2cIntRmsR = (int) (correnteRMSnoFioR / 1000); // inteiro R  ... byte 1
  68. i2cFracRmsR = 10*(correnteRMSnoFioR/1000 - i2cIntRmsR); // fracionario R ...  byte 2
  69. i2cIntRmsS = (int) (correnteRMSnoFioS/1000); // inteiro S ... byre 3
  70. i2cFracRmsS = 10*(correnteRMSnoFioS/1000 - i2cIntRmsS); // fracionario S ... byte 4
  71. i2cIntRmsT = (int) correnteRMSnoFioT/1000; //inteiro T ... byte 5
  72. i2cFracRmsT = 10*(correnteRMSnoFioT/1000 - i2cIntRmsT); // fracionario R ... byte 6
  73.  // TEMOS AGORA UM PAYLOAD DE APENAS 6 BYTES PARA TRANSMITIR AS 3 CORRENTES
  74. // multiplicamos *10 a conta fracionaria para acomodar decimos num byte
  75.  
  76.   // crio um buffer para acomodar um payload de 7 bytes
  77.   byte buffer[7] = {i2cIntRmsR,i2cFracRmsR,i2cIntRmsS,i2cFracRmsS,i2cIntRmsT,i2cFracRmsT,temperatura};
  78.   Wire.write(buffer, 7); // envio o payload ao master que pediu
  79.  
  80. Serial.print("AMPERES ");
  81. Serial.print(correnteRMSnoFioR);
  82. Serial.print(" ");
  83. Serial.println(i2cFracRmsR);
  84. }
  85.  
  86. void loop()
  87. {
  88.  
  89. // a temperatura eh float, mas byte serve para ler sem virgula e transmitir  
  90. temperatura = (termoSPI.readCelsius());  // aqui le temperatura no dispositivo SPI
  91. Serial.print("temperatura= ");
  92. Serial.println(temperatura);
  93.  
  94.  
  95.   voltagemResistorR = getVppR();
  96.   voltagemResistorS = getVppS();
  97.   voltagemResistorT = getVppT();
  98.  
  99.   /*
  100.     Lei de ohm para calculo da corrente pelo resistor
  101.     expressa em mA
  102.   */
  103.  
  104.   correntePicoResistorR = (voltagemResistorR / 200.0) * 1000.0;
  105.   correntePicoResistorS = (voltagemResistorR / 200.0) * 1000.0;
  106.   correntePicoResistorT = (voltagemResistorR / 200.0) * 1000.0;
  107.  
  108.   /*
  109.     Formula de conversao de onda senoidal
  110.     para RMS
  111.   */
  112.  
  113.   correnteRMSresistorR = correntePicoResistorR * 0.707;
  114.   correnteRMSresistorS = correntePicoResistorS * 0.707;
  115.   correnteRMSresistorT = correntePicoResistorT * 0.707;
  116.  
  117.   /*
  118.    No modelo octopus TA12-100 a proporcao de
  119.    corrente no transformados eh 1000/1...
  120.  
  121.     Entao a corrente atraves do resitor de 200 ohm
  122.     eh multiplicada por 1000
  123.   */
  124.  
  125.  
  126.   correnteRMSnoFioR = correnteRMSresistorR * 1000;
  127.   correnteRMSnoFioS = correnteRMSresistorS * 1000;
  128.   correnteRMSnoFioT = correnteRMSresistorT * 1000;
  129.  
  130.  
  131.   Serial.print("Corrente pelo fio R : ");
  132.   Serial.print(correnteRMSnoFioR, 3);
  133.   Serial.println(" mA RMS");
  134.   Serial.println();
  135.  
  136.   Serial.print("Corrente pelo fio S : ");
  137.   Serial.print(correnteRMSnoFioS, 3);
  138.   Serial.println(" mA RMS");
  139.   Serial.println();
  140.  
  141.   Serial.print("Corrente pelo fio T : ");
  142.   Serial.print(correnteRMSnoFioT, 3);
  143.   Serial.println(" mA RMS");
  144.   Serial.println();
  145.  
  146.  
  147. }
  148.  
  149.  
  150. /************************************
  151.  
  152.   Para calculo da corrente RMS, temos que conhecer
  153.   a voltagem pico a pico medida na saida atraves do
  154.   resistor de 200 ohm
  155.   A funcao a seguir toma amostras por 1/10 de segundo
  156.   e retorna com o pico registrado no período
  157. *************************************/
  158.  
  159. //-------------------------------------------- fase R
  160. float getVppR()
  161. {
  162.   float resultadoR;
  163.   int leuValorR;             //valor lido pelo sensor
  164.   int maxValorR = 0;          // guarda o maximo registrado aqui
  165.   uint32_t start_time = millis();
  166.   while ((millis() - start_time) < 100) //sample for 1 Sec
  167.   {
  168.     leuValorR = analogRead(sensorR);
  169.     // see if you have a new maxValorR
  170.     if (leuValorR > maxValorR)
  171.     {
  172.       /*registra o valor maximo do sensor*/
  173.       maxValorR = leuValorR;
  174.     }
  175.   }
  176.  
  177.   // Converte o dado digital em uma voltagem
  178.   resultadoR = (maxValorR * 5.0) / 1024.0;
  179.  
  180.   return resultadoR;
  181. }
  182.  
  183. /// ---------------------------------------------fase S
  184.  
  185. float getVppS()
  186. {
  187.   float resultadoS;
  188.   int leuValorS;             // valor lido pelo sensor
  189.   int maxValorS = 0;          // guarda o maximo registrado aqui
  190.   uint32_t start_time = millis();
  191.   while ((millis() - start_time) < 100) //sample for 1 Sec
  192.   {
  193.     leuValorS = analogRead(sensorS);
  194.     // see if you have a new maxValorS
  195.     if (leuValorS > maxValorS)
  196.     {
  197.       /*registra o valor maximo do sensor*/
  198.       maxValorS = leuValorS;
  199.     }
  200.   }
  201.  
  202.   // Converte o dado digital em uma voltagem
  203.   resultadoS = (maxValorS * 5.0) / 1024.0;
  204.  
  205.   return resultadoS;
  206. }
  207.  
  208. // -------------------------------------------------- fase T
  209.  
  210. float getVppT()
  211. {
  212.   float resultadoT;
  213.   int leuValorT;             //valor lido pelo sensor
  214.   int maxValorT = 0;          // guarda o maximo registrado aqui
  215.   uint32_t start_time = millis();
  216.   while ((millis() - start_time) < 100) //sample for 1 Sec
  217.   {
  218.     leuValorT = analogRead(sensorT);
  219.     // verifica se temos um novo valor maximo
  220.     if (leuValorT > maxValorT)
  221.     {
  222.       /*registra o valor maximo do sensor*/
  223.       maxValorT = leuValorT;
  224.     }
  225.   }
  226.  
  227.   // Converte o dado digital em uma voltagem
  228.   resultadoT = (maxValorT * 5.0) / 1024.0;
  229.  
  230.   return resultadoT;
  231. }
Advertisement
Add Comment
Please, Sign In to add comment