/* 10,11,12,13 - Ehternet HC-SR04 Ping distance sensor: VCC to arduino 5v GND to arduino GND Echo to Arduino pin 7 Trig to Arduino pin 8 This sketch originates from Virtualmix: http://goo.gl/kJ8Gl Has been modified by Winkle ink here: http://winkleink.blogspot.com.au/2012/05/arduino-hc-sr04-ultrasonic-distance.html And modified further by ScottC here: http://arduinobasics.blogspot.com/ on 10 Nov 2012. ----------------------------------- 2015-01-11 www.automatiserar.se Ändrad och skapat av Markus Jakobsson Gjorde om till funktioner istället för att köra det i loopen direkt. Returnerar nu ett värde som är 0-100 % baserat på PelletsMaxNiva, dvs har du 60 cm till din pellets från ping sensorn så är 0% 60 cm från givaren och 100% vid givaren. Funktionen rapporterar nu in till en vera med förutbestämmd intervall. */ #include #include #define echoPin 7 // Echo Pin #define trigPin 8 // Trigger Pin // Mac på kortet. char server[] = "DittVeraIP"; // namnet på din vera. byte mac[] = { 0xDE, 0xBB, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(10,10,10,123); // ange ip du vill ha på arduinon. EthernetClient client; int serverPort = 3480; // vilken port ska man rapportera in på float loopDelay = 900000; // hur många ms loopen ska vänta innan man åter skickar ett värde. 900000 = 15 minuter mellan uppdateringarna. int maximumRange = 200; // Maximum range needed int minimumRange = 0; // Minimum range needed int pelletsStatus = 0; // anger hur många CM pellets som är kvar. float PelletsMaxNiva = 60.0; // du måste ange detta med .0 eftersom jag räknar med float längre ner! detta är hur många cm ner tills det är tomt på pellets. long duration, distance; // Duration used to calculate distance void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); // no point in carrying on, so do nothing forevermore: // try to congifure using IP address instead of DHCP: Ethernet.begin(mac, ip); } // give the Ethernet shield a second to initialize: delay(1000); Serial.println("Nu ska Ethernet vara klar..."); } void loop() { int pelletsStatus = 0; // nollar alltid resultatet. pelletsStatus = checkPelletsStatus(); if (pelletsStatus == 200){ Serial.println("vardet som mottogs va felande!"); } else { Serial.print("Du har "); Serial.print(pelletsStatus); Serial.println("% pellets kvar"); // Här ska man lägga till Ethernet funktion nu för att rapportera till veran. httpLjusRegister(71, pelletsStatus); // Skickar data till veran. } //Delay för att inte skicka värden för ofta. delay(loopDelay); } // Funktion för att kolla hur mycket pellets det finns kvar. int checkPelletsStatus() { //Serial.println("Function - checkPelletsStatus:"); digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); //Calculate the distance (in cm) based on the speed of sound. distance = duration/58.2; if (distance >= maximumRange || distance <= minimumRange){ // skriv ut en varning Serial.println("Unable to measure"); // här ska man skicka tillbaka en varning } else { // skickar nu hur många cm det va kvar om allt gick ok. //Serial.print("[checkPelletsStatus] - Du har nu "); //Serial.print(distance); //Serial.println(" CM pellets"); float PelletsProcent = distance / PelletsMaxNiva * 100; //Serial.print("[checkPelletsStatus] - PelletsProcent: "); //Serial.println(PelletsProcent); int pelletsProcentStatus = floor(PelletsProcent * 100) / 100; //Serial.print(pelletsProcentStatus); //Serial.println("% pellets ej reversed"); //Serial.print((100 - pelletsProcentStatus)); //Serial.println("% pellets reversed"); int Procentkvar = (100 - pelletsProcentStatus); //Serial.print("[checkPelletsStatus]::Procentkvar = "); //Serial.println(Procentkvar); if (Procentkvar >= 0 && Procentkvar <= 100){ Serial.print("[checkPelletsStatus] - Value OK, 0% - 100% = "); Serial.println(Procentkvar); return Procentkvar; } else { Serial.print("[checkPelletsStatus] - Value greater or less than 0 - 100% = "); Serial.println(Procentkvar); return 200; // detta returnerar ett värde man ska kolla efter. } } } //////// funktion skicka information till vera // Givarid = ditt id i vera MittValue = vad den ska uppdatera // Denna ska uppdatera enbart Temperatur ! void httpLjusRegister(int GivarID, int MittValue) { // if there's a successful connection: if (client.connect(server, serverPort)) { Serial.println("Kopplar upp..."); // send the HTTP PUT request: client.print("GET /data_request?id=variableset&DeviceNum="); client.print(GivarID); client.print("&serviceId=urn:micasaverde-com:serviceId:LightSensor1&Variable=CurrentLevel&Value="); client.print(MittValue); client.println(" HTTP/1.1"); client.print("Host: "); client.println(server); client.println("Connection: close"); client.println(); Serial.println("skickade procent pellets till Vera, kopplar ner"); client.stop(); } else { // if you couldn't make a connection: Serial.println("connection failed"); Serial.println("disconnecting."); client.stop(); } }