OnTrue
// A "return true;" statement at any point of this code block, will cause the program to run.
// For manually activated program, just leave a "return false" statement here.
Program.Setup(()=>
{
// set the widget that will display this program data (the temperature,luminance).
Program.AddControlWidget("homegenie/generic/sensor");
// set a configuration parameter
//Program.AddInputField("PollFrequency", "10", "Pause between updates (seconds)");
// initialize program parameters
Program.Parameter("Sensor.Humidity").Value = "";
Program.Parameter("Sensor.Temperature").Value = "";
Program.Parameter("Sensor.TemperatureF").Value = "";
Program.AddInputField("UpdateInterval", "600", "Update Interval (seconds)");
// it makes program to respond to webservices calls:
// - http://<hg_address>/api/EmbeddedSystems.Raspberry/DHT22/Sensor.Temperature
When.WebServiceCallReceived("EmbeddedSystems.Raspberry/DHT22/Sensor.Temperature", ( args ) =>
{
return "{ 'ResponseValue' : '" + Program.Parameter("Sensor.Temperature").Value + "' }";
});
// - http://<hg_address>/api/EmbeddedSystems.Raspberry/DHT22/Sensor.Humidity
When.WebServiceCallReceived("EmbeddedSystems.Raspberry/DHT22/Sensor.Humidity", ( args ) =>
{
return "{ 'ResponseValue' : '" + Program.Parameter("Sensor.Humidity").Value + "' }";
});
}); // end program setup
return true;
// it makes program to respond to webservices calls:
// - http://<hg_address>/api/Components.DHT22/0/Sensor.Temperature
When.WebServiceCallReceived("Components.DHT22/0/Sensor.Temperature", ( args ) =>
{
return "{ 'ResponseValue' : '" + Program.Parameter("Sensor.Temperature").Value + "' }";
});
// - http://<hg_address>/api/Components.DHT22/0/Sensor.Humidity
When.WebServiceCallReceived("Components.DHT22/0/Sensor.Humidity", ( args ) =>
{
return "{ 'ResponseValue' : '" + Program.Parameter("Sensor.Humidity").Value + "' }";
});
int[] data = new int[5];
var irpin = ConnectorPin.P1Pin7.ToProcessor();
MemoryGpioConnectionDriver driver = new MemoryGpioConnectionDriver();
while (Program.IsEnabled)
{
driver.Allocate(irpin, PinDirection.Output);
driver.Write(irpin, true);
//Pause(5);
for(int a = 0; a < 30; a++)
{
driver.Allocate(irpin, PinDirection.Output);
driver.Write(irpin, false);
Pause(0.0018);
//Pause(0.0006);
//driver.Write(irpin, true);
//Pause(0.001);
//
driver.Allocate(irpin, PinDirection.Input);
//
int i = 0;
data = new int[5];
int j = 0;
int counter = 0;
bool laststate = true;
//
// detect change and read data
for ( i=0; i<= 85; i++) {
counter = 0;
while (driver.Read(irpin) == laststate) {
//Raspberry.Timers.HighResolutionTimer.Sleep(0.000001m);
if (++counter == 255) {
break;
}
}
laststate = driver.Read(irpin);
//Console.WriteLine(i);
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 > 40)
data[j/8] |= 1;
j++;
}
}
//
//Program.Notify("DHT-22", "J = " + j.ToString());
if ((j >= 40) && (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) )
{
//data[2] = data[2] - 3; // temperature adjustment, due to heat excess inside the HG box
//double f = data[2] * 9D / 5D + 32;
//double f = temperatura + decimale/10;
//Console.WriteLine("\n\nHumidity = {0}.{1} %\nTemperature = {2}.{3} *C ({4} *F)\n\n",
// data[0], data[1], data[2], data[3], f);
//data[0] = (data[0] )/10;
int umidita =((data[0]<<8) + data[1])/10;
int decumid = ((data[0]<<8) + data[1]) - umidita*10;
//var hum = data[0] + "." + data[1];
//var hum = (data[0] * 256 + data[1])/10;
var hum = umidita + "." + decumid;
int moltiplicatore =1;
if (data[2] > 128)
{
moltiplicatore = -1;
data[2] = data[2] - 128;
}
int temperatura =((data[2]<<8)+data[3])/10;
int decimale = ((data[2]<<8)+data[3]) - temperatura*10;
//data[2] = ((data[2]<<8)+data[3]);
//data[2] /= 10;
var tempc = (moltiplicatore * temperatura) + "." + decimale;
//var tempc = data[2] + ".." + data[4];
var tempf = ((temperatura + decimale/10) * 9D / 5D + 32).ToString();
//if (hum != Program.Parameter("Sensor.Humidity").Value)
{
Program.RaiseEvent("Sensor.Humidity", hum, "DHT-22 Sensor");
}
//if (tempc != Program.Parameter("Sensor.Temperature").Value)
{
Program.RaiseEvent("Sensor.TemperatureF", tempf, "DHT-22 Sensor");
Program.RaiseEvent("Sensor.Temperature", tempc, "DHT-22 Sensor");
}
break;
}
else
{
//Console.WriteLine(j + ") Data not good, skip\n");
Pause(2);
}
}
//
//Console.WriteLine(data[0]);
//Console.WriteLine(data[1]);
//Console.WriteLine(data[2]);
//Console.WriteLine(data[3]);
//Console.WriteLine(data[4]);
//
var pause = Program.InputField("UpdateInterval").DecimalValue;
if (pause == 0) pause = 600; // default pause is 10 minutes
Pause(pause);
}
[]
true
true
HomeAutomation.HomeGenie.Automation
70
DHT-22 Sensor
Temperature and Humidity sensing using DHT-22.
For wirings see http://www.homegenie.it/docs/doityourself.php .
Raspberry Pi
2014-11-05T22:17:40.217125Z
2014-11-05T22:17:40.764971Z
CSharp
true