Teade

Collapse

Foorumi reeglid.

Foorumi reeglistik on uuendatud. Palume tutvuda ja arvesse võtta.
See more
See less

Probleem analoogtermoanduriga (DIY keskkütte automaatika)

Collapse
X
 
  • Filter
  • Kellaaeg
  • Show
Clear All
new posts

    Probleem analoogtermoanduriga (DIY keskkütte automaatika)

    Nokitsen siis hetkel kesküttele automaatika tegemisega ning ei suuda paarist anomaaliast jagu saada. Automaatika ise lülitab pumpasid sisse välja vastavalt temperatuurile.

    Mikrokontroller mis asja juhib on Spark Core (Arduino sarnane). https://www.spark.io/

    Anomaaliaid paistab põhjustavat AD8495 thermocouple amp kus taga on K-type thermocouple mis mõõdab korstnasse mineva gaasi tempi.


    Minu plaat on ainult smd komponentidega.

    AD8495 plaadile jootsin eile juurde 100uf ning 100nf konded toitele ning spark core juures tõmbasin sensori juhtmed läbi ferritrõnga. Spark core juures on Sissetuleva signaali juhtme ning maanduse vahele 22uf konde ning 30kohm pulldown takisti (LM35 analog temp andurid on selle lahendusega ilusti stabiilsed). Neind on hetkel 2tk taga. Üks mõõdab toa ning teine radikasse mineva vee tempi.
    Kaabeldus Spark core ja AD8495 vahel on CAT5, pikkuseks 2m. Thermocouple juhe on 1m ning see on varjestatud ning maandatud.

    Anomaaliad on sellised: https://thingspeak.com/channels/20611 (field 3 chart aka korstna temp). Arusaamatud temp spiked (tegelikult temp ei muutu). Andmed uploaditakse iga 4 min järel ning mõõdetakse vahetult enne saatmist. Väärtus on 100 mõõtmise keskmine.

    Ideid?

    Õhtul katsun pilte vms lisada.

    #2
    Vs: Probleem analoogtermoanduriga (DIY keskkütte automaatika)

    Ilma täieliku süvenemiseta, pakun välja proovida:

    Tõmba sisend kontrolleri poolt täiesti maha, kas siis logib pikas perspektiivis kindlalt nulli?
    Sama toimimine kui on toitesse tõmmatud.
    Ja siis sama protseduuri anduri otsast vaadatuna, las konverter teeb oma tööd edasi.
    100 keskmine võiks ju olla ok, aga äkki mõõdad liiga tihti? Väike viide kahe mõõtmise vahele vms.
    Midagi võiks selguda.
    Erilahendused.
    PS või mail.

    Comment


      #3
      Vs: Probleem analoogtermoanduriga (DIY keskkütte automaatika)

      Kas sul keskmistamata mõõtmiste aegrida ei ole?

      Comment


        #4
        Vs: Probleem analoogtermoanduriga (DIY keskkütte automaatika)

        Lisasin paar tabelit juurde.

        Radika pump ja katla pump näitab seda millal antud pumbad töötavad (vastavalt 0 või 1).

        Analog pin 6 (NC) on defineeritud koodis INPUT_PULLDOWN (st sisend ning ~30k vms takisti vastu maad - mikrokontrolleri oma takisti). Mingit juhet sinna taha ei lähe. (teoorias peaks see ilusti nullis jooksma, kuid ei jookse).

        Pliidi vee temp on samuti koodis INPUT_PULLDOWN. Seal on jupp juhet taga ning 22uf konde ning 47k takisti mis läheb vastu maad. (teoosrias peaks nullis jooksma, kuid 18.00 paiku on anomaalia). Andurit seal taga ei ole, plaanis panna, kui asi stabiilselt tööle saada.

        Toa temp - Sama mis eelnev, kuid LM35 andur taga. 18.00 paiku samuti anomaalia.

        Kui defineerida sisend lihtsalt input ning lugeda selle väärtust siis ujub (kõigi sisendite puhul) see 160mV kandis (seda ma proovisin alguses veel kui midagi taga ei olnud ning asi laual oli).

        2 päeva olid taga muidu ainult Radika temp ning Toa temp (lm35). Siis anomaaliaid ei täheldanud, tundub ,et kui andureid rohkem lisada läheb lolliks.

        Analog pin 6 (NC) on mingi seaos ka pumba tööga, kui pump on sees, siis on selle väärtus madalam.

        Üldiselt tahab analoogsisend töötada vahepeal analoogväljundina :/

        Ilma keskmisteta (tarkvaralise silmumiseta) on väärtused stabiilsed, kõikumine max 0,5C (AD8495 taga paar C).

        Hetke kood ka:
        Kood:
        // This #include statement was automatically added by the Spark IDE.
        #include "TimeAlarms/TimeAlarms.h"
        
        // This #include statement was automatically added by the Spark IDE.
        #include "analogSmooth.h"
        
        // This #include statement was automatically added by the Spark IDE.
        #include "OneWire/OneWire.h"
        
        // This #include statement was automatically added by the Spark IDE.
        
        
        
        
        
        
        #include "LiquidCrystal_I2C.h"
        //#include "SparkTime/SparkTime.h" 
        
        
        
        String writeAPIKey = "x";
        String channelID = "20611";
         
        // TCP socket initialize
        TCPClient client;
        
        int ledRed = A0; //if ON then indicates that there is 230V present and boiler pump is OFF
        int ledGreen = A1; // is ON then boiler pump is ON
        
        int radikatemp = A2;
        int toatemp = A3;
        int pliiditemp = A4;
        int pliidiveetemp = A5;
        int xtemp = A6;
        
        int relayRadiator = D2; //relay to turn ON/OFF radiator pump
        int relayBoiler = D3; // relay to turn ON/OFF boiler pump.
        
        
        
        int c = 0;
        int d = 0;
        
        LiquidCrystal_I2C *lcd;
        UDP UDPClient;
        
        String timeStr;
        
        AnalogSmooth as100 = AnalogSmooth(100);
        AnalogSmooth as101 = AnalogSmooth(100);
        AnalogSmooth as102 = AnalogSmooth(100);
        AnalogSmooth as103 = AnalogSmooth(100);
        
        float radikaC = 0.0;
        float toaC = 0.0;
        float pliidiC = 0.0;
        float pliidiveeC = 0.0;
        float xtempC = 0.0;
        
        void setup(){
            
            Time.zone(+2);
            Alarm.alarmRepeat(8,30,0, MorningAlarm);  // 8:30am every day
            Alarm.alarmRepeat(17,45,10,EveningAlarm);  // 5:45pm every day 
            Alarm.alarmRepeat(dowSaturday,8,30,30,WeeklyAlarm);  // 8:30:30 every Saturday 
             
            Alarm.timerRepeat(300, Repeats);   
            Alarm.timerRepeat(400, Repeats2);// timer for every 15 seconds    
            Alarm.timerOnce(10, OnceOnly);             // called once after 10 seconds 
                
            Serial.begin(9600);
        
            lcd = new LiquidCrystal_I2C(0x27, 20, 4); // set the LCD address to 0x20 for a 16x2 //SparkCore bug, address is actually 27 but shifted (0x27*2)
            lcd->init(); // initialize the lcd
            lcd->backlight();
            lcd->clear();
            
            pinMode(radikatemp, INPUT_PULLDOWN);
            pinMode(toatemp, INPUT_PULLDOWN);
            pinMode(pliiditemp, INPUT_PULLDOWN);
            pinMode(pliidiveetemp, INPUT_PULLDOWN);
            pinMode(xtemp, INPUT_PULLDOWN);
            
            pinMode(ledRed, OUTPUT);
            pinMode(ledGreen, OUTPUT);
            pinMode(relayRadiator, OUTPUT);
            pinMode(relayBoiler, OUTPUT);
            
         
            digitalWrite(relayRadiator, LOW);
            digitalWrite(relayBoiler, LOW);
            analogWrite(ledRed,150);
            }
            
        
        void loop(){
        
        
            radikaC = (as100.analogReadSmooth(radikatemp) * 3.3) / 4095*100;  //getting the voltage reading from the temperature sensor
            toaC = (as101.analogReadSmooth(toatemp) * 3.3) / 4095*100;
            pliidiC = (as102.analogReadSmooth(pliiditemp) * 3.3) / 4095*200;
            pliidiveeC = (analogRead(pliidiveetemp) * 3.3) / 4095*100;
            xtempC = (analogRead(xtemp) * 3.3) / 4095*100;
            
            lcd->setCursor(1,0);
            lcd->print("Korsten");
            lcd->setCursor(11,0);
            lcd->print(pliidiC, 1);
            lcd->setCursor(1,1);
            lcd->print("Radikasse");
            lcd->setCursor(11,1);
            lcd->print(radikaC, 1);
            lcd->setCursor(1,2);
            lcd->print("Toatemp");
            lcd->setCursor(11,2);
            lcd->print(toaC, 1);  
            lcd->setCursor(1,3);
            lcd->print("Pliita");
            lcd->setCursor(11,3);
            lcd->print(pliidiveeC, 1);
            
           c = tempkontroll(radikaC, toaC, c);
           d = tempkontroll2(pliidiC, pliidiveeC, d); 
        
           Alarm.delay(1000); 
        
        } 
         
        void ThingSpeakUpdate(String tsData)
        {
            Serial.println("Date string: " + tsData);
             
            Serial.println("...Connecting to Thingspeak");
             
            // Connecting and sending data to Thingspeak
            if(client.connect("api.thingspeak.com", 80))
            {
                Serial.println("...Connection succesful, updating datastreams");
                 
                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.println(tsData); //the ""ln" is important here.
             
                // This delay is pivitol without it the TCP client will often close before the data is fully sent
                delay(250);
                 
                Serial.println("Thingspeak update sent.");
            }
            else{
                // Failed to connect to Thingspeak
                Serial.println("Unable to connect to Thingspeak.");
            }
             
            if(!client.connected()){
                client.stop();
            }
            client.flush();
            client.stop();
        }
        
        int tempkontroll(float radikaC, float toaC, int c)
            {   
        
                if(toaC < 20 && radikaC > 35 && c == 0) {
                c = 1;
                digitalWrite(relayRadiator, HIGH); //paneb relee "HIGH" asendisse
                }
        
                else if((toaC > 21.5 || radikaC < 35) && c == 1) {
                c = 0;
                digitalWrite(relayRadiator, LOW); //paneb relee "LOW" asendisse
                } 
                return c;
            }
        
        int tempkontroll2(float pliidiC, float pliidiveeC, int d)
            {   
        
                if((pliidiC > 90 || pliidiveeC > 80) && d == 0) {
                d = 1;
                digitalWrite(relayBoiler, HIGH); //paneb relee "HIGH" asendisse
                analogWrite(ledRed,0);
                analogWrite(ledGreen,150);
        
                }
        
                else if(pliidiC < 85 && d == 1) {
                d = 0;
                digitalWrite(relayBoiler, LOW); //paneb relee "LOW" asendisse
                analogWrite(ledRed,150);
                analogWrite(ledGreen,0);
                } 
                return d;
            }    
        
            void MorningAlarm(){
                  Spark.syncTime();
              Serial.println("Alarm: - turn lights off");    
            }
            
            void EveningAlarm(){
              Serial.println("Alarm: - turn lights on");           
            }
            
            void WeeklyAlarm(){
              Serial.println("Alarm: - its Monday Morning");      
            }
            
            void ExplicitAlarm(){
              Serial.println("Alarm: - this triggers only at the given date and time");       
            }
            
            void Repeats(){
                           lcd->init();         
        
            }
            
            void Repeats2(){
                 if(Spark.connected())
                    {
                        ThingSpeakUpdate("field1="+String(toaC)+"&field2="+String(radikaC)+"&field3="+String(pliidiC)+"&field4="+String(pliidiveeC)+"&field5="+String(xtempC)+"&field6="+String(c)+"&field7="+String(d));
                    }
            }
            
            void OnceOnly(){
              Spark.syncTime();
              Serial.println("This timer only triggers once");  
            }
        viimati muutis kasutaja qwerty; 19 m 2014, 20:29.

        Comment


          #5
          Vs: Probleem analoogtermoanduriga (DIY keskkütte automaatika)

          Puhtalt analoogsisendist rääkides, peaks pull-downiga igaljuhul üksi olles null olema. Kui pole, siis proovi maaga ära lühistada. Ja vajadusel korralikum väline takk panna.
          Kui nulli nulliks ei loe, siis ongi juba alguses midagi mäda.
          Erilahendused.
          PS või mail.

          Comment

          Working...
          X