/* Arduino 1.8.1 Program för att mäta aktuell uttagen effekt från husets elmätare genom att detektera frekvensen av den blinkande lysdioden på elmätaren. På min elmätare blinkar dioden 10.000ggr per kWh Det finns även elmätare med 1.000 pulser per kWh. Genom att mäta tiden mellan pulserna med hjälp av den interna ms-räknaren (millis) så kan vi kalkylera en PWM utgång till ett instrument- På en annan utgång styr vi ett servo som med en visare på axeln visar mellan 0-180 grader 0 till 10kW Nu visas oxo effekten på en OLED display Det är lite trögt att skriva till displayen Därför mätes tiden över 2 pulser, vilket ger gott om tid för att uppdatera displayen Dessutom blir det inte så fladdriga siffror SM7UCZ/ Johnny Apell 20161109, 20161115, 20161120 20170119 rensat bort display o annat för ett basic program */ unsigned long timecalc=0; // innehåller aktuell mätvärde i ms unsigned long Puls_old=millis(); // innehåller gamla mätvärdet i ms unsigned long Puls_new=millis(); // innehåller nya mätvärdet i ms unsigned long Power=0; // innehåller mätvärdet i Watt medelvärdesberäknat unsigned long Pow=0; // innehåller mätvärdet i Watt volatile int i=0; // räknaren i interruptrutinen int z; // mätvärdet till servot i grader int y; // mätvärdet till visarinstrumentet PWM int interruptPin = 2; // interruptingången från elmätaren int Instrument = 11; // PWM-utgång int Kalibr = 12; // kalibr instr int LED = 13; // hjälpflaggan på LED-pinnen String Power_now = ""; // Strängen till dispayen med effekten //**************************************************************************************** void setup(){ pinMode(interruptPin, INPUT_PULLUP); // Interruptingången sätt pullup pinMode(Kalibr, INPUT_PULLUP); // Interruptingången sätt pullup pinMode (LED,OUTPUT); // LED-pinnen som output och flagga attachInterrupt(digitalPinToInterrupt(interruptPin), fire, RISING); // Pin 2 puls input } // ändra RISING till FALLING vid LDR sensor //*************************************************************************************** void loop() { if (digitalRead(LED)==HIGH ){ // Kolla om LED-flaggan är tänd och kör nedanstående // endast en gång efter LED TILL timecalc = Puls_new - Puls_old; // beräkna tidsskillnaden från förra pulsen Puls_old = Puls_new; // spara ms räknaren till nästa beräkning } else { return;} // om ingen interrupt... gör inget if (timecalc >30 && timecalc < 30000){ // kolla om det är "verkliga värden" från pulserna Power = 3600UL * 500UL / timecalc; // kalkylera effekten i Watt (5000UL vid 1000 pulsers mätare) // OBS tiden för 5 pulser //**************************** Skriv till Instrumentet ******************************************' y = map(Power,0,10000, 0, 255); // mappa mätvärdet så att det passar PWM till instrumentet analogWrite(Instrument, y); // skriv det beräknade PWM-värdet till instrumentet utgång 11 if (digitalRead(Kalibr)==LOW ){ // Kolla om LED-flaggan är tänd och kör nedanstående analogWrite(Instrument, 255);} // Aktivera vid intrimning av instrumentet til max } digitalWrite (LED,LOW); // släck LED så att rutinen inte körs fler ggr innan ny interrupt } //********************* Interruptrutinen *********************************************************' void fire() { // Interrupt routine när lysdioden på mätaren blinkar i=i+1; // spara 5 pulser innan kalkyleringen if (i>=5){ // kolla om vi har fem pulser?? Puls_new = millis(); // spara då millis räknaren digitalWrite (LED,HIGH); // tänd LED som flagga TILL Vi har mätvärde att bearbeta! i=0; // nollställ räknaren } } //************************************************************************************************