Arduino Smooting adc0 en adc1 ADS1115

blackdog

Golden Member

Hi

Nog even snel voor ik naar bed ga...

Ik wil een dubbele vergelijking doen, als de teller niet nul is maar ook niet de waarde 15 heeft dan moet de LED onder de encoderknop groen worden.
Verschillende voorbeelden geprobeerd maar kan iemand mij even in de goede richting schoppen?
En nog belangrijker vertellen wat ik verkeerd doe.

Stukje van de code die ik niet goed krijg.

c code:


void loop() {
  
  if ((twist.getCount()) >= 15) {
  twist.setCount(15);
  twist.setColor(255, 0, 0);                                     // Maakt de LED rood

  Serial.println();
  Serial.print("Counter Max. is bereikt!");
  }
  
  else if ((twist.getCount()) < 0) {
  twist.setCount(0);

  twist.setColor(0, 0, 255);                                     // Maakt de LED blauw
  Serial.print("Counter Min. is bereikt!");
  }
 
 
  Serial.print("Count: ");
  Serial.print(twist.getCount());
  Serial.println();

 if ((twist.getCount()) > 0) && ((twist.getCount()) < 15){     // het gaat om deze twee regels, Deze regel bevat fouten! als de counterwaarde niet 0 is en ook niet 15 is, dan moet de LED in de encoder groen worden
  twist.setColor(0, 255, 0);                                   // het gaat om deze twee regels, deze regel maakt de LED in de encoder groen en dat commando is in principe goed
 }



  delay(1);
}

Dank en groet,
Bram

Waarheden zijn "Illusies waarvan men vergeten is dat het illusies zijn"

Als de led niet rood of blauw brandt, dan moet hij groen branden.
Dus dit zou moeten werken:

c code:


void loop() {
  
  if ((twist.getCount()) >= 15) {
  twist.setCount(15);
  twist.setColor(255, 0, 0);                                     // Maakt de LED rood

  Serial.println();
  Serial.print("Counter Max. is bereikt!");
  }
  
  else if ((twist.getCount()) < 0) {
  twist.setCount(0);

  twist.setColor(0, 0, 255);                                     // Maakt de LED blauw
  Serial.print("Counter Min. is bereikt!");
  } 

  else {
  twist.setColor(0, 255, 0);                                   // Maak led groen als de led niet rood of blauw brandt
  }
 
 
  Serial.print("Count: ");
  Serial.print(twist.getCount());
  Serial.println();
 }



  delay(1);
}

Je gaat mis met je haakjes. Je schrijft:

c code:


 if ((twist.getCount()) > 0) && ((twist.getCount()) < 15){     // het gaat  

maar moet zijn:

c code:

 
if (((twist.getCount()) > 0) && ((twist.getCount()) < 15)){     // het gaat
Bezoek mijn neefjes' site: www.tinuselectronics.nl
blackdog

Golden Member

Hi ohm pi, :-)

Dat klopt, je voorbeeld werkt.
Ik zie nu ook dat als je meerdere vergelijkingen doet, de hele vergelijking ook nog eens tussen haakjes moet staan zoals jij ook aangeeft.

Maaaaaar....
Ik heb een vreemd effect, als eerste wat goed gaat.
Als ik omhoog draai en bij 15 aankom wat ik als maximum heb gesteld, dan wordt de counterwaarde net jes begrenst en ook de LED i nd encoder wordt rood.
Draai ik nu 1 klik linksom, dan wordt de counter waarde netjes 14 en de LED wordt groen.

En dan nu wat niet goed gaat.
Draai ik vanaf 14 verder omlaag naar counter stand "0" (stat op "0" in de serieel monitor) dan blijft de LED nog steeds groen!
Draai ik nu nog 1 klik linksom dan blijft de counter op "0" staan en nu wordt blauw.
Draai ik de encoder 1 klik weer rechtsom dan wordt direct de LED weer groen bij de couter waarde van "1"

Draai ik nu weer linksom dan zijn er weer twee klikjes nodig om de LED blauw te krijgen, hoe kan dit?
Het lijkt er op dat de eerste vergelijking of de counter waarde groter dan "0" is niet werkt...
Weer een setje haakjes vergeten? |:(

De code

c code:


#include "SparkFun_Qwiic_Twist_Arduino_Library.h"                       //Click here to get the library: http://librarymanager/All#SparkFun_Twist
//#include <EEPROM.h>
//int addr = 0;

TWIST twist;                                                            //Create instance of this object

void setup() {
  Serial.begin(115200);
  Serial.println("Qwiic Twist Counter Limit voorbeeld");

  twist.begin();

  Wire.setClock(400000);                                               //Optional: After Twist begin(), increase I2C speed to max, 400kHz

  twist.setLimit(0);                                                   // setLimit moet op "0" staan voor goede werking van de limit waarden in de loop code

  twist.setCount(8);                                                   // plaatst een voorkeurwaarde in de counter als er opgestart wordt b.v. hier 8
  
}

void loop() {
    
  if ((twist.getCount()) >= 15) {
  twist.setCount(15);                                                 // als de counter een waarde heeft die hoger is dan 15 zet de counter terug naar 15 
  twist.setColor(255, 0, 0);                                          // als bovenstaande waar is, maak dan de encoder LED rood

  Serial.println();
  Serial.print("Counter Max. is bereikt!");
  }
  
  else if ((twist.getCount()) < 0) {
  twist.setCount(0);                                                  // als de counter een waarde heeft die lager is dan "0" zet de counter terug naar "0"
  twist.setColor(0, 0, 255);                                          // als bovenstaande waar is, maak dan de encoder LED blauw
  Serial.print("Counter Min. is bereikt!");
  }
 
 
  Serial.print("Count: ");
  Serial.print(twist.getCount());
  Serial.println();

 if (((twist.getCount()) > 0) && ((twist.getCount()) < 15)){          // als de counter waarde groter is dan "0" en lager is dan "15" maak dan de encoder LED groen  
  twist.setColor(0, 255, 0);                                          // als bovenstaande waar is, maak de encoder LED groen
 }

  delay(1);
}

Groet,
Bram

Waarheden zijn "Illusies waarvan men vergeten is dat het illusies zijn"

Bij de 'nul' gaat het niet goed. Bij de 'vijftien' gaat het wel goed.
Er is een verschil hoe je 'vijftien' behandelt en hoe je de 'nul' behandelt.
Bij 'vijftien' schrijf je:

c code:

  if ((twist.getCount()) >= 15) {
  twist.setCount(15);                                                 // als de counter een waarde heeft die hoger is dan 15 zet de counter terug naar 15 
  twist.setColor(255, 0, 0);                                          // als bovenstaande waar is, maak dan de encoder LED rood
enz.

Bij 'nul' schrijf je:

c code:

  else if ((twist.getCount()) < 0) {
  twist.setCount(0);                                                  // als de counter een waarde heeft die lager is dan "0" zet de counter terug naar "0"
  twist.setColor(0, 0, 255);                                          // als bovenstaande waar is, maak dan de encoder LED blauw
enz.

Volgens mij ben je er als je daar ook schrijft:

c code:

  else if ((twist.getCount()) <= 0) {
  twist.setCount(0);                                                  // als de counter een waarde heeft die lager is dan "0" zet de counter terug naar "0"
  twist.setColor(0, 0, 255);                                          // als bovenstaande waar is, maak dan de encoder LED blauw
enz.

Heb je geen last in standje 15 dat hij telkens schrijft: "Counter Max. is bereikt!"?

Bezoek mijn neefjes' site: www.tinuselectronics.nl
blackdog

Golden Member

Hi ohm pi

Ik had expres "< 0" gebruikt i.p.v "<= 0" omdat ik met de laatste vergelijking, dus gelijk of kleiner dan "0" als ik snel draai,
waarden krijg die kleiner zijn dan "0" in de serieele monitor, die dan wel weer worden gecorrigeerd naar de counter waarde "0".
Ik bedoel natuurlijk -1, -2, -3 enz. afhankelijk van hoe snel ik draai.

Ik begrijp echt niet waarom er een verschil is in het gedrag.

Groet,
Bram

Waarheden zijn "Illusies waarvan men vergeten is dat het illusies zijn"

Ik heb een vreemd effect, als eerste wat goed gaat.
Als ik omhoog draai en bij 15 aankom wat ik als maximum heb gesteld, dan wordt de counterwaarde net jes begrenst en ook de LED i nd encoder wordt rood.
Draai ik nu 1 klik linksom, dan wordt de counter waarde netjes 14 en de LED wordt groen.

En dan nu wat niet goed gaat.
Draai ik vanaf 14 verder omlaag naar counter stand "0" (stat op "0" in de serieel monitor) dan blijft de LED nog steeds groen!
Draai ik nu nog 1 klik linksom dan blijft de counter op "0" staan en nu wordt blauw.
Draai ik de encoder 1 klik weer rechtsom dan wordt direct de LED weer groen bij de couter waarde van "1"

Als ik dit lees komt dat overeen met wat er in je code staat. Er gebeurt dus niets vreemds. Ow en besteed ook tijd aan de opmaak van je code, dit maakt het een stuk leesbaarder. Nu zag ik dat mijn opmaak in het vorige voorbeeldje ook niet meer klopte ik vermoed dat CO er iets mee heeft gedaan.

Wat heb ik gedaan:
stap 1, Doe de limitering.
stap 2, Aansturen ledjes.
stap 3, Print de actuele tel waarde.

Wat trouwens ook kan helpen is om eerst een flow voor jezelf uit te tekenen. Dat geeft vaak de fouten weer. Ook een handige tip, lees de code regel voor regel zoals de processor dat zou doen.

Als ik goed begrijp wat je wilt zou ik er het volgende van maken.

c code:



void loop() 
{
	//Limiet bovengrens
	if (twist.getCount() > 15) 
	{
		twist.setCount(15);                                                 
		Serial.println("Counter max berijk, gecorrigeerd naar 15.");
	}
	
	//Limiet ondergrens
	if (twist.getCount() < 0) 
	{
		twist.setCount(0);                                                 
		Serial.println("Counter min berijk, gecorrigeerd naar 0.");
	}
	
	
	if(twist.getCount() == 0)
	{
		twist.setColor(255, 0, 0); 
	}
	else if(twist.getCount() == 15)
	{
		twist.setColor(0, 0, 255); 
	}
	else
	{
		twist.setColor(0, 255, 0); 
	}
	  
	Serial.print("Count: ");
	Serial.println(twist.getCount());

	delay(1);
}

Die extra haakjes zijn niet echt nodig, maar mag wel:

code:


 if ((twist.getCount()) >= 15) {

is hetzelfde als

code:


 if ( twist.getCount()  >= 15) {

Ook als het ingewikkelder wordt zijn de haakjes niet echt nodig.

code:


 if (((twist.getCount()) > 0) && ((twist.getCount()) < 15)){

Kun je ook schrijven als

code:


 if (( twist.getCount() > 0) && ( twist.getCount() < 15) ) {

of zelfs als

code:


 if ( twist.getCount() > 0 && twist.getCount() < 15 ) {

Maar die laatste is gevaarlijk want dan gaat de compiler zelf de volgorde van de bewerkingen bepalen. Dat zal in dit geval nog wel goed gaan ook, maar voor mij wordt het dan wel moeilijk om het nog te volgen. Ik zou dus hier voor optie 2 gaan.

De Arduino IDE helpt wel bij het plaatsen van haakjes. Als de cursor naast een haakje staat dan komt er een vierkantje bij het corresponderende haakje aan de andere kant. Dan kun je zien of er staat wat je bedoelt.

Dat werkt ook met krulhaakjes en met rechte haakjes, en ook als je een pagina verder scrolt om de andere kant in beeld te krijgen.

Op 12 juni 2020 16:07:42 schreef deKees:

code:


 if ( twist.getCount() > 0 && twist.getCount() < 15 ) {

Maar die laatste is gevaarlijk want dan gaat de compiler zelf de volgorde van de bewerkingen bepalen.

Als die compiler zelf iets verzint, dan moet je die zo snel mogelijk weggooien. De evaluatievolgorde is ook in de laatste voorbeeld precies vastgelegd en een goede compiler wijkt daar dus niet van af. Voor de ene programmeur ziet het er overzichtelijk uit, want er zijn weinig haakjes. Een ander denkt er anders over en die voegt extra haakjes toe om het voor hem of haar overzichtelijk te maken. Een probleem is wel dat je aan de instructie "twist.getCount()" niet kunt zien of het een functie of een macro is. Bij een macro zijn extra haakjes een goede voorzorgsmaatregel om de code correct te evalueren.

Op 12 juni 2020 13:22:37 schreef blackdog:
Hi ohm pi

Ik had expres "< 0" gebruikt i.p.v "<= 0" omdat ik met de laatste vergelijking, dus gelijk of kleiner dan "0" als ik snel draai,
waarden krijg die kleiner zijn dan "0" in de serieele monitor, die dan wel weer worden gecorrigeerd naar de counter waarde "0".
Ik bedoel natuurlijk -1, -2, -3 enz. afhankelijk van hoe snel ik draai.

Ik begrijp echt niet waarom er een verschil is in het gedrag.

Groet,
Bram

In je originele code gebeurt het volgende:
We gaan vanuit dat de teller van 14 naar 0 gaat.
Als de teller '1' is dan brandt de groene led.
De instructie

c code:

else if ((twist.getCount() < 0) {
  twist.setCount(0);                                                  // als de counter een waarde heeft die lager is dan "0" zet de counter terug naar "0"
  twist.setColor(0, 0, 255);                                          // als bovenstaande waar is, maak dan de encoder LED blauw
enz.

wordt niet uitgevoerd. De blauwe led wordt niet aangezet en de groene led wordt niet uitgezet
Nu maak je de teller '0'
De code

c code:

 if (((twist.getCount()) > 0) && ((twist.getCount()) < 15)){ 

zet alleen maar de groene led aan en overige kleuren uit. Deze code wordt niet meer uitgevoerd.
De blauwe led gaat niet aan en de groene led gaat niet uit, want twist.getCount() is '0'. De code

c code:

else if ((twist.getCount() < 0) {
  twist.setCount(0);                                                  // als de counter een waarde heeft die lager is dan "0" zet de counter terug naar "0"
  twist.setColor(0, 0, 255);                                          // als bovenstaande waar is, maak dan de encoder LED blauw
enz.

wordt niet uitgevoerd.
Als je nog een klikje omlaag draait, dan wordt twist.getCount() -1.
Nu wordt de code

c code:

else if ((twist.getCount() < 0) {
  twist.setCount(0);                                                  // als de counter een waarde heeft die lager is dan "0" zet de counter terug naar "0"
  twist.setColor(0, 0, 255);                                          // als bovenstaande waar is, maak dan de encoder LED blauw
enz.

wel uitgevoerd. De blauwe led gaat nu aan en "twist.setCount(0)" wordt terug op nul gezet.
Draai je weer naar "1", dan wordt de code

c code:

 if (((twist.getCount()) > 0) && ((twist.getCount()) < 15)){          // als de counter waarde groter is dan "0" en lager is dan "15" maak dan de encoder LED groen  
  twist.setColor(0, 255, 0);                                          // als bovenstaande waar is, maak de encoder LED groen
 }

uitgevoerd en de led verspringt van blauw naar groen.

De manier waarop hardbass de code schrijft is een stuk overzichtelijker dan wat wij schrijven. Enig minpuntje is dat hij printinstructies in zijn begrenzingscode opneemt. Deze printopdrachten wijken iets af van wat jij geschreven hebt. Ook de plaats wijkt af van zijn eigen programmeervoorschriften.

stap 1, Doe de limitering.
stap 2, Aansturen ledjes.
stap 3, Print de actuele tel waarde.

[Bericht gewijzigd door ohm pi op 12 juni 2020 20:59:28 (64%)]

Bezoek mijn neefjes' site: www.tinuselectronics.nl
blackdog

Golden Member

Hi,

Morgen verder met het project, maar vandaag twee printjes van deKees binnen gekregen, en daar heb ik er één van bijna volgebouwd.
Dank Kees!

Ik ben één printje aan het opbouwen, en dit is voor mij de achterzijde en voorzien van aansluitstripjes.
https://www.bramcam.nl/Diversen/Rotary3-deKees/Rotary3-deKees-01.png

De voorzijde, zie je het deKees???
De LED's zijn nog niet aangebracht, moet ze nog uitzoeken, en de hoogte uitmeten.
https://www.bramcam.nl/Diversen/Rotary3-deKees/Rotary3-deKees-02.png

Het IC op het voetje is wel een beetje hoog, maar ik heb het uitgemeten, met een extra moer en tandring op de encoders, komt de moer aan de voorzijde net mooi vlak uit.
Ik bouw een klein kastje met de drie encoders er in, i2c display, i2c klok module in misschien en mischien nog een paar onderdelen die handig zijn voort een breadboard opset.
Ik weet niet of deKees zelf nog een een topic maakt, maar ik wou in ieder geval mijn i2c breadboard hier op CO laten zien.

DeKees,
Ik doe via de e-mail wel mijn opmerkingen, maar spaar even wat op, tot dat ik het eerste printje getest heb.

Groet,
Bram

Waarheden zijn "Illusies waarvan men vergeten is dat het illusies zijn"

Hey,

Is het nog gelukt met de regeling?

Ik kon het zelf niet laten om ook een beetje met PID te spelen. Ik heb de regelaar van die link een paar posts geleden geïmplementeerd in de Arduino. Om te testen heb ik een weerstand aan een DS18B20 getaped. Ik heb ervoor gekozen om in de test niets te filteren, de DS18B20 geeft vrij nette sample waardes dus dat is in mijn situatie niet nodig. De Arduino gooit de gemeten waarde en de PWM duty cycle naar buiten die ik dan plot in een grafiekje. De temperatuur is aangegeven met de rode lijn in 10°C/div en een offset van -20°C. De gele lijn geeft de duty cycle weer van 0 - 255. (64/div en een offset van -255)

De setpoint waar hij naartoe regelt is 40°C . Zoals je ziet heeft hij behoorlijk overshoot tot wel 50°C en hij is ook niet helemaal stabiel op het einde. Hij oscilleert nog wel iets, maar dat is natuurlijk een kwestie van tunen. In theorie zou ik met deze data een schatting kunnen maken van de overdracht van het systeem. Als ik die heb zou ik de optimale PID kunnen berekenen. Maar daar moet ik wel weer even de theorie voor boven halen. Misschien wel een leuke uitdaging

De instellingen van de PID:
Ts = 1 sec
P = 100
I = 10
D = 0

blackdog

Golden Member

Hi hardbass, :-)

Leuk dat je er mee bezig bent!
ik ben zelf nu weer even bezig met de stroomtransformator stuurprint en een temperatuur sensor calibrator die ik nog af moest maken.
Dat ding heb ik nu al regelmatig nodig gehad maar had nog wat mechanisch werk nodig om hem af te bouwen, dat is nu gestart.

Uhm, ik heb hier op CO al een topic over een PID oven en die kan je vinden in de onderstaande link

Scrol dan naar deze tijd, da nkan je zien wat mogelijk is met een Nano die opgevoerd is, dat is andere externe referentie en goed ontkoppeld.
Gepost zondag 13 november 2016 11:40:37

https://www.circuitsonline.net/forum/view/133966/5#highlight=pid

Nu weer verder met de relais sturing van de stroommeet trafo!

Groet,
Bram

Waarheden zijn "Illusies waarvan men vergeten is dat het illusies zijn"