Arduino expert gezocht

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 18
Geregistreerd: 02 Nov 2018, 23:05

Re: Arduino expert gezocht

Berichtdoor Sander8511 » 07 Nov 2018, 22:57

Als je alles eenmaal weet, is het idd niet zo moeilijk. ;-)


Ja ik heb beide libraries opgehaald en de voorbeeldcode ook.
Een timer terug laten tellen dat lukt.
Dit stukje code komt uit de voorbeeld sketch. Ben er een beetje mee aan het knoeien geweest en heb hem nu ingesteld dat hij vanaf 30 seconden terug telt. Top zeg ik. :-)
Ik begrijp het alleen niet allemaal 100%. Van de eerste 2 regels weet ik bijvoorbeeld niet wat het doet? :?

uint16_t blinkcounter = 0;
boolean drawDots = false;
for (uint16_t timer = 3000; timer > 0; timer --) {
matrix.writeDigitNum(0, (timer / 1000), drawDots);
matrix.writeDigitNum(1, (timer / 100) % 10, drawDots);
matrix.drawColon(drawDots);
matrix.writeDigitNum(3, (timer / 10) % 10, drawDots);
matrix.writeDigitNum(4, timer % 10, drawDots);

De allereerste stap is om met een potmeter de timer in te kunnen stellen van 0 tot 60 seconden. Waar ik nu aan zit te denken is om dat te doen met deze functie:

void loop() {
// read the analog in value:
sensorValue = analogRead(analogInPin);
// map it to the range of the analog out:
outputValue = map(sensorValue, 0, 1023, 0, 255);
// change the analog out value:
analogWrite(analogOutPin, outputValue);

// print the results to the Serial Monitor:
Serial.print("sensor = ");
Serial.print(sensorValue);
Serial.print("\t output = ");
Serial.println(outputValue);


Ik weet alleen niet hoe ik de koppeling naar het display maak. Ik denk dat het me wel lukt om de potmeter zo in te stellen dat hij helemaal terugedraaid "0" aangeeft en helemaal open "60". Maar dat zou dan op de serial monitor zijn en niet op het display.

Zit ik een beetje goed?

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Arduino expert gezocht

Berichtdoor Koepel » 08 Nov 2018, 11:40

Ja, je zit een beetje goed ;)

Wat de "matrix.writeDigitNum()" en "matrix.drawColon()" doen, dat mag je zelf uitzoeken. Dat zijn functies van die library.

Dit soort dingen: "(timer / 100) % 10" is om de waarde van een variabele om te zetten naar een cijfer voor een decimaal getal. Het is wiskunde met de 'c' of 'c++' taal. Je kunt het gewoon gebruiken.

Je kunt de knop meteen omzetten naar seconden
Code: Alles selecteren
int graden = map( sensorValue, 0, 1023, 0, 60);

Of wil je ook de hondersten van seconden instellen ?
De map functie doet dit: https://www.arduino.cc/reference/en/language/functions/math/map/.

Volgens mij heb je nu bijvoorbeeld "20:58", terwijl hondersten van seconden vaak achter een punt worden gezet, zo: "20.58".

Ik vraag me af of je de waarde "0" en "60" ook echt kunt bereiken, maar dat is iets voor later. Misschien iets met de constrain(): https://www.arduino.cc/reference/en/language/functions/math/constrain/

Het is eenvoudiger voor ons als je een hele sketch laat zien. Die losse stukjes zijn maar losse stukjes. Zet je de sketch binnen code-tags ? Dat is de sketch tussen [ code ] en [ / code ] met de "Code" knop, je kunt ook "Select a Syntax" doen en dan "C++.

Het Adafruit display heeft een grote library nodig :( Het Sparkfun display heeft een seriele verbinding nodig en daar wordt soms SoftwareSerial voor gebruikt :cry: Het kan allemaal een stuk eenvoudiger, zie: https://www.youtube.com/watch?v=KFC_bQmroko :D Dan is alleen een kleine library nodig voor de signalen. Dan kun je alleen de 7-segmenten displays aansturen, er zit verder niets extra bij om speciale dingen te doen met het display. Maar al die speciale dingen heb je toch niet nodig.

Berichten: 18
Geregistreerd: 02 Nov 2018, 23:05

Re: Arduino expert gezocht

Berichtdoor Sander8511 » 08 Nov 2018, 21:14

Dankje Koepel, voor je antwoord en toevoeging.
Wat de "matrix.writeDigitNum()" en "matrix.drawColon()" doen, begrijp ik wel. Ik doelde op de eerste 2 regels. ;-)

Code: Alles selecteren
uint16_t blinkcounter = 0;
boolean drawDots = false;


Met name de eerste regel dan eigenlijk, wat is uint16_t? De tweede zal iets te maken hebben met de decimalen uit zetten?
Misschien een domme vraag, maar hoe kies je je variabelen? Waarom is het bijvoorbeeld geen "int drawDots"?


Ik wil graag 2 digits seconden doen voor de decimaal en 2 digits erna voor de tienden en honderdsten.

De YouTube video is interessant, maar niet toepasbaar voor mijn display toch? Ik heb die van mij moeten solderen op die backpack. :mrgreen:

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Arduino expert gezocht

Berichtdoor Koepel » 08 Nov 2018, 22:16

Een integer als 'int' kan een 16-bits integer zijn in een Arduino Uno of een 32-bits integer in een Arduino MKR. Dat is verwarrend.
Daarom hebben ze variabelen met die vreemde namen verzonnen, die overal precies hetzelfde aantal bits hebben:
uint16_t : een unsigned integer van 16 bits
int16_t : een signed integer van 16 bits
uint8_t : een unsigned integer van 8 bit
int32_t : een signed integer van 32 bit
enzovoorts.

Wanneer iets alleen 'true' of 'false' is, dan kun je in de 'c' en 'c++' taal daar een "bool" voor gebruiken.. In de Arduino mag je die ook een "boolean" noemen.

Hoe je variabelen kiest, dat hangt er van af wat je ermee wilt doen.
Het is handig om van ieder type variabele voor elk platform de grenzen te weten. Begin maar hier: https://www.arduino.cc/reference/en/language/variables/data-types/int/.

Die "drawDots" variabele is onhandig. Wie wil nu alle decimale punten aan of uit zetten ?
Je kunt die weglaten en dit doen:
Code: Alles selecteren
matrix.writeDigitNum(1, (timer / 100) % 10, false);


Wanneer je met hondersten van seconden tot 60 wilt tellen, dan tel je dus tot 6000. Dan kun je een 'int' gebruiken, maar ook een 'unsigned int' of een 'uint16_t'. Doe maar wat je het gemakkelijkste vind.
Als later blijkt dat milliseconden tellen gemakkelijker is, dan kun je altijd nog een "unsigned int" of "long" gaan gebruiken.

Die YouTube video is voor een ander display. Ik wil alleen maar laten zien dat er eenvoudige en gemakkelijke displays zijn. Het is natuurlijk sowieso een leerzaam filmpje ;)
Laatst gewijzigd door Koepel op 08 Nov 2018, 22:19, in totaal 1 keer gewijzigd.

Berichten: 18
Geregistreerd: 02 Nov 2018, 23:05

Re: Arduino expert gezocht

Berichtdoor Sander8511 » 08 Nov 2018, 22:17

Ok mannen. Ik heb de potmeter op het display aangesloten en het WERKT!!! (Jeeeuuuj). Ik zie de waardes netjes verschijnen. Best stoer vind ik zelf! :mrgreen: :lol:
Ik wilde dat het display zodra het voeding krijgt eerst op een knipperende "----" komt te staan tot je aan de potmeter draait. Dat heb ik nu ingesteld.

Ik kom toch niet van die 1023 af. Ook niet met
Code: Alles selecteren
 int graden = map( sensorValue, 0, 1023, 0, 60)
Heb nog even met verschillende waardes geprobeerd, maar er lijkt niks te veranderen. Vergeet ik iets?

Een ander ding is dat de waarde niet constant blijft staan op het display. Als ik de potmeter terugdraai naar "0" zou het display de "----" weer moeten geven en daarop blijven staan. De streepjes worden weergegeven, maar worden afgewisseld met een 2 een 3 of een 4. Net of hij te gevoelig is?


Hieronder de code tot dusver.

Code: Alles selecteren
#include <Wire.h> // Enable this line if using Arduino Uno, Mega, etc.
#include <Adafruit_GFX.h>
#include "Adafruit_LEDBackpack.h"

Adafruit_7segment matrix = Adafruit_7segment();

void setup() {
#ifndef __AVR_ATtiny85__
  Serial.begin(9600);
  Serial.println("7 Segment Backpack Test");
#endif
  matrix.begin(0x70);
}

void loop() {
 
  int sensorValue = analogRead(A0);     
  //map it to the range of the analog out:
  int graden = map( sensorValue, 0, 1023, 0, 60);

 
  if (sensorValue == 0) {
       int blinkRate = true;
       matrix.blinkRate(1);         //blink "----"
       matrix.print(10000, DEC);    //If sensorvalue is 0 show "----" on display
       matrix.writeDisplay();
       delay(100);
    }
  else
  {
       
        boolean drawDots = true;
        matrix.drawColon(drawDots); //print colon
        matrix.print(sensorValue);  //print sensorvalue to display
        matrix.writeDisplay();
        delay(10);
 

 
  }
}


De volgende uitdaging wordt om met een knop/ momentairy switch de aflooptijd de bevestigen. Dus na de knop ingedrukt te hebben, moet het display stoppen met knipperen (dat lukt nog wel) maar de potmeter moet ook geen input meer kunnen geven. Die moet dus geblokkeerd worden. Dus niet als je op de knop hebt gedrukt dat het display stopt met knipperen, maar je vervolgens nog de wel waarde kan veranderen door aan de potmeter te draaien. Even over nadenken nog... :mrgreen:

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Arduino expert gezocht

Berichtdoor Koepel » 08 Nov 2018, 22:35

Heel stoer :D

Een potmeter helemaal naar 0 of helemaal naar 1023 draaien gaat niet altijd lukken. Daarom begon ik over de constrain() functie.
Misschien kun je een dood gebied van 5 instellen.
Dus alles onder de 5 is minimum en alles boven de 2018 is maximum.

Wil je de tijd instellen in seconden of de temperatuur in graden ?

Code: Alles selecteren
  // sensorValue is 0...1023.
  // Na de constrain functie is het 5...2018
  // Dat verlagen naar 0 ... 1013.
  // Dat wordt vertaald naar 0 ... 60

  int sensorValue = analogRead(A0);
  sensorValue = constrain( sensorValue, 5, 2018);
  sensorValue = sensorValue - 5;   

  int seconden = map( sensorValue, 0, 1013, 0, 60);   // 0 tot 60
  unsigned long milliseconden = seconden * 1000;     // dit kan ook

Ik heb dit niet geprobeerd, en ik weet niet of de map() functie het naar boven kan afronden. Er zal nog wel een wijziging nodig zijn.

Vanaf dat moment ga je natuurlijk de "seconden" gebruiken, niet meer de "sensorValue".

Dan kun je gaan kijken of het aantal seconden nul is, en dan een "----" invullen.

Tip: Des te harder je nadenkt over de structuur van de sketch, des te slechter het gaat worden. Teken het uit of zie het voor je of maak een waarheidstabel of een goede beschrijving. Als het er eenvoudig uitziet, dan heb je het goed gedaan.

Berichten: 18
Geregistreerd: 02 Nov 2018, 23:05

Re: Arduino expert gezocht

Berichtdoor Sander8511 » 09 Nov 2018, 00:19

Ik wil inderdaad de tijd instellen ja.
Het stukje code van jou levert inderdaad een stabiele "----"op. Hij gaat echter niet tot 60 maar tot 1013. (Moet de 2018 in jouw code geen 1018 (1023-5) zijn? Weet niet of het wat uitmaakt hoor?

Ik kan eigenlijk geen enkel getal stabiel krijgen op het display. Hij blijft heen en weer springen. De potmeter is te gevoelig of zo. Is er geen functie die hem wat stabiliseert of dat je een soort van threshold in kan stellen?

Berichten: 18
Geregistreerd: 02 Nov 2018, 23:05

Re: Arduino expert gezocht

Berichtdoor Sander8511 » 09 Nov 2018, 00:58

Ohh Ik had de sensorValue nog niet veranderd naar seconden. Dat heb ik gedaan en nu geeft hij inderdaad 60 aan als helemaal open. Ik heb dat veranderd naar 6000. De stabiliteit is nog wel een dingetje. Met 60 ingesteld is hij beter in te stellen dan met 6000. :?

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Arduino expert gezocht

Berichtdoor Koepel » 09 Nov 2018, 08:00

Ja, dat is springerig.
Je kunt een rotary encoder gebruiken, of er voor kiezen om alleen vaste hele seconden in te stellen, of met knoppen voor "omhoog" en "omlaag" of met een keypad om het in te typen.

Rotary encoder: https://www.youtube.com/watch?v=tmYPuIvSdrg.

Ha ha, het moet natuurlijk 1018 zijn. Sorry :oops:

Berichten: 18
Geregistreerd: 02 Nov 2018, 23:05

Re: Arduino expert gezocht

Berichtdoor Sander8511 » 09 Nov 2018, 14:00

Ok, kan ik niet instellen met alleen seconden (2digits) en zodra de timer gestart wordt, er dan 1 digit na de decimaal de tienden aftelt? :mrgreen:

VorigeVolgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Google [Bot] en 13 gasten