Arduino programmeer vraag..

Discussie in 'Model elektronica' gestart door John33, 30 jun 2021.

  1. John33

    John33

    Lid geworden:
    13 sep 2005
    Berichten:
    1.214
    Locatie:
    Geldrop
    Ik heb even wat hulp nodig van Arduino programmeurs.

    Ik heb 2 meet probes, A en B, deze geven een hoog of laag signaal bij een bepaalde conditie.
    Arduino krijgt deze gegevens binnen op 2 pinnen, 3 en 5.

    Als A en B hoog zijn is er geen te ondernemen actie
    Als A LAAG is en B HOOG dan moet een functie worden uitgevoerd (servo positie 90)
    Als A LAAG is en B LAAG is dan functie uitvoeren (servo positie 120)

    Tot zover kan ik dit wel maken, mijn probleem is het volgende:

    Er moet elke tijd X (10, 20 seconden) worden gekeken naar de status van pin 3 en 5.

    Dan moet de functie (servo pos x) blijven lopen totdat de volgende meting is gedaan.

    Dus:

    Start > kijken naar status van Pin 3 en 5 > actie uitvoeren die nodig is zoals hierboven is beschreven > tijd X wachten > servo blijft staan waar hij volgens de laatste meeting moet staan > kijken naar status van pin 3 en 5 > etc.

    Dit gaat mijn kennis te boven, kan iemand mij op weg helpen ?
     
  2. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.884
    Locatie:
    Barneveld
    Ik neem aan dat je nu een " delay(10000); " gebruikt om die 10 seconden te wachten en daar zit je probleem. Die delay "bevriest" je Arduino en dan stopt ook het servo signaal wat er uit komt.

    Kijk eens in de Arduino IDE naar de voorbeeldsketch File>Examples>Digital>BlinkWithoutDelay

    Als je die door hebt, dan heb je ook een oplossing om 10 seconden te laten passeren zonder dat gedurende die 10 seconden de Arduino "bevroren" is.

    Wellicht helpt dit je op weg.
     
  3. John33

    John33

    Lid geworden:
    13 sep 2005
    Berichten:
    1.214
    Locatie:
    Geldrop
    Klopt dat ik nu de delay functie gebruik, maar niet voor dit gedeelte.
    Wat ik bedoel is dat er om de zeg maar, 10 seconden naar de status van de pinnen moet worden gekeken, voor 0,5 seconden.
    Afhankelijk van de staat van de pinnen moet de servo actie aangepast worden.
    Maar in die 10 seconden is de status van de pinnen LAAG, dan moet de servo niet naar positie 120 gaan maar blijven staan op de laatst gemeten status van A en B.

    Ik zal een variabele moeten gebruiken, en die opslaan, dus iets met STATE ?
     
  4. hmeijdam

    hmeijdam

    Lid geworden:
    29 jan 2010
    Berichten:
    1.884
    Locatie:
    Barneveld
    Ja, je variabele is "servopositie" en dat is een getal wat je eens in de 10 seconden bijstelt, afhankelijk van de uitkomst van je A en B.

    Als je hier op je forum (tussen code tags) je sketch neerzet kan men je beter kommentaar geven.


    Invoegen > Code
    codetags.jpg
     
  5. marten77

    marten77

    Lid geworden:
    22 jul 2007
    Berichten:
    2.325
    Locatie:
    Gouda
  6. toostbeek

    toostbeek

    Lid geworden:
    6 dec 2014
    Berichten:
    1.403
    Code:
    int led = 13; unsigned long delayStart = 0; // the time the delay started bool delayRunning = false; // true if still waiting for delay to finish void setup() { pinMode(led, OUTPUT); // initialize the digital pin as an output. digitalWrite(led, HIGH); // turn led on delayStart = millis(); // start delay delayRunning = true; // not finished yet } void checkLed() { // the led task // check if delay has timed out after 10sec == 10000mS if (delayRunning && ((millis() - delayStart) >= 10000)) { delayRunning = false; // // prevent this code being run more then once digitalWrite(led, LOW); // turn led off Serial.println("Turned LED Off"); } } void loop() { checkLed(); // Other loop code here . . . Serial.println("Run Other Code"); }
    
     
  7. John33

    John33

    Lid geworden:
    13 sep 2005
    Berichten:
    1.214
    Locatie:
    Geldrop
    Heren,
    bedankt voor de input, zeker dat van Marten, dat heb ik kunnen gebruiken.
    Dit is de code tot nu toe, ongetest, maar compileert wel goed:
    Code:
    #include <Servo.h>
    
    //VARIABELEN OM MEETING AAN EN UIT TE ZETTEN
    const int meten = 10;          //draad naar ketel
    int meetState = LOW;           //status om meeting aan te zetten
    long previousMillis = 0;       //slaat de laatste meeting op na het updaten
    long OnTime = 100;             //millisecondes aan tijd voor meeting
    long OffTime = 10000;          //millisecondes uit tijd na meeting
    
    //VARIABELEN TBV SENSOREN UIT TE LEZEN
    const int hoog = 3;            //input sensor hoog
    const int laag = 5;            //input sensor laag
    const int tank = 6;            //input tank sensor
    int val1 = 0;                  //variabele tbv sensor hoog
    int old_val1 = 0;              //in deze variabele wordt de vorige waarde van val1 opgeslagen
    int val2 = 0;                  //variabele tbv sensor laag
    int old_val2 = 0;              // zie boven voor old_val1
    int val3 = 0;                  //variabele voor tank sensor
    int old_val3 = 0;              //zie boven voor old_val1
    int state1 = 0;                // 0= uit, 1 is aan
    int state2 = 0;                // zie boven
    int state3 = 0;                //zie boven
    //overige variabelen
    int pomp = 9;                  //PWM naar pomp via mosfet
    int buzzer = 4;                //buzzer tbv acoustisch alarm
    int LED = 13;                  //onboard led om pompstatus aan te geven
    const int thermo = 7;          //input voor thermokoppel
    int PTC = 0;                   //variabele voor thermo weerstand
    int temp;                      //variabele om analoge pin uit te lezen
    
    void setup() {
    pinMode (meten, OUTPUT);
    pinMode (pomp, OUTPUT);
    pinMode (hoog, INPUT);
    pinMode (laag, INPUT);
    pinMode (tank, INPUT);
    pinMode (LED, OUTPUT);
    pinMode (thermo, INPUT);
    pinMode (PTC, INPUT);
    //gasservo.attach(12);
    
    }
    
    void loop() {                             
      //gasbrander controle op basis van stoom/ketel temperatuur uitgelezen via een PTC weerstand.
      //if(digitalRead(thermo) == LOW)   als het thermokoppel koud is moet de gasservo dicht staan
      //gasservo.write(0);              gasservo gaat naar positie dicht.
      //else
      //temp = analogRead(PTC);        lees de waarde van de PTC uit
      //temp = map(val, 0, 1023, 10, 90); omzetten naar 1023 stapjes, servobeweging 10 tot90 graden
      //gasservo.write(val);
      //delay(20);
    
    //zet meetingen om de 10 seconden aan
       unsigned long currentMillis = millis();  //kijk of de meetstatus veranderd moet worden
       if((meetState == HIGH) && (currentMillis - previousMillis >= OnTime))
       {
        meetState = LOW;                  // zet meeting uit
        previousMillis = currentMillis;   // onthoud de tijd
        digitalWrite(meten, meetState);   // Update de meetpin
      }
      else if ((meetState == LOW) && (currentMillis - previousMillis >= OffTime))
      {
        meetState = HIGH;                 // zet de meeting aan
        previousMillis = currentMillis;   // onthoud de tijd
        digitalWrite(meten, meetState);   // Update de meetpin
      }
      //kijk naar de status van de meet pennen
      {
    val1 = digitalRead(hoog);
    val2 = digitalRead(laag);
    val3 = digitalRead(tank);
    if (val1 == HIGH){
      state1 = 1 - state1;
    }
    if (state1 == 1){                   //onduidelijk of deze if regel nodig is
    }
    if (val2 == HIGH){
      state2 = 1 - state1;
    }
    if (state2 == 1){                  //onduidelijk of deze if regel nodig is
    }
    if (val3 == HIGH){
      state3 = 1 - state1;
    }
    if (state3 == 1){                 //onduidelijk of deze if regel nodig is
    }
    }
    //code om pomp te sturen
    {
    if ((val1 == LOW) && (val2 == LOW)){         //als beide meetpennen droog staan, dan maximaal pompen
      analogWrite(pomp, 255);
          digitalWrite(LED, LOW);              //LED gaat snel knipperen
          delay(200);
          digitalWrite(LED, HIGH);
          delay(200);
        }
        if ((val2 == HIGH) && (val1 == LOW)){    //als laag NAT is en hoog DROOG dan op halve kracht pompen
          analogWrite(pomp, 128);
          digitalWrite(LED, LOW);
          delay(1000);
          digitalWrite(LED, HIGH);
          delay(1000);                                           
        }
        {
        if ((val2 == HIGH) && (val1 == HIGH)){   //als beide probes nat zijn dan stoppen met pompen
          analogWrite(pomp, 0);
          digitalWrite(LED, LOW);
        }
        {
        if ((val3 == LOW)){                      //als de tank sensor droog komt dan stoppen met pompen en laat buzzer af gaan
          analogWrite(pomp, 0);
          digitalWrite(buzzer, HIGH);
        }   
    } 
    }
    }
    }
    
     
  8. marten77

    marten77

    Lid geworden:
    22 jul 2007
    Berichten:
    2.325
    Locatie:
    Gouda
    @John33 Nog een tip betreft digitale input, ik zou gebruik maken van deze regel:
    Code:
    pinMode(hoog, INPUT_PULLUP);
    Hiermee activeer je de interne Pull-Up resistor.
     
  9. John33

    John33

    Lid geworden:
    13 sep 2005
    Berichten:
    1.214
    Locatie:
    Geldrop
    Marten,
    De inputs komen vanaf een ic met een schmitt trigger.
    De sensoren komen binnen op dat ic en de output van dat ic is hoog of laag (1 of 0), ofwel 5 volt of 0 volt.
    Is het dan nog steeds raadzaam om de ingangen hoog ohmig te maken ?
     
  10. marten77

    marten77

    Lid geworden:
    22 jul 2007
    Berichten:
    2.325
    Locatie:
    Gouda
    @John33
    Dat hangt ook deels af, hoe dat de schmitt trigger output eruit ziet!
    Als dit een open collector is, dan is een pull-up wel verstandig te gebruiken.
    (Dit voorkomt dat het gaat zweven, bij uitval van de schmitt trigger)
    Ook is het afhankelijk wat je actie is, als de input Hoog word, als dit een actie is, die niet gewenst is bij uitval van je schmitt trigger, dan is een externe pull-down weerstand weer beter.
    Zodat er via de Arduino geen verkeerde actie word ondernomen.

    Daar het om een duiksysteem gaat, wil je bij uitval van de schmitt trigger, dat de pomp de tank leegpompt.

    Betreft dit deel in je code:
    Code:
    if (val1 == HIGH){
      state1 = 1 - state1;
    }
    if (state1 == 1){                   //onduidelijk of deze if regel nodig is
    }
    if (val2 == HIGH){
      state2 = 1 - state1;
    }
    if (state2 == 1){                  //onduidelijk of deze if regel nodig is
    }
    if (val3 == HIGH){
      state3 = 1 - state1;
    }
    if (state3 == 1){                 //onduidelijk of deze if regel nodig is
    }
    Dit heeft nu geen enkele functie, daar ik state1, state2 en state3 nergens meer terug zie komen.
    Of ga je hiermee nog iets doen, wat er nog niet in staat ?
     
  11. John33

    John33

    Lid geworden:
    13 sep 2005
    Berichten:
    1.214
    Locatie:
    Geldrop
    Dit is geen duiksysteem.
    Het is een systeem om een stoomketel enigzins te automatiseren omdat deze in een RC stoomsloep staat.
    In de voorbeeld sketch die ik heb gebruikt zit er een regel in om een LED op te laten lichten bij een druk op een knop, bij nog een drukken gaat deze uit.
    Ik heb de STATE verandering gebruikt maar het IF statement er nog in laten staan.

    In een notedop:
    elke 10 seconden wordt een pin hoog, die schakelt het meet printje in met de schmitt trigger voor 100ms.
    De 3 meetprobes worden dan uitgelezen middels de VAL en OLD_val variabelen.
    De status HOOG of LAAG worden onthouden totdat de volgende meeting begint.

    Daarna wordt er aan de hand van de status een actie uitgevoerd.
    een deel is nog niet aktief, met name de brandersturing want deze moet ik fysiek nog maken.
     
  12. John33

    John33

    Lid geworden:
    13 sep 2005
    Berichten:
    1.214
    Locatie:
    Geldrop
    Nog een vraag,
    ik ga de keteldruk uitlezen via een NTC weestand.
    Dat het werkbaar is weet ik inmiddels, ik heb de NTC in een ketelstomp gemonteerd en met een multimeter zie ik keurig
    de weerstand afnemen als de ketel temperatuur toe neemt.

    Maar, ik heb niet het hele bereik nodig van de NTC (10K).
    Ik zoek een manier om een servo 45 graden te laten bewegen in het bereik van 1.15k tm 0,85k van de NTC.
    Van 10k t/m 1,15k mag de servo niets doen, daarna mag de servo bewegen op de veranderende weerstand.
    Hoe doe ik zo iets ?
    Ik heb de eindpunten van de servo al vastgezet: gasservo.attach(12, 10, 45); //pin 12, minimaal 10, maximaal 45 graden.

    Maar hoe zorg ik er voor dat de servo niets doet in het bereik van 10 naar 1,15K ?
     
  13. John33

    John33

    Lid geworden:
    13 sep 2005
    Berichten:
    1.214
    Locatie:
    Geldrop
    Met een beetje logisch nadenken zelf al uitgevogeld.
    Met een if statement was het zo gemaakt.

    Code:
    val = analogRead(PTC);              //lees de waarde van de PTC uit
      val = map(val, 0, 1023, 0, 180);    //omzetten naar 1023 stapjes, servobeweging 0 tot 180 graden
      if ((val >= 0) && (val <= 45)){
      gasservo.write(val);
      Serial.println(val);
      delay(20);
    Nu nog een alternatief vinden voor een thermokoppel.
    Dit om het gas af te sluiten als de vlam uit mocht waaien.
     
  14. John33

    John33

    Lid geworden:
    13 sep 2005
    Berichten:
    1.214
    Locatie:
    Geldrop
    Het idee is om een lichtgevoelige Diode te gebruiken (vlamsensor).
    De Diode kan de infrarode straling van een vlam waarnemen, ik wil gan kijken of ik de diode in een buisje kan maken
    zodat deze in een rechte lijn naar de brander kan kijken, maar ver genoeg om niet te smelten/kapot te gaan.
    De code heb ik aangepast en werkt nu redelijk zoals ik wil.(gestest met een LDR lichtgevoelige weerstand).
    - Geen vlam (geen licht) servo gaat naar positie 0 en zet de gasklep dicht, geen gas = geen gevaar.
    - bij vlam detectie gaat de gasklep servo naar de maximale open positie, ketel warmt op en stoomproductie begint.
    - zodra de NTC in het aangegeven bereik komt dat in de software staat begint deze de servo terug te regelen naar mate de druk oploopt,
    dit terug regelen gaat niet tot 0 maar tot 10 graden uitslag omdat de brander niet mag uitvallen.
    - mocht dit gebeuren zal de fotodiode geen IR straling meer zien en de gaskraan volledig sluiten.
     
  15. Ernst Grundmann

    Ernst Grundmann PH-SAM Forum veteraan

    Lid geworden:
    27 aug 2002
    Berichten:
    13.369
    Locatie:
    Woerden
    Infrarood is misschien geen goede manier om vlamdetectie te verzorgen. Warmte is infrarood straling en als de vlam uit gaat zal de brander/ketel nog vrij lang veel warmte uit blijven stralen. Zo kan het zijn dat de sensor die warmte blijft "zien" en dus de software de gaskraan niet dicht draait. Ik zou het eerst eens met een proefopstelling gaan uitproberen.
    Het is de bedoeling dat de gaskraan echt snel dicht gaat als de vlam dooft, langer dan 10 seconden zou ik het niet willen laten duren. Een thermokoppel reageert knap snel en daarmee is die 10 seconden makkelijk haalbaar. Maar waarom wil je eigenlijk geen thermokoppel gebruiken?
     
  16. Stoompomp

    Stoompomp

    Lid geworden:
    22 jul 2017
    Berichten:
    4.595
    Locatie:
    HELLEVOETSLUIS
    Ik gebruik het niet in mijn stookinstallatie, maar een goede en betrouwbare vlammeting is meten door ionisatie, vlamionisatie.
    Door de hoge vlamtemperatuur gaat het gas ioniseren, geleiden.
    De meetelementen zijn 2 elektroden op kleine onderlinge afstand in de vlam.
    Rest nog een weerstand meting.
    Groet. Henk.
     
  17. Stoompomp

    Stoompomp

    Lid geworden:
    22 jul 2017
    Berichten:
    4.595
    Locatie:
    HELLEVOETSLUIS
    Gisteren had ik het over de detectie van de vlam door ionisatie.
    Ik heb hiermee getest en de schakeling werkt.
    In het schema een relais, maar de aansturende transistor van het relais geeft een hard signaal.
    Vlamionisatie detectie.jpg
    In de autonoom gestuurde stoominstallatie van mijn schip heb ik hiervoor niet gekozen.
    Ik gebruik een door de keteldruk gestuurde vlamregeling, die de keteldruk regelt en ook ervoor zorgt, dat als de ketel leeg stookt, de vlam, zowel waak- als hoofdbrander wordt afgeschakeld.
    Hierdoor kan de vlam geen schade meer maken aan de lege ketel.
    Dit zonder enkele elektronische ondersteuning, maar wel met terugmelding van de keteldruk op de handzender.
    Door telemetrie ontvang ik op de zender,: ketelwater niveau, ketelwater laag alarm en ook laag alarm ketelwater voorraad.
    In elk geval wens ik je succes met je project.
    Groet, Henk
     
  18. John33

    John33

    Lid geworden:
    13 sep 2005
    Berichten:
    1.214
    Locatie:
    Geldrop
    Een eerste test is hoop gevend.
    Laat ik voorop stellen dat ik de gasbrander klaar heb, een keramische brander welteverstaan.

    Met de laptop in de schuur, simpel arduino programma geladen om de foto diode te testen.
    Middels de seriële monitor kon ik de waardes uitlezen en deze schoten omhoog als de brander aan stond.
    Ik heb weinig verstand van IR straling maar ook een blauwe gasvlam geeft ruim voldoende IR straling om de waardes omhoog te laten schieten.

    Nu nog zo`n vlamdetectie sensor halen bij de winkel, deze heeft meteen een comparator aan boord waardoor deze een hoog of een laag signaal af geeft.
    Nu meet ik nog via de analoge ingang, dat geeft te veel ruis, en voor €2,50 kan ik geen breuk vallen.
     
  19. Ernst Grundmann

    Ernst Grundmann PH-SAM Forum veteraan

    Lid geworden:
    27 aug 2002
    Berichten:
    13.369
    Locatie:
    Woerden
    IR straling is warmte straling, die kunnen wij mensen voelen maar niet zien!
    Een mooie blauwe vlam geeft aan dat de verbranding goed en (bijna) volledig is. Zo'n vlam geeft heel veel warmte af dus ook heel veel IR straling. Logisch dus dat de detector daar goed op reageert.
     
  20. Stoompomp

    Stoompomp

    Lid geworden:
    22 jul 2017
    Berichten:
    4.595
    Locatie:
    HELLEVOETSLUIS
    Eigenlijk geeft een blauwe vlam niet veel infrarood.
    Het infrarood wordt opgewekt door het keramische branderbed, dat hel rood kleurt.
    Daarom zijn keramiekbranders zo effectief, daar deze de vlam energie omzetten naar de efficiënte IR stralingsenergie voor de ketelverwarming.
    Bij proportioneel regelen van de vlam, afhankelijk van de keteldruk, zal de kleur van het branderbed door een lagere gastoevoer, in kleur veranderen.
    Een ionisatie detectie zal blijven werken, daar deze niet lichtspectrum afhankelijk is, maar van de verbrandingsgassen.
    Groet, Henk.
     
    Laatst bewerkt: 14 jul 2021

Deel Deze Pagina