Fermentor hőmérséklet méréséhez tartozó C kód (I2C)

A hőmérséklet mérést termisztorral valósítjuk meg, lásd előző cikk (Hőmérséklet mérés termisztorral). Az adatfeldolgozásért  és továbbításért egy egycsipes mikrovezérlő az ATmega328 lesz a felelős, ami igen nagy luxusnak számít, tekintve a csip kapacitását, viszont demonstrációs célok és a jobb áttekinthetőség kedvéért emellett döntöttünk. Az alábbi kód 0-1023 között egy átlagolt számot küld I2C interfészen keresztül a raspberrynek, az ezen futó szerver oldali kód pedig majd elvégzi a hőmérséklet kiszámítását a Steinhart–Hart összefüggés alapján.

/*

  Smoothing

  Reads repeatedly from an analog input, calculating a running average
  and printing it to the computer.  Keeps ten readings in an array and
  continually averages them.

  The circuit:
    * Analog sensor (potentiometer will do) attached to analog input 0

  Created 22 April 2007
  By David A. Mellis  <dam@mellis.org>
  modified 9 Apr 2012
  by Tom Igoe
  http://www.arduino.cc/en/Tutorial/Smoothing

  This example code is in the public domain.
  
  Modified by Gyula Guttmann
  I2C communication interface
  jFermi project

*/


// Define the number of samples to keep track of.  The higher the number,
// the more the readings will be smoothed, but the slower the output will
// respond to the input.  Using a constant rather than a normal variable lets
// use this value to determine the size of the readings array.
#include <Wire.h>
const int numReadings = 10;

int readings[numReadings];      // the readings from the analog input
int readIndex = 0;              // the index of the current reading
int total = 0;                  // the running total
int average = 0;                // the average

int inputPin = A0;

void setup() {
  analogReference(EXTERNAL);
 
  Wire.begin(9);
  Wire.onRequest(requestEvent);
  // initialize all the readings to 0:
  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
}

void loop() {
  // subtract the last reading:
  total = total - readings[readIndex];
  // read from the sensor:
  readings[readIndex] = analogRead(inputPin);
  // add the reading to the total:
  total = total + readings[readIndex];
  // advance to the next position in the array:
  readIndex = readIndex + 1;

  // if we're at the end of the array...
  if (readIndex >= numReadings) {
    // ...wrap around to the beginning:
    readIndex = 0;
  }

  // calculate the average:
  average = total / numReadings;
  // send it to the computer as ASCII digits
  
  delay(1);        // delay in between reads for stability
}
void requestEvent()
{

int32_t bigNum = average;
char str[255];
sprintf(str, "%i\0", bigNum);
Wire.write(str);


}

Egy dologra mindenképpen figyelni kell, a setup részben meg van adva, hogy egy külső referencia feszültséget vegyen alapul

 analogReference(EXTERNAL);

a nagyobb pontosság miatt, így az AREF lábat (21-es) mindenképpen egy referencia feszültségre kell kötni, ellenkező esetben nem kapunk vissza valós értéket.

A szerver oldali kód javascript-ben pedig így néz ki:

                value2 = Math.log(9870*((1023/value2)-1));
		value2 = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * value2 * value2 ))* value2 );
		value2 = value2 - 273.15;
		value2 = value2.toFixed(2);

 

Share This:

 
Loading Facebook Comments ...

Leave a Comment