Advertisement
Guest User

Untitled

a guest
Jun 7th, 2015
316
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.37 KB | None | 0 0
  1. /* Modbus RTU common parameters, the Master MUST use the same parameters */
  2. enum {
  3. MB_SLAVE = 1, /* modbus slave id */
  4. };
  5. /* slave registers example */
  6. enum {
  7. MB_REG1,
  8. MB_REG2,
  9. MB_REGS /* total number of registers on slave */
  10. };
  11. // Pino onde o Termistor esta conectado
  12. #define PINOTERMISTOR A0
  13. // Valor do termistor na temperatura nominal
  14. #define TERMISTORNOMINAL 10000
  15. // Temp. nominal descrita no Manual
  16. #define TEMPERATURENOMINAL 25
  17. // Número de amostragens para
  18. #define NUMAMOSTRAS 5
  19. // Beta do nosso Termistor
  20. #define BCOEFFICIENT 3950
  21. // valor do resistor em série
  22. #define SERIESRESISTOR 10000
  23. int amostra[NUMAMOSTRAS];
  24. int i;
  25. int valor;
  26. int DS18S20_Pin = A1;
  27. int sensorValue = 0;
  28. OneWire ds(DS18S20_Pin);
  29. int regs[MB_REGS]; /* this is the slave's modbus data map */
  30.  
  31. void setup()
  32. {
  33. /* Modbus setup example, the master must use the same COM parameters */
  34. /* 115200 bps, 8N1, two-device network */
  35. configure_mb_slave(9600, 'n', 0);
  36. analogReference(EXTERNAL);
  37. /*Serial.begin(9600); */
  38. }
  39.  
  40.  
  41. void loop() {
  42.  
  43.  
  44. /* This is all for the Modbus slave */
  45. update_mb_slave(MB_SLAVE, regs, MB_REGS);
  46.  
  47. /* your code goes here */
  48. regs[1] = getTemp();
  49. regs[2] = valor;
  50. //analogRead(DS18S20_Pin);
  51.  
  52.  
  53.  
  54.  
  55. }
  56. float temperature = getTemp();
  57. /* Serial.println(temperature); */
  58. float getTemp(){
  59. //returns the temperature from one DS18S20 in DEG Celsius
  60.  
  61. byte data[12];
  62. byte addr[8];
  63.  
  64. if ( !ds.search(addr)) {
  65. //no more sensors on chain, reset search
  66. ds.reset_search();
  67. return -1000;
  68. }
  69.  
  70. if ( OneWire::crc8( addr, 7) != addr[7]) {
  71. /* Serial.println("CRC is not valid!"); */
  72. return -1000;
  73. }
  74.  
  75. if ( addr[0] != 0x10 && addr[0] != 0x28) {
  76. /* Serial.print("Device is not recognized"); */
  77. return -1000;
  78. }
  79.  
  80. ds.reset();
  81. ds.select(addr);
  82. ds.write(0x44,1); // start conversion, with parasite power on at the end
  83.  
  84. byte present = ds.reset();
  85. ds.select(addr);
  86. ds.write(0xBE); // Read Scratchpad
  87.  
  88.  
  89. for (int i = 0; i < 9; i++) { // we need 9 bytes
  90. data[i] = ds.read();
  91. }
  92.  
  93. ds.reset_search();
  94.  
  95. byte MSB = data[1];
  96. byte LSB = data[0];
  97.  
  98. float tempRead = ((MSB << 8) | LSB); //using two's compliment
  99. float TemperatureSum = tempRead / 16;
  100.  
  101. return TemperatureSum;
  102.  
  103.  
  104.  
  105. float temperatura;
  106. float media;
  107.  
  108. for (i=0; i< NUMAMOSTRAS; i++) {
  109. amostra[i] = analogRead(PINOTERMISTOR);
  110. //delay(10);
  111. }
  112.  
  113. media = 0;
  114. for (i=0; i< NUMAMOSTRAS; i++) {
  115. media += amostra[i];
  116. }
  117. media /= NUMAMOSTRAS;
  118.  
  119. // Converte o valor da tensão em resistência
  120. media = 1023 / media - 1;
  121. media = SERIESRESISTOR / media;
  122.  
  123. //Faz o cálculo pela fórmula do Fator Beta
  124.  
  125. temperatura = media / TERMISTORNOMINAL; // (R/Ro)
  126. temperatura = log(temperatura); // ln(R/Ro)
  127. temperatura /= BCOEFFICIENT; // 1/B * ln(R/Ro)
  128. temperatura += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
  129. temperatura = 1.0 / temperatura; // Inverte o valor
  130. temperatura -= 273.15;
  131. valor = temperatura;
  132. // Converte para Celsius
  133.  
  134. /*Serial.print("Temperatura no Sensor eh: ");
  135. Serial.print(temperatura);
  136. Serial.println(" *C");
  137.  
  138. delay(1000);*/
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement