Rakennamme kesävesitornin ja Pumpauttimen

Mulla lienee noita uppopumpun kohoja useampikin, ellen viimeksi siivotessa heittänyt menemään. On rikkoontuneista uppopumpuista otettu talteen. Puolen viikon maissa käyn kotona, niin voisin yrittää muistaa katsoa.
 
Oon vuottanu milloin pumppu hajoaa avotan siitä kohon.
Ei muute hajoo sun elinaikana ku tollasia oottelet.
Suoraan 240V sähköihin

Tasavirtasella toimivat ohjaamaan relettä.

 
Kesävesitorniin kaavailemani pumpunohjaimen osasia saapunee tällä viikolla. Funtsailin, että ensin minun kannattaa tutustua roippeisiin ja selvittää, millaisilla kertoimilla suunnitellun ohjaimen saa kalibroitua näyttämään suunnilleen oikeita lukemia.

Virtausanturi tuottaa kanttiaaltoa ja sille ilmoitetaan spekseissä 595 pulssia per litra:

virtausanturi.webp


Paineanturi on asteikoltaan 100psi, eli alue loppuu vähän alle seitsemän baarin paikkeille. Tilasin myös 100psi / 7bar asteikolla varustetun mittarin.



paineanturi.webp


Koodautin ChatGPT:llä arduinosoftan, joka näyttää virtausanturin pulssit ja siitä lasketun virtauksen. Samaten se mittaa paineanturilta saatavaa jännitettä ja kalkuloi sitä vastaavan painearvon.

Tutustuin Wokwi.com -simulaattoriin ja tarkistin sillä ChatGPT:n vääntämän koodin. Se oli varsin pätevää, eikä sitä tarvinnut juurikaan korjailuttaa (itsehän en osaa). Korjailuttaminen onnistuu aika kätevästi, kun vain syöttää virheilmoitukset tekoälylle ja kysyy, että mitäs me nyt tehdään. Aika pian viat löytyivät.

Simulaatiota varten tarvittiin myös Wokwi:n Custom Chip-pulssigeneraattori, jonka sai myös tuotettua ChatGPT:llä. Pulssigeneraattorilla saa simuloitua virtausanturin toimintaa ja paineanturin toiminnan jäljittelyyn käy tavallinen potikka.

simulation.webp


Koodin pitäisi suodattaa hetkelliset paine- ja virtaushäiriöt pois ja simuloinnissa näkyykin, kuinka se reagoi varsin pehmeästi pulssitaajuuden säätöön ja potikan pyörittelyyn.

Koodi:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

/* --------------------------------------------------------
   PC‑pumpun monitorointi ‑ Arduino UNO
   ‑ Virtausanturi: 595 pulssia per litra
   ‑ Paineanturi: 0,5 – 4,5 V = 0 – 100 psi (≈ 0 – 6,89 bar)
   ‑ LCD‑näyttö: 20 × 4, I2C
   --------------------------------------------------------*/

LiquidCrystal_I2C lcd(0x27, 20, 4);   // vaihda 0x3F tarvittaessa

/* --- Pinimääritykset --- */
const byte FLOW_PIN     = 2;          // INT0 keskeytyspin
const byte PRESSURE_PIN = A0;         // ADC‑kanava paineanturille

/* --- Kalibrointivakiot --- */
const float PULSES_PER_LITER = 595.0;          // anturin data‑arvo
auto constexpr PSI_TO_BAR     = 0.0689476f;    // 1 psi = 0,0689476 bar
const float FULL_SCALE_PSI    = 100.0;         // anturin skaalaus
const float VOLT_MIN          = 0.5;           // sensorin 0 psi jännite
const float VOLT_MAX          = 4.5;           // sensorin 100 psi jännite
const float ADC_TO_VOLT       = 5.0 / 1023.0;  // 10‑bit ADC → jännite

/* --- Liukuvan ikkunan muuttujat --- */
volatile unsigned long pulseCount = 0;         // ISR kasvattaa
unsigned long bucketPulse[3] = {0};            // kolmen sekunnin puskurit
byte bucketIdx = 0;                             // tunnistin
unsigned long lastBucketTime  = 0;
unsigned long lastDisplayTime = 0;

/* --- Painesuodatus --- */
float filtPressureBar = 0.0;
const float ALPHA = 0.20;                       // 0…1 (suurempi → reagoi nopeammin)

/* --------------------------------------------------------
   Keskeytysrutiini: pulssilaskuri — AVR‑alustalla ei tarvita
   IRAM_ATTR‑attribuuttia, se on ESP32‑erikoisuus.          
   --------------------------------------------------------*/
void flowISR() {
  pulseCount++;
}

/* --------------------------------------------------------
   setup() – alustus
   --------------------------------------------------------*/
void setup() {
  pinMode(FLOW_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(FLOW_PIN), flowISR, RISING);

  lcd.init();
  lcd.backlight();
  lcd.print("Pumpun monitori");
  delay(1500);
  lcd.clear();

  lastBucketTime  = millis();
  lastDisplayTime = millis();
}

/* --------------------------------------------------------
   loop() – pääsilmukka
   --------------------------------------------------------*/
void loop() {
  unsigned long now = millis();

  /* --- 1 s: liikuta pulssit puskuritaulukkoon --- */
  if (now - lastBucketTime >= 1000) {
    lastBucketTime += 1000;                     // pitää ajastuksen tarkkana

    bucketIdx = (bucketIdx + 1) % 3;           // kiertävä indeksi 0‑1‑2
    bucketPulse[bucketIdx] = pulseCount;        // kulunut sekunnin pulssit
    pulseCount = 0;                             // nollaa laskuri
  }

  /* --- 1 s: laske arvot ja päivitä LCD --- */
  if (now - lastDisplayTime >= 1000) {
    lastDisplayTime += 1000;

    /* Virtaus l/min (kolmen sek. liukuva keskiarvo) */
    unsigned long total = bucketPulse[0] + bucketPulse[1] + bucketPulse[2];
    float lpm = (total * 60.0) / (PULSES_PER_LITER * 3.0);

    /* Paineanturi → jännite → paine (bar) */
    int   adc      = analogRead(PRESSURE_PIN);
    float voltage  = adc * ADC_TO_VOLT;
    float pressureBar = (voltage - VOLT_MIN) * (FULL_SCALE_PSI * PSI_TO_BAR) / (VOLT_MAX - VOLT_MIN);
    if (pressureBar < 0) pressureBar = 0;      // rajaa negatiiviset

    /* Eksponentiaalinen suodatus */
    filtPressureBar = filtPressureBar * (1.0 - ALPHA) + ALPHA * pressureBar;

    /* --- LCD‑päivitys --- */
    lcd.setCursor(0, 0);
    lcd.print("Virtaus ");
    lcd.print(lpm, 1);
    lcd.print(" l/min   ");

    lcd.setCursor(0, 1);
    lcd.print("Pulssit/s ");
    lcd.print(total / 3);
    lcd.print("      ");

    lcd.setCursor(0, 2);
    lcd.print("Paine= ");
    lcd.print(filtPressureBar, 2);
    lcd.print(" bar   ");
   
    lcd.setCursor(0, 3);
    lcd.print("Voltit= ");
    lcd.print(voltage, 2);
    lcd.print(" V      ");

   
  }
}
 
Ajatus olisi mittailla paine- ja virtausarvoja, jotka muuttuvat hieman vedenpinnan painuessa vähitellen alas pumpun tasolle.

Progressive Cavity Pump eli ruuvipumppu, joka kaivossa on, antaa kirjallisuuden mukaan varsin vakion virtauksen riippumatta vesipatsaan tekemästä esipaineesta. Sisäinen "luisto" kasvaa kuitenkin, kun vesi kaivossa alenee. Vaikutuksen pitäisi kuitenkin olla pieni, ehkä noin 10% luokkaa kulumattomalla pumpulla.

Ruuvipumppua ei saisi ajaa kuivana, koska roottorin ja elastomeerikammion välisen voitelun hoitaa vesi. Ellei virtaus ole jatkuvaa, voi pumppukammio kyrvähtää muutamassa sekunnissa, näin varoitetaan pumppuvalmistajien sivuilla.

Tällä mittauskapineella saanen selville pumpun todellisen tuoton pumppauksen alussa ja lopussa. Nyt se on arviolta noin 16 litraa minuutissa plus miinus 5-10%. Kun todellinen minimivirtaus pumppauksen aikana selviää, voi ohjaimessa asettaa alarajaksi verrattain suuren arvon, esim. 10 litraa minuutissa. Tätä mitataan muutaman sekunnin aikaikkunalla, joten ohjaimen pitäisi pystyä katkaisemaan pumppaus varsin nopeasti heti, kun virtaus poikkeaa normaalirajoista.

Tässä vaiheessahan koodista puuttuu vielä kaikki pumpunohjaimen toiminnallisuus. Se ainoastaan mittaa painetta ja virtausta. Eikä koko toosaa ole vielä kasattu kuin virtuaalisesti.
 
Osia tuli.

Varmistukseksi mittasin paineilman kanssa muutaman otoksen eri painearvoilla. Tihrustin tarkkaan kiinankeijon painemittaria ja kirjasin aina painetta vastaavan anturijännitteen bilhelveten mittarista.

paine-jännite.webp


Sitten tsätgeepeeteeltä kysymään, että näyttävätkö nämä kelvollisilta lukemilta.

No oho :eyepop:

painekuvaaja.webp


Kaipa tästä ihan kelvollisen paineanturin saa.

Pitää alkaa ruuvailemaan osasia yhteen.

osaset.webp
 
Sain mittaussoftan tuupattua Arduinoon.

IMG_7575.webp


Ei kuitenkaan pääse kokeilemaan toimintaa ennen kuin saa roippeet jonkinlaiseen koteloon. Leikkelin lasikuitulevystä asennuslevyn vesiosille ja samaan levyyn tulee myös ohjainboksi. En ehtinyt vielä kyhäillä valmiiksi asti, mutta jos vaikka huomenna... :kouhoti:

IMG_7577.webp
 
Kohta saadaan DATAA. Sain romppeet laatikkoon ja toosaan tehtyä myös havainnointi-ikkunan. Pitää jättää jankki rauhassa kuivamaan ja mennä kesävesitornia täyttämään sport avomallilla.

IMG_7581.webp
IMG_7583.webp
IMG_2274.webp
 
Kirjoittelin trumpkaliiberin tussilla mittaustuloksia pahvilaatikon kupeeseen. Halusin saada kuvan miten paine ja virtaus muuttuvat pumppauksen aikana.

mittaamo.webp


Ohjauksen pitää tunnistaa kaksi mahdollista poikkeavaa tilannetta:
1) vesi loppuu kaivosta kesken pumppauksen > kuivakäyntitilanne, pumpun kumikammion rikkoutumisvaara > ohjauksen pitää pysäyttää pumppu
2) säiliö tulee täyteen, uimuriventtiili alkaa sulkeutua, paine nousee, joten ohjauksen pitää pysäyttää pumppu

Tässä mittauksessa vesi loppui kaivosta, eikä vedenpinta noussut niin korkealle, että uimuriventtiili olisi alkanut kuristaa virtausta. Paineen ja virtauksen muutokset johtuvat siitä, että vedenpinta kaivossa laski ja pumpun imuaukkoon tuleva esipaine samoin. Pumppaus päättyi kuivakäyntitilanteeseen.

Vaikuttaa siltä, että veivarin pumppu on tehty reiluilla välyksillä, oletettavasti jotta sille luvattu hiekankestävyys paremmin toteutuisi. Tämän voi päätellä siitä, että pumpun sisäinen luisto vaikuttaa aika suurelta. Mitään haittaa tästä ei varsinaisesti ole, mutta on hyvä tuntea pumpun normaalitoiminta, jotta osaisi määritellä poikkeustilanteet.

pumppausanalyysi.webp


_______________________________________

Taidan määritellä kuivakäynnin niin, että silloin tuotto on alle 10 litraa minuutissa ja paine alle 1 bar.

Tänään pitää vielä mitata, miten paine ja virtaus käyttäytyvät, kun säiliö alkaa täyttyä.
 
Jokohan tämä olisi valmis versio... :kouhoti:

Systeemillä on kaksi tilaa:
1) pumppu käy
2) ventataan, että vesitilanne muuttuu

Tilasta toiseen voi siirtyä automaattisesti tai manuaalisesti. Automaattinen sammutus voi johtua siitä, että vesi loppui kaivosta tai säiliö tuli täyteen. Automaattinen käynnistys tapahtuu taukoajan kuluttua loppuun. Taukoajan voi valita:
15 / 30 / 60 / 120 / 240 / 480 / 960 minuuttia. Tauolta pumppaamaan voi siirtyä myös manuaalisesti, samoin pumppauksesta tauolle.

Sähkökatkon jälkeen perus odotusaika on 240 minuuttia. Sitä voi nappulaa painelemalla muuttaa. Toisesta nappulasta tehdään manuaalinen käynnistys tai sammutus (tauolle siirtyminen).



Pumppu käy. Se käynnistettiin käsin. Se on käynyt alle minuutin ja pumpannut tuona aikana yhteensä 18 litraa. Tämänhetkinen virtaus on 51,7 litraa/min ja paine on 2 baaria.

manual start.webp




Meneillään on 15 minuutin taukoaika, josta on vielä jäljellä 14 minuuttia. Tauolle siirryttiin, koska vesi loppui kaivosta. Viime pumppaus tuotti yhteensä 51 litraa.

vesi loppui.webp




Meneillään on 15 minuutin taukoaika, josta on vielä jäljellä 14 minuuttia. Tauolle siirryttiin, koska säiliö tuli täyteen. Viime pumppaus tuotti yhteensä 51 litraa.

tuli täyteen.webp


Simulaatio vaikuttaisi toimivan oikein.

Veden loppumisen kriteeri on alle 1 bar paine ja alle 10 litraa/min virtaus.

Säiliön täyttymisen kriteeri on 2,8 barin paine.

Käynnistyksessä on 10 sekunnin aika, jolloin veden loppumisen kriteereitä ei huomioida. Paineen kohoaminen huomioidaan kyllä ja pumppu sammutetaan, jos paine on yli 2,8 bar.
 
Huomenissa pitää porailla reiät noille parille painonapille ja kytkeä releet. Arduinon pikkurele ohjaa "oikeaa relettä", joka sitten käynnistelee ja sammuttelee pumppua. Nuo sokeripalaa pienemmät releet eivät oikein sovellu oikeisiin töihin, olen vahvasti sitä mieltä.

Sitten pääseekin kokeilemaan, toimiiko tämä väkkyrä oikeasti vai pitääkö poistua hissukseen takavasemmalle.
 

Luo tili tai kirjaudu sisään kommentoidaksesi

Sinun täytyy olla jäsen voidaksesi jättää kommentin.

Luo käyttäjätili

Liity Konekansalaiseksi. Se on helppoa ja ilmaista! Rekisteröityneenä et näe mainoksia, voit käyttää hakua, näet alueita, joita nyt ovat piilossa...jne.

Kirjaudu sisään

Oletko jo Konekansan jäsen? Kirjaudu sisään tästä.

Takaisin
Ylös