#Codes for sensing and uploading data to Thingspeak.com
// include libraries
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#define SensorPin A0
int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2
//Temperature chip i/o
OneWire ds(DS18S20_Pin); // on digital pin 2
// Local Network Settings
byte mac []= { 0x9C, 0xA2, 0xDA, 0x0F, 0xAB, 0x6A };// Must be unique on local network, You can find it looking at EthernetShield bottom side (White sticker)
// ThingSpeak Settings
char thingSpeakAddress[] = "api.thingspeak.com";
String writeAPIKey = "4HFALLKGZG1JOHED"; // After signing in to Thingspeak you get your own unike API key
unsigned long updateThingSpeakInterval = 20000; // Time interval in milliseconds to update ThingSpeak
unsigned long SensorReadInterval = 5000; // Time interval in milliseconds to update SensorData
// Variable Setup
unsigned long lastConnectionTime = 0;
boolean lastConnected = false;
int failedCounter = 0;
unsigned long lastReadTime = 0;
int HIH4030_Pin = A0; //Voltage output from HIH sensor is connected to analog pin A0
long relativeHumidity = 0;
long temperature = 0;
long dewpoint = 0;
float ph_value;
float voltage;
char buffer[10];
// Initialize Arduino Ethernet Client
EthernetClient client;
void setup()
{
// Start Serial for debugging on the Serial Monitor
Serial.begin(9600);
// Initializes the ethernet library and network settings on Arduino (call funtion "startethernet")
startEthernet();
}
void loop()
{
// Read sensor value according set SersorReadInterval
if((millis() - lastReadTime > SensorReadInterval))
{
temperature = getTemp();
}
voltage=analogRead(SensorPin);
voltage=voltage*5/1024;
ph_value=-5.8029*voltage+25.5511;
// Greate string for transmitting value to Thingspeak
String Field1_Value = dtostrf(ph_value, 7,2,buffer);
String Field2_Value = String(temperature,DEC);
String Field3_Value = String(dewpoint,DEC);
// Print Update = Response to Serial Monitor
// Print Update Response to Serial Monitor
if (client.available())
{
char c = client.read();
Serial.print(c);
}
// Disconnect from ThingSpeak
if (!client.connected() && lastConnected)
{
Serial.println("...disconnected");
Serial.println();
client.stop();
}
// Update ThingSpeak
if(!client.connected() && (millis() - lastConnectionTime > updateThingSpeakInterval))
{
updateThingSpeak("field1="+Field1_Value+"&field2="+Field2_Value+"&field3="+Field3_Value);
}
// Check if Arduino Ethernet needs to be restarted
if (failedCounter > 3 ) {startEthernet();}
lastConnected = client.connected();
}
// FUNCTIONS
///Tähän antureiden funktiot
// Update Thingspeak channel
void updateThingSpeak(String tsData)
{
// Sent REST command to update channel eg."https://api.thingspeak.com/update?api_key=YOUR_CHANNEL_API_KEY&field1=7 "
if (client.connect(thingSpeakAddress, 80))
{
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: "+writeAPIKey+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(tsData.length());
client.print("\n\n");
client.print(tsData);
lastConnectionTime = millis();
if (client.connected())
{
Serial.println("Connecting to ThingSpeak...");
Serial.println();
failedCounter = 0;
}
else
{
failedCounter++;
Serial.println("Connection to ThingSpeak failed ("+String(failedCounter, DEC)+")");
Serial.println();
}
}
else
{
failedCounter++;
Serial.println("Connection to ThingSpeak Failed ("+String(failedCounter, DEC)+")");
Serial.println();
lastConnectionTime = millis();
}
}
// Initialize the ethernet library and network settings.
void startEthernet()
{
client.stop();
Serial.println("Connecting Arduino to network...");
Serial.println();
delay(1000);
// Connect to network and obtain an IP address using DHCP
if (Ethernet.begin(mac) == 0)
{
Serial.println("DHCP Failed, reset Arduino to try again");
Serial.println();
}
else
{
Serial.println("Arduino connected to network using DHCP");
Serial.println();
}
delay(1000);
}
float getTemp(){
//returns the temperature from one DS18S20 in DEG Celsius
byte data[12];
byte addr[8];
if ( !ds.search(addr)) {
//no more sensors on chain, reset search
ds.reset_search();
return -1000;
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return -1000;
}
if ( addr[0] != 0x10 && addr[0] != 0x28) {
Serial.print("Device is not recognized");
return -1000;
}
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end
byte present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for (int i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
ds.reset_search();
byte MSB = data[1];
byte LSB = data[0];
float tempRead = ((MSB << 8) | LSB); //using two's compliment
float TemperatureSum = tempRead / 16;
return TemperatureSum;
}
No comments:
Post a Comment