Andrew CollinsStewart Spain
Published

MEGR 3171 Dryer Temperature and Current Sensor

These two sensors can accurately measure a home dryer's temperature and power consumption to help monitor a dryer from a distance.

IntermediateFull instructions provided4 hours33
MEGR 3171 Dryer Temperature and Current Sensor

Things used in this project

Hardware components

Argon
Particle Argon
×2
DHT11 Temperature & Humidity Sensor (3 pins)
DHT11 Temperature & Humidity Sensor (3 pins)
×1
Male/Female Jumper Wires
Male/Female Jumper Wires
×1
Gravity: Analog AC Current Sensor
DFRobot Gravity: Analog AC Current Sensor
×1
Micro-USB to USB Cable (Generic)
Micro-USB to USB Cable (Generic)
×1
Solderless Breadboard Half Size
Solderless Breadboard Half Size
×2
Samsung USB Wall Adapter
×2

Software apps and online services

Particle Build Web IDE
Particle Build Web IDE
ThingSpeak API
ThingSpeak API

Story

Read more

Schematics

Argon Temperature Sensor

This is the schematic for the DHT11 temperature sensor connected to the Particle Argon. The DHT11 has three pins, the middle green wired pin connected to the USB voltage for a 5V supply, the left yellow wired pin connected to the D2 pin for output signal, and the right blue wired pin connected to ground. Then there is a WIFI antenna connected to the Argon's antenna jack. Lastly, the whole circuit is powered by a micro-USB cable and wall adapter that plugs into the Argon.

Temperature Sensor

Temperature Sensor Placement

Additional Temperature Sensor Placement

This is a picture of the temperature sensor placement from a different dryer.

Argon Current Sensor

Current Sensor

This is the schematic for the DFRobot SENO211 which is a gravity; analog AC current sensor connected to the Particle Argon. The SENO211 has three pins, the blue wired pin is connected to the A2 analog to digital input pin on the Argon, the red wired pin is connected to the 3.3V positive pin on the argon, and the final black wired pin is connected to the ground pin on the Argon. Then there is a WIFI antenna connected to the Argon's antenna jack. Lastly, the whole circuit is powered by a micro-USB cable and wall adapter that plugs into the Argon.

Current Sensor Placement

This is a picture of the current sensor placed in the circuit breaker measuring the current from the dryer.

Thingspeak Data

Data collected from the temperature and current sensor during a small test run with a dryer.

Code

Dryer Temp

C/C++
This is the code that uploads the dryer's temperature to the thingspeak page
// This #include statement was automatically added by the Particle IDE.
#include <Adafruit_DHT.h>

#define DHTPIN D2
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  dht.begin(); // initialize the sensor
  
   // Subscribe to the integration response event
  Particle.subscribe("hook-response/Temperature", myHandler, MY_DEVICES);
  Particle.subscribe("Current", AC, MY_DEVICES); // subscribe to the current sensor
  pinMode(D7, OUTPUT);
}

void myHandler(const char *event, const char *data) {
  // Handle the integration response
}
void  AC(const char *event, const char *data){
       digitalWrite(D7,HIGH); // turn on the D7 LED whenever data is being sent
}

void loop() {
    
  // read temperature as Celsius
  float tempC = dht.getTempCelcius();
  // read temperature as Fahrenheit
  float tempF = dht.getTempFarenheit();


    Serial.print("Temperature: ");
    Serial.print(tempC);
    Serial.print("°C ~ ");
    Serial.print(tempF);
    Serial.println("°F");
  // Get some data
  String data = String(tempF);
  String Celsius = String(tempC);
  
  // Trigger the integration
  Particle.publish("Temperature", data, PRIVATE);
  // Wait 20 seconds
  delay(20000);
}

Current Sensor

C/C++
This is the code that runs the current sensor
const int ACPin = A2;         //set argon signal read pin
#define ACTectionRange 20;    //set Non-invasive AC Current Sensor tection range (5A,10A,20A)

// VREF: Analog reference
// For Argon UNO, Leonardo and mega2560, etc. change VREF to 5
// For Argon Zero, Due, MKR Family, ESP32, etc. 3V3 controllers, change VREF to 3.3
#define VREF 5.0

float readACCurrentValue()
{
  float ACCurrtntValue = 0;
  float peakVoltage = 0;  
  float voltageVirtualValue = 0;  //Vrms
  for (int i = 0; i < 5; i++)
  {
    peakVoltage += analogRead(ACPin);   //read peak voltage
    delay(1);
  }
  peakVoltage = peakVoltage / 5;   
  voltageVirtualValue = peakVoltage * 0.707;    //change the peak voltage to the Virtual Value of voltage

  /*The circuit is amplified by 2 times, so it is divided by 2.*/
  voltageVirtualValue = (voltageVirtualValue / 1024 * VREF ) / 2;  

  ACCurrtntValue = voltageVirtualValue * ACTectionRange;

  return ACCurrtntValue;
  int AC = ACCurrtntValue;
}

void setup() 
{
    // Subscribe to the integration response event
    Particle.subscribe("hook-response/Current", myHandler, MY_DEVICES);
    Particle.subscribe("Temperature", tempF, MY_DEVICES);
    pinMode(D7, OUTPUT);
}

void myHandler(const char *event, const char *data) {
  // Handle the integration response
}
void tempF(const char *event, const char *data){
       digitalWrite(D7,HIGH);
}       

void loop() 
{
  float ACCurrentValue = readACCurrentValue(); //read AC Current Value
  Serial.print(ACCurrentValue);
  // trigger the integration
  Particle.publish("Current", String(ACCurrentValue), PRIVATE);
  Serial.println(" A");
  // wait 20 seconds
  delay(20000);
}

Adafruit_DHT.ccp

C/C++
This is the code from the Adafruit particle library that runs the DHT11 temperature/humidity sensor
/* DHT library 
 *
 * MIT license
 * written by Adafruit Industries
 * modified for Spark Core by RussGrue
 * */

#include "Adafruit_DHT.h"

DHT::DHT(uint8_t pin, uint8_t type, uint8_t count) {
	_pin = pin;
	_type = type;
	_count = count;
	firstreading = true;
}

void DHT::begin(void) {
// set up the pins!
	pinMode(_pin, INPUT);
	pinSetFast(_pin);
	_lastreadtime = 0;
}

float DHT::readTemperature() {
	float f;

	if (read()) {
		switch (_type) {
			case DHT11:
				f = data[2];
				return f;
			case DHT22:
			case DHT21:
				f = data[2] & 0x7F;
				f *= 256;
				f += data[3];
				f /= 10;
				if (data[2] & 0x80)
					f *= -1;
				return f;
		}
	}
	return NAN;
}

float DHT::getHumidity() {
	return readHumidity();
}

float DHT::getTempCelcius() {
	return readTemperature();
}

float DHT::getTempFarenheit() {
	return convertCtoF(readTemperature());
}

float DHT::getTempKelvin() {
	return convertCtoK(readTemperature());
}

float DHT::getHeatIndex() {
	return convertFtoC(computeHeatIndex(convertCtoF(readTemperature()), readHumidity()));
}

float DHT::getDewPoint() {
	return computeDewPoint(readTemperature(), readHumidity());
}

float DHT::convertFtoC(float f) {
	return (f - 32) * 5 / 9;
}

float DHT::convertCtoF(float c) {
	return c * 9 / 5 + 32;
}

float DHT::convertCtoK(float c) {
	return c + 273.15;
}

float DHT::readHumidity(void) {
	float f;

	if (read()) {
		switch (_type) {
			case DHT11:
				f = data[0];
				return f;
			case DHT22:
			case DHT21:
				f = data[0];
				f *= 256;
				f += data[1];
				f /= 10;
				return f;
		}
	}
	return NAN;
}

float DHT::computeHeatIndex(float tempFahrenheit, float percentHumidity) {
// Adapted from equation at: https://github.com/adafruit/DHT-sensor-library/issues/9 and
// Wikipedia: http://en.wikipedia.org/wiki/Heat_index
	return -42.379 + 
		 2.04901523 * tempFahrenheit + 
		10.14333127 * percentHumidity +
		-0.22475541 * tempFahrenheit * percentHumidity +
		-0.00683783 * pow(tempFahrenheit, 2) +
		-0.05481717 * pow(percentHumidity, 2) + 
		 0.00122874 * pow(tempFahrenheit, 2) * percentHumidity + 
		 0.00085282 * tempFahrenheit * pow(percentHumidity, 2) +
		-0.00000199 * pow(tempFahrenheit, 2) * pow(percentHumidity, 2);
}

float DHT::computeDewPoint(float tempCelcius, float percentHumidity) {
	double a = 17.271;
	double b = 237.7;
	double tC = (a * (float) tempCelcius) / (b + (float) tempCelcius) + log( (float) percentHumidity / 100);
	double Td = (b * tC) / (a - tC);
	return Td;
}

boolean DHT::read(void) {
	uint8_t laststate = HIGH;
	uint8_t counter = 0;
	uint8_t j = 0, i;
	unsigned long currenttime;

// Check if sensor was read less than two seconds ago and return early
// to use last reading.
	currenttime = millis();
	if (currenttime < _lastreadtime) {
// ie there was a rollover
		_lastreadtime = 0;
	}
	if (!firstreading && ((currenttime - _lastreadtime) < 2000)) {
		return true; // return last correct measurement
//		delay(2000 - (currenttime - _lastreadtime));
	}
	firstreading = false;
/*
	Serial.print("Currtime: "); Serial.print(currenttime);
	Serial.print(" Lasttime: "); Serial.print(_lastreadtime);
*/
	_lastreadtime = millis();

	data[0] = data[1] = data[2] = data[3] = data[4] = 0;
  
// pull the pin high and wait 250 milliseconds
	pinSetFast(_pin);
	delay(250);

// now pull it low for ~20 milliseconds
	pinMode(_pin, OUTPUT);
	pinResetFast(_pin);
	delay(20);
	noInterrupts();
	pinSetFast(_pin);
	delayMicroseconds(40);
	pinMode(_pin, INPUT);

// read in timings
	for ( i=0; i< MAXTIMINGS; i++) {
		counter = 0;
		while (pinReadFast(_pin) == laststate) {
			counter++;
			delayMicroseconds(1);
			if (counter == 255) {
				break;
			}
		}
		laststate = pinReadFast(_pin);

		if (counter == 255) break;

// ignore first 3 transitions
		if ((i >= 4) && (i%2 == 0)) {
// shove each bit into the storage bytes
			data[j/8] <<= 1;
			if (counter > _count)
				data[j/8] |= 1;
			j++;
		}
	}

	interrupts();

/*
	Serial.println(j, DEC);
	Serial.print(data[0], HEX); Serial.print(", ");
	Serial.print(data[1], HEX); Serial.print(", ");
	Serial.print(data[2], HEX); Serial.print(", ");
	Serial.print(data[3], HEX); Serial.print(", ");
	Serial.print(data[4], HEX); Serial.print(" =? ");
	Serial.println(data[0] + data[1] + data[2] + data[3], HEX);
*/

// check we read 40 bits and that the checksum matches
	if ((j >= 40) && 
	   (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) ) {
		return true;
	}
 
	return false;

}

Adafruit_DHT.h

C/C++
This is more code from the Adafruit particle library that allows the DHT11 sensor to be read and converted particle coding page
/* DHT library 
 *
 * MIT license
 * written by Adafruit Industries
 * modified for Spark Core by RussGrue
 * */

#ifndef DHT_H
#define DHT_H

#include "application.h"
#include "math.h"

// how many timing transitions we need to keep track of. 2 * number bits + extra
#define MAXTIMINGS 85

#define DHT11 11
#define DHT22 22
#define DHT21 21
#define AM2301 21

class DHT {
	private:
		uint8_t data[6];
		uint8_t _pin, _type, _count;
		unsigned long _lastreadtime;
		boolean firstreading;
		float readTemperature();
		float convertFtoC(float);
		float convertCtoF(float);
		float convertCtoK(float);
		float computeHeatIndex(float tempFahrenheit, float percentHumidity);
		float computeDewPoint(float tempCelcius, float percentHumidity);
		float readHumidity(void);
		boolean read(void);

	public:
		DHT(uint8_t pin, uint8_t type, uint8_t count=6);
		void begin(void);
		float getHumidity();
		float getTempCelcius();
		float getTempFarenheit();
		float getTempKelvin();
		float getHeatIndex();
                float getDewPoint();

};
#endif

Credits

Andrew Collins

Andrew Collins

1 project • 0 followers
Stewart Spain

Stewart Spain

0 projects • 0 followers
I'm a junior engineering student at UNCC

Comments