Ga naar inhoud


Aanbevolen berichten

  • Moderator
Geplaatst:

Ik ben al een tijdje bezig om een aquarium-controller te bouwen .Het test systeem werkt al naar behoren.

Het gaat om deze controller:

http://www.plantedtank.net/forums/20-diy/677265-iaqua-my-touch-interface-aquarium-controller-arduino.html

 

Omdat ik zo min mogelijk draden van de arduino wil laten lopen heb ik in mijn test systeem een velleman k8000 I2C expander board gebruikt. Ook dit werkt zoals het moet werken.

Alle ledjes op de k8000 gaan afzonderlijk aan/uit.

 

Maar nu wordt het (voor mij iig) vreemd.

 

Ik heb voor het eigenlijke systeem een relaisboard gemaakt en de pcf8574p is op dezelfde manier aangesloten als op het k8000 bordje.

 

Het I2C adres van dit relais boardje is hetzelfde als de k8000 en daarom hoef ik de code niet te veranderen die in de arduino zit van mijn test systeem.

Alle ledjes gaan aan en als de chip aangesproken wordt gaan alle ledjes ook weer netjes uit. Niks aan het handje dus.

 

Nu zet ik bijv de verwarming aan, led en het relais gaan netjes aan.

Maar als ik nu de CO2 poort aanzet dan gaat deze led wel aan maar de verwarming gaat dan uit.

Dit doet hij over alle poorten van de chip.

Er gaan niet meer dan 1 led per keer aan.

 

Maar wat maakt het nu dat de k8000 wel naar behoren werkt en de zelfbouw niet?

 

Ik zou dan toch op beide systemen een bitwise moeten doen? want het schuiven van bitjes is geen hardwarematige zaak en de software heb ik niet aangeraakt.

 

En hoe ging dat nog eens als je elke led afzonderlijk aan wilt zetten? Ik heb het wel geweten maar dat is een eeuwigheid terug en ik kan het me niet meer voor de geest halen.

Het was wat met XOR en AND dacht ik.

 

Ik heb de arduino code en library toegevoegd.

 

hier het schema van de k8000 board:

 

 

 

 

k8000schema.jpg

MrAqua_v2_3_4_test1.zip

pcf8574_test1.zip

Een smartphone is een hulpmiddel, geen levensstijl 

Kijk rond IN de wereld in plaats van voorover gebogen NAAR de wereld.


  • Moderator
Geplaatst:

Eindelijk toch gevonden :)

 

in de pcf8574 library een paar tekens weg gehaald en nu werkt het wel.

 

Orginele code:  if (Wire.requestFrom(_address, (uint8_t)1) != 1)

 

en de aangepaste versie:  if (Wire.requestFrom(_address, (uint8_t)1) )

 

Mischien heeft iemand er hier wat aan als hij/zij met een arduino en I2C gaat spelen.

 

Een smartphone is een hulpmiddel, geen levensstijl 

Kijk rond IN de wereld in plaats van voorover gebogen NAAR de wereld.

Geplaatst:

Ik ben niet helemaal mee.

 

In de originele code, werd gekeken of een waarde niet gelijk was aan 1 (met de !=); maar in jouw aangepaste versie zal er niet veel meer gecontroleerd worden.

Dus, ongeacht wat er uitgelezen wordt en welk resultaat dat heeft/geeft, kom je steeds in je true statement.

[Vu+ Solo4K] - [VTi 13.x]

[TVV Basic+] - [CD TopHD]
Ik vind het nieuwe overzicht met ongelezen topics in een tijdslijn maar niks...

  • Moderator
Geplaatst:
uint8_t PCF8574::read8()
{
    if (Wire.requestFrom(_address, (uint8_t)1) != 1)
    {
        _error = 10;
        return _data; // last value
    }
#if (ARDUINO <  100)
    _data = Wire.receive();
#else
    _data = Wire.read();
#endif
    return _data;
}


er wordt een waarde van de chip gevraagd als deze niet gelijk is aan 1.

 

Maar als er meerdere ledjes aanstaan dan is de waarde altijd niet gelijk aan 1 dus zal hij de waarde niet wegschrijven naar _data ?

 

de 2e IF statement is om te kijken of de arduino versie ouder of nieuwer is dan versie 1.00

Dit is belangrijk omdat de wire library verandert is .

 

Ik ben net begonnen met coderen dus nog een beginner.

Waarom hij het wel doet met de velleman board weet ik niet.

Maar op deze manier doet de code het wel met de zelfbouw expander. Tot nu toe nog geen fouten gezien in het relais bordje. 

 

Als iemand wel de juiste oplossing weet ben ik al heel erg blij.

Een smartphone is een hulpmiddel, geen levensstijl 

Kijk rond IN de wereld in plaats van voorover gebogen NAAR de wereld.

Geplaatst:

Maar die tweede if staat wel in comment.
Dus, je gaat _data eerst opvullen via Wire.receive en dan via Wire.read.
 
 

Maar als er meerdere ledjes aanstaan dan is de waarde altijd niet gelijk aan 1 dus zal hij de waarde niet wegschrijven naar _data ?

Hier ben je me even kwijt.

Indien je _data altijd wil opvullen zou het me logischer lijken om dergelijke check helemaal niet te doen.

[Vu+ Solo4K] - [VTi 13.x]

[TVV Basic+] - [CD TopHD]
Ik vind het nieuwe overzicht met ongelezen topics in een tijdslijn maar niks...

  • Moderator
Geplaatst:

_data moet altijd 1 byte lang zijn want de chip heeft 8 poorten.

 

Elke poort heeft een eigen relais voor bijv de pomp, verlichting, verwarming , CO2 enz.

 

Als de verwarming uit moet schakelen dan moet alleen het desbetreffende bit omgezet worden onafhankelijk van de waarde van de andere bits.

 

het is immers onwenselijk dat de pomp uitgaat als de verwarming aangaat.

Hij zal dus eerst de waarde van die ene byte moeten ophalen en dan via bitwise de juiste 1 of 0 zetten.

Dus waarom die check erin zit snap ik ook niet maar nog meer niet waarom hij het wel goed doet op die velleman print.

 

De tweede IF statement zegt imo dat ALS de versie van de arduino programeeromgeving kleiner is dan 100 dat wire.receive gebruikt wordt en ALS de versie hoger dan 100 is dan wordt dit wire.read

Ik heb al eens een wire receive gebruikt op een 1.6.1 versie van de arduino omgeving en dan kent hij het commando wire.receive niet. wel wire.read

Een smartphone is een hulpmiddel, geen levensstijl 

Kijk rond IN de wereld in plaats van voorover gebogen NAAR de wereld.

Geplaatst: (aangepast)

Hier zie je gelijk het grootste probleem waar je tegenaan loop als je software gebruikt die door een ander is geschreven.

Omdat je soms niet begrijpt waarom die persoon het op die manier heeft gedaan.

 

Mijn vraag is ook, ben je zo blind in dit project gestap zonder Arduino programeer kennis?

Ik neem aan dat je dit doet, omdat je andere programeer talen beheerst en dus kun je dit eenvoudig volgen.

 

Goed, nu naar de verklaring van je probleem dat er maar 1 relay/LED aan komt als je aanstuurt.

 

Als je het datasheet en I2C begrijpt, weet je dat I2C een seriele bus is.

Je zal dus elke output status dus elke keer mee moeten zenden als je maar 1 output status wilt wijzigen.

 

Dus was 0000.0010 (2) + 8 => aansturen met  0000.1010 (10) 

 

De oude status zou in je geheugen/EEPROM (als je hem opslaat) kunnen staan, of je moet hem gaan halen.

PCF8574 I_O.pdf

aangepast door donpedro

VU+ Zero & VU+ Solo2 - VTi 11.x  Unstable Oscam 11xxxx  MacBook Pro Ubuntu 16.04LTS

  • Moderator
Geplaatst:

Ik heb weinig programeerkennis maar heb wel al kleinere dingen met een arduino gedaan. Daarom wordt het "lezen" van de code telkens wat eenvoudiger.

electronica kennis heb ik wel.

 

Dit is een groter project wat ik aan het doen ben en het begint er goed uit te zien :)

Die I2C verbinding heb ik er zelf ingebouwd, in de orginele code zat dit er niet in. Maar ik wilde minder draden naar de arduino hebben en heb daarom I2C erin geprogrameerd.

ook had ik een bug gevonden en uit de code gehaald.

En ik heb een soort 5 volt ringleiding moeten maken omdat de poorten van de I2C chips wordt vastgehouden als de arduino afgekoppelt wordt. Logisch maar niet gewenst want ik wil niet dat de verwarming of doseringspomp aanblijft als ik aan het systeem iets wil veranderen.

Nu gaat de spanning van de I2C chips als de verbinding verbroken wordt :)

 

Learning by doing werkt bij mij gewoon het beste. Maar het is soms wel even moeilijk.

 

zoals het uitziet werkt de I2C code toch gewoon zoals het hoort zonder die vergelijking die ik eruit heb gesloopt.

Nog geen foute schakelmomenten gehad.

 

Ik heb wel weer een ander "probleempje" maar dit is meer een gebruikers ongemakje.

Voor het dimmen van de LED's gebruik ik een PCA9685 icm dimbare led drivers.

In het settings menu zijn deze echter omgekeerd.

Als ik in het menu meer licht wil dan worden deze minder fel. In het menu betekend vol open dus licht uit.

 

Weer een uitdaging die me zeker gaat lukken.

Een smartphone is een hulpmiddel, geen levensstijl 

Kijk rond IN de wereld in plaats van voorover gebogen NAAR de wereld.

Geplaatst:

Met weinig programeer kennis moet ik zeggen dat zit een stevige duik is.

Veel vallen en opstaan en dan vooral doorgaan en er van leren is een goed motto.

 

Dat vasthouden van de data zolang er spanning staat op de slave is in veel gevallen juist het gewenste gedrag, maar als je inderdaad er aan wilt sleutelen is dat niet gewenst.

Zit er geen 'power down' mogelijkheid ingebouwd? ... of anders inbouwen?

 

Heb net even dat LED chipje bekeken, hopelijk heb je daar een library voor .. is een stevige jongen voor een beginner om die even probleemloos aan te sturen.

Wat ik wel tegenkwam en wat ook wel eens de bron van je probleem zou kunnen zijn, maar dat weet ik niet zeker, staat op pagina 29 van het datasheet.

 

Kijk daar eens naar en dan naar je gebruikte driver circuit.

 

Veel succes met dit uitdagende project.

PCA9685 EXT Driver.pdf

VU+ Zero & VU+ Solo2 - VTi 11.x  Unstable Oscam 11xxxx  MacBook Pro Ubuntu 16.04LTS

  • 3 weken later...
  • Moderator
Geplaatst:

Het is me gelukt om de ledverlichting via de PCA9685 aan te sturen.  

 

Eerst had ik het probleem met de ge-inverteerde led drivers. Lastig was dat de Ledstrips wel normaal werkte. Om in de library de juiste bit zetten was daardoor geen oplossing want dan zouden de ledstrips verkeerd om werken.

 

Ik heb het probleem opgelost met een fet en enkele weerstanden die de uitgang van de PCA inverteert. En dat werkt nu perfect.

Maar nu heeft de software te weinig PWM regelaars dus dat wordt weer een uitdaging.

Ik moet OF een nieuwe pagina maken of de regelaars smaller maken zodat ik ruimte heb voor minimaal 3 extra kanalen.

 

Maar het is nu al leuk om de "zon" op te zien komen en weer onder te zien gaan in de aquarium.

Een smartphone is een hulpmiddel, geen levensstijl 

Kijk rond IN de wereld in plaats van voorover gebogen NAAR de wereld.

Geplaatst:

 

Ik moet OF een nieuwe pagina maken of de regelaars smaller maken zodat ik ruimte heb voor minimaal 3 extra kanalen.

 

Enige duiding met bv een screenshot zou iets makkelijker zijn om je hier te volgen.

Mogelijk kan er dan wel feedback komen over hoe je te werk zou kunnen gaan...

[Vu+ Solo4K] - [VTi 13.x]

[TVV Basic+] - [CD TopHD]
Ik vind het nieuwe overzicht met ongelezen topics in een tijdslijn maar niks...

  • Moderator
Geplaatst:

Ha big fellow..

De hardware werkt inmiddels wel, het is puur de programering wat gedaan moet worden.

 

De_Perre..

 

Je hebt helemaal gelijk. Hier de foto van het orgineel. Hier zie je maar 6 sliders en de PCA9685 heeft 16 uitgangen. En ik heb er minimaal 8 nodig om mijn ledstrips en powerleds aan te sturen.

 

settings_leds.jpg

 

De sliders mogen wel smaller zijn om ruimte te krijgen voor de 2 extra kanalen.

Daar ben ik al wat aan het proberen maar heb nog niet gevonden hoe de sliders smaller te maken.

settings_leds.jpg

Een smartphone is een hulpmiddel, geen levensstijl 

Kijk rond IN de wereld in plaats van voorover gebogen NAAR de wereld.

Geplaatst: (aangepast)

Ben even aan het neuzen geweest in MrAqua_v2_3_4_test.ino, en heb daar wel een stuk gevonden dat mogelijk de aansturing van die sliders op zich neemt.

void drawLEDBarGraph(byte barNum, int value)
{
  int x,y;
  char char5[5];
  
  Serial.print(F("Bar:"));
  Serial.println(barNum);
  Serial.print(F("Percent:"));
  Serial.println(value);
    
  //determine xy coordinates based on bar being displayed
  if(barNum == 1){x=10;y=185;}
  if(barNum == 2){x=48;y=185;}
  if(barNum == 3){x=86;y=185;}
  if(barNum == 4){x=124;y=185;}
  if(barNum == 5){x=162;y=185;}
  if(barNum == 6){x=200;y=185;}
  
  //erase old bargraph & percentage
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(x-3,y-10,x+28,y-1);
  myGLCD.fillRect(x+1,y+1,x+27,y+99);
  
  //draw new bargraph
  myGLCD.setColor(VGAColor[barColors[barNum-1]]);
  myGLCD.drawRect(x,y,x+28,y+100);
  myGLCD.fillRect(x,(y+100-value),x+28,(y+100));
  
  //write percentage
  myGLCD.setFont(Sinclair_S);
  myGLCD.setColor(VGA_WHITE);
  itoa(value, char5, 10);
  strcat(char5,"%");
  if(value < 100) x = x + 8;
  if(value < 10) x = x + 8;
  myGLCD.print(char5,x-3,y-10);
}
Ik denk dat je in deze onderstaande lijnen de nodige aanpassingen zal moeten maken:

 //determine xy coordinates based on bar being displayed
  if(barNum == 1){x=10;y=185;}
  if(barNum == 2){x=48;y=185;}
  if(barNum == 3){x=86;y=185;}
  if(barNum == 4){x=124;y=185;}
  if(barNum == 5){x=162;y=185;}
  if(barNum == 6){x=200;y=185;}
  
  //erase old bargraph & percentage
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(x-3,y-10,x+28,y-1);
  myGLCD.fillRect(x+1,y+1,x+27,y+99);
  
  //draw new bargraph
  myGLCD.setColor(VGAColor[barColors[barNum-1]]);
  myGLCD.drawRect(x,y,x+28,y+100);
  myGLCD.fillRect(x,(y+100-value),x+28,(y+100));
Voor elke barNum zal je een x en y coördinaat moeten opgeven. Laat voor Y die 185 maar staan; maar voor x wordt het iets anders.

Om het wat makkelijk te houden zal ik er van uit gaan dat een coördinaat van x=10 zoveel wil zeggen als 10px.

 

Voor barNum 1 heb je dus de start op 10px; en bij het opvullen wordt er een offset van +28 gehanteerd => wordt er op 38px de bar afgesloten

Barnum2 begint op 48px + 28px

en zo maar verder...

 

Stel dat je zegt, ik ben tevreden met bars van 20px; er tussenin zou ik 5 px willen, dan zou je normaal op volgende code uitkomen:

//determine xy coordinates based on bar being displayed
  if(barNum == 1){x=10;y=185;}
  if(barNum == 2){x=35;y=185;}
  if(barNum == 3){x=60;y=185;}
  if(barNum == 4){x=85;y=185;}
  if(barNum == 5){x=110;y=185;}
  if(barNum == 6){x=135;y=185;}
  
  //erase old bargraph & percentage
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(x-3,y-10,x+20,y-1);
  myGLCD.fillRect(x+1,y+1,x+19,y+99);
  
  //draw new bargraph
  myGLCD.setColor(VGAColor[barColors[barNum-1]]);
  myGLCD.drawRect(x,y,x+20,y+100);
  myGLCD.fillRect(x,(y+100-value),x+20,(y+100));
Je moet echter nog een en ander definiëren voor 'barNum == 7' en 'barNum == 8' qua kleur etc. Maar ik vermoed dat je dat stuk al in orde hebt.

Om die ook op 25 px breed te hebben:

//determine xy coordinates based on bar being displayed
  if(barNum == 1){x=10;y=185;}
  if(barNum == 2){x=35;y=185;}
  if(barNum == 3){x=60;y=185;}
  if(barNum == 4){x=85;y=185;}
  if(barNum == 5){x=110;y=185;}
  if(barNum == 6){x=135;y=185;}
  if(barNum == 7){x=160;y=185;}
  if(barNum == 8){x=185;y=185;}
  
  //erase old bargraph & percentage
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(x-3,y-10,x+20,y-1);
  myGLCD.fillRect(x+1,y+1,x+19,y+99);
  
  //draw new bargraph
  myGLCD.setColor(VGAColor[barColors[barNum-1]]);
  myGLCD.drawRect(x,y,x+20,y+100);
  myGLCD.fillRect(x,(y+100-value),x+20,(y+100));
**edit$$

typo bij 'het neuzen'; spatie op foute plek

aangepast door De_Perre

[Vu+ Solo4K] - [VTi 13.x]

[TVV Basic+] - [CD TopHD]
Ik vind het nieuwe overzicht met ongelezen topics in een tijdslijn maar niks...

  • Moderator
Geplaatst:

Hallo De_Perre..

 

Dankzij jouw hulp ben ik een heel stuk verder gekomen.

Alvast een bedankje hiervoor :D

Zo heb ik nog een kanaal erbij kunnen programmeren (want die 9e kanaal paste gewoon nog netjes op het scherm) maar ook het gedeelte wat de chip aanstuurt aan de praat gekregen.

En het touch gedeelte werkt nu ook zoals het hoort.

 

En ik heb bij een ander scherm pagina , waar ik de kleuren kan kiezen voor de kanaal sliders, zo aangepast dat deze ook werkt.

Het lastigste vond ik het bepalen van de co-ordinaten van de onderdelen op het scherm. Daar rookte mijn dakpan redelijk van.

 

Volgende wat ik nu wil doen is het aansturen van de fan's op de lichtkap. deze wilde ik eerst aansturen met een pcf8574 maar het is onzin om een chip met 8 uitgangen maar 1 te gebruiken als ik op die PCA chip nog genoeg poorten vrij heb.

Ik kan een PCA poort ook als schakelpoort gebruiken.

Mischien kan ik hem dan later zo aanpassen dat de snelheid v.d. ventilatoren op temperatuur werken.

Nu is het zo dat de fan's via een PCF8574 aan of uit zijn bij een bepaalde ingestelde temperatuur.

 

En als iemand de aquarium computer na wilt bouwen dan kan dat uiteraard. Hoe meer zielen des te meer vreugde :)

Software en details kan men gewoon bij mij krijgen .

Of ik zet ze hier op het forum.

Een smartphone is een hulpmiddel, geen levensstijl 

Kijk rond IN de wereld in plaats van voorover gebogen NAAR de wereld.

Maak een account aan of log in om te reageren

Je moet een lid zijn om een reactie te kunnen achterlaten

Account aanmaken

Registreer voor een nieuwe account in onze community. Het is erg gemakkelijk!

Registreer een nieuwe account

Inloggen

Heb je reeds een account? Log hier in.

Nu inloggen
×
×
  • Nieuwe aanmaken...