besturings vraag

Beste leden
Ik ben ook een beginner met de Arduino
ben bezig voor een klant een besturing te maken voor een proto type
het wordt een soort stoom unit
het zou moeten starten met 1 knopje
en dan vervolgens gaan opwarmen tot de temperatuur bereikt wordt
via een input die hoog wordt
daar na wat 3 of 4 verschillende relais die qua tijd aan of uit moeten gaan
als dit gedaan is weer terug naar het beging
ik heb wat in de software gemaakt maar ik weet even niet waar ik de input voor de schakelaar en de input voor de temperatuur sensor kwijt moet
zou daar iemand mij willen helpen

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


void setup() {
 // initialize the digital pins as an output.

 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);
 pinMode(6, OUTPUT);
 pinMode(7, OUTPUT);
}

void loop() {

 delay(2000);              // wait for a second
 lcd.print("cleaner");
 digitalWrite(4, HIGH);   // Turns ON Relay on digital pin 4
 delay(2000);              // wait for a second
 lcd.print("opwarmen");
 digitalWrite(4, LOW);   // Turns OFF Relay on digital pin 4
 delay(1000);              // wait for a second
 digitalWrite(5, HIGH);    // Turns ON Relay on digital pin 5
 delay(2000);              // wait for a second
 delay(2000);              // wait for a second
 lcd.print("reingen");
 digitalWrite(4, LOW);   // Turns OFF Relay on digital pin 5
 delay(1000);              // wait for a second
 digitalWrite(6, HIGH);   // Turns ON Relay on digital pin 6
 delay(2000);              // wait for a second
 delay(2000);              // wait for a second
 lcd.print("koelen");
 digitalWrite(4, LOW);   // Turns OFF Relay on digital pin 6
 delay(1000);              // wait for a second
 delay(2000);              // wait for a second
 lcd.print("afkoelen");
 digitalWrite(7, HIGH);    // Turns ON Relay on digital pin 7
 delay(2000);              // wait for a second
 digitalWrite(4, LOW);   // Turns OFF Relay on digital pin 4
 delay(1000);              // wait for a second
 delay(2000);              // wait for a second
 lcd.print("einde");
}

EDIT: jantje: added code tags

Hoi Michel

Als temperatuur sensor zou ik de volgende nemen:
DS18B20 Waterproof Digital Temperature Temp Sensor Probe deze versie is van metaal en kan tot +125 graden meten. op dit forum en internet zijn er voorbeelden van te vinden. als je deze voorbeelden bekijkt kom je al een heel eind.

Ook is het handig om voor je display een I2C versie te nemen (als dat nog gaat) scheelt een hoop aansluitingen die je voor wat anders kan gebruiken of een kleiner board nemen.

Vic

Hoi michel278, welkom.

Geleive even de gebruiksaanwijzing van dit forum (klik !) te lezen en ook de link naar de Engelstalige uitgebreidere variant daarvan even te volgen.

In de code die je hebt geplaatst word vooral veel niets gedaan, middels die delays.
Daar staat wat commentaar bij, namelijk "wacht een seconde".
Maar er word daar helemaal niet een seconde gewacht, maar bijna elke keer twee seconden.
Je denkt nu mogelijk "daar begint het geneuzel al", maar wat ik hiermee probeer te zeggen, is dat je ervoor moet zorgen dat een commentaar klopt, of je moet m weglaten.
Foute commentaren zijn onvergefelijk en kunnen je in grote problemen brengen, vooral als je nog maar net met deze materie bent begonnen.
Het is niet zo dat de code niet meer of anders werkt als de commentaren niet meer kloppen.
Maar je hebt jezelf ermee want als er iets heel anders gebeurt als wat in dat commentaar staat, hoe ga je dan over 8 weken, als je net terug komt van vakantie, de draad weer oppakken ?

Dan nog wat meer over de delays.
Ik zie een aantal malen een delay van 2000 mS, en dan nog een keer een delay van 1000 mS of nog een keer 2000 mS.
Waarom is dat zo ?
Was het niet veel beter een delay op maat te maken, dus van 3000 of 4000 mS ?

Verder zien ik ook dat je begint met even 2 seconden niets.
Daarna zet je een tekst op een scherm en schakelt een of ander relais in.
En weer 2 seconden wachten.
Dan zeg je op dat scherm dat je aan het opwarmen bent, om direct daarna dat relais weer uit te schakelen.

Nou ja zo gaat het een stukkie door met allerlei relais die worden in en uitgeschakeld.
Aangezien we niet weten wat je waar hebt aangesloten (of waar je dat wil gaan doen), kunnen we ook niet weten wat er precies gebeuren moet.
Maar het ziet er uit alsof je pas wat op je scherm zet, als je al klaar bent met de handeling.
Dus misschien is het beter om dan wat regels met elkaar te verwisselen.

Ik kan je ook van harte aanraden om wat minder abstractie in je code te creëren.
Dat kun je doen door een aantal constants te gebruiken.
Dat is een "variabele" die niet variabel maar dus constant is.

Die stel je zo in, nog voor void setup():

const int opwarmen=5;

Vervolgens kun je dus dit doen:

  digitalWrite(opwarmen, HIGH);   // Zet opwarmen aan

Dit heeft het voordeel dat de code ineens veel meer leesbaar word.
Als je je dit aanleert dan lees je je eigen code in de toekomst een stuk gemakkelijker terug.
De schakelaar kun je inlezen op een digitale ingang.
Ik kan er een verhaal over schrijven, maar kijk eens in de IDE naar Bestand - Voorbeelden - 02.Digital - Button.
Daar staat helemaal beschreven hoe je een drukknopje kunt verwerken.
Je ziet ook daar de const in gebruik trouwens.

Heb je de temperatuur sensor al, of weet je welke je wil gebruiken ?
Zo ja, welke is dat dan ?

michel voor een eerste programma is het eigenlijk prima, mooi comments etc.

iedere eerste beginner werkt met delay, en dus heeft mas3 zelfs in zijn onderschrift een regel staan.

dat is voor jou wel een heel goede (de reden komt straks wel.)

voor je temperatuurswitch bijvoorbeeld :
while (digitalRead(temppin)==LOW){//opwarmen}
dat is maar een begin.

schrijf een paar functies waar je het een en ander in doet.
zet in global de tijden in variabelen, die kun je dan via scherm aanpassen, zonder dat je telkens het programma moet veranderen.

als je dat blink without delay erin hebt zitten is de volgende stap case switch gebruiken.

erg bedankt voor de reacties
ik gebruik de themparatuur sensor die nu op de stoom ketel zit
deze schakelt via een relay gelijk de verwarmingselement uit
kan ik een schakel moment van het relay voor gebruiken dus gewoon aan/uit

ik zal de nieuwe code nogmaals laten zien
dus wordt vervolgt

weer een paar stappen verder
ik heb nu alles opnieuw geschreven
de besturing werk nu
wil allen nog een start button inbouwen
heb daar de software voor aangepast maar krijg fout melding
ik zie even niet waar het fout gaat
ben ook maar een beginner zullen we maar zeggen
iemand die daar even naar zou willen kijken??

// met de schakelbare uitgangen sturen we de cleaner
//
// met de button starten we de software
//

const int buttonPin = 2 // nummer waar de schakelaar zit

int (buttonState == low ) // variable van de schakelaar
void setup()
{
pinMode(8, OUTPUT); // relaiy 1 themparatuur//
pinMode(9, OUTPUT); // relaiy 2 stomen //
pinMode(10, OUTPUT);// relaiy 3 ventileren //
pinMode(11, OUTPUT);// drogen //

pinMode(7, INPUT); // schakelaar start //
}

void loop()
{
(buttonState == high )
digitalWrite(8, HIGH); // start relay //
digitalWrite(8, HIGH);// themparatuur//
delay(500);
digitalWrite(8, LOW);// //
delay(50);
digitalWrite(9, HIGH);// stomen aan//
delay(500);
digitalWrite(9, LOW);// stomen uit //
delay(50);
digitalWrite(10, HIGH);// ventileren aan//
delay(500);
digitalWrite(10, LOW);// ventirelen uit //
delay(50);
digitalWrite(11, HIGH); // drogen aan//
delay(500);
digitalWrite(11, LOW);// drogen uit //

}

Hoi michel278.

Ik heb je de vorige keer al gewezen op de gebruiksaanwijzing van dit forum.
Dat heb ik niet voor niets gedaan, maar schijnbaar heb jij nog geen tijd gehad om dat even te doen.
Doe dat daarom nu eerst maar eens en neem wat daar staat ter harte.

Je begint void.loop() met:

 (buttonState == high )

Dat is code die niets doet, behalve mogelijk een foutmelding genereren.
Want je vergelijkt daar buttonState met high, maar daar ga je vervolgens niets mee doen.
Zowel buttonState als high zijn variabelen die je niet hebt gedeclareerd.

Dat buttonState niet is gedeclareerd komt omdat je nog steeds in de regel zit die begint in regel 6.
Een regel sluit je af door de ; en dat heb je nog niet gedaan.
Dus volgt daar de eerste foutmelding over.
Dei foutmelding heeft tot gevolg dat wat jij denkt dat daar moet gebeuren, niet gebeurt.

Dat high een variabele is die niet gedeclareerd werd, klopt, want je hebt high ook niet gedeclareerd.
Variabelen zijn hoofdletter gevoelig, en daarom is high dus iets anders als High, hIgh, hiGh, higH en alles wat je daar mee kan combineren.
Je bedoelde dus iets anders als high.

De fouten hier zijn allemaal het gevolg van slordigheid.
Zorg ervoor dat je elke regel correct afsluit (dat gaat een paar keer fout in deze code).
En zorg ervoor dat je geen schrijffouten maakt.

Er staan 3 verschillende fouten in de code, en 2 daarvan komen meermaals voor.
Verder is deze code verre van af, maar dat kan als je nog aan het kijken bent of iets doet wat je wil.

[edit]
Ow, en verder: de foutmeldingen helpen je.
Ze vertellen je waar de fout precies gezien word, met regelnummer en (bij de recentere versies van de IDE) de positie op die regel.
Het is wel mogelijk dat deze fout ergens anders veroorzaakt word.

beste MAs3
Ik zeker de forum gebruiksaanwijzing gelezen
zie even niet wat ik fout doe
sorry daar voor

En heb je daarbij de link naar het Engelstalige deel daarvan ook gevolgd en gelezen ?
Met name punt 7 daarin ?

Ik hoop dat je inmiddels de hints naar oplossing van de foutmeldingen hebt begrepen en er mee aan de slag bent gegaan.

fouten gevonden in de code

inderdaad slordigheden
ik heb ook de regel 7 gelezen zal ik zo doen volgende keer als ik code post

maar ik zoek eigenlijk het GOTO commando
ik zou als de switch HIGH wordt naar regel 23 willen springen
Kan dat??

Nee dat kan niet.
Er is geen GOTO beschikbaar.

Om zoiets te doen, kun je of met verschillende functies werken, of je laat een bepaald stuk code alleen uitvoeren als er aan voorwaarden word voldaan, via een if bijvoorbeeld.
Behalve de if, is er ook nog de switch...case.
Daarmee kun je ook ver komen.
Nogmaals, GOTO lijkt het meest op een function (die eigenlijk nog meer op een GOSUB, dus een subroutine lijkt).

[code]
// met de schakelbare uitgangen sturen we de cleaner
//
// met de button starten we de software
//

const int buttonPin = 2; // nummer waar de schakelaar zit

int (buttonState) = 0; // variable van de schakelaar
void setup()
{
  pinMode(2, INPUT);
  pinMode(8, OUTPUT); // relaiy 1 themparatuur//
  pinMode(9, OUTPUT); // relaiy 2 stomen //
  pinMode(10, OUTPUT); // relaiy 3 ventileren //
  pinMode(11, OUTPUT); // drogen //
}

void loop(){
  
 buttonState = digitalRead(2);
 if (buttonState == HIGH) {       
    digitalWrite(8, HIGH); 
    }
  else { // niet starten:
    digitalWrite(8, LOW);
    }
  digitalWrite(8, HIGH);// start relay //
  digitalWrite(8, HIGH);// verwarming aan later de echte opwarm tijd vast stellen//
  delay(500);
  digitalWrite(8, LOW);// op themparatuur //
  delay(50);
  digitalWrite(9, HIGH);// stomen aan//
  delay(500);
  digitalWrite(9, LOW);// stomen uit //
  delay(50);
  digitalWrite(10, HIGH);// ventileren aan//
  delay(500);
  digitalWrite(10, LOW);// ventirelen uit //
  delay(50);
  digitalWrite(11, HIGH); // drogen aan//
  delay(500);
  digitalWrite(11, LOW);// drogen uit //

}end

[/code]

Ik heb de if else nu in gebouw maar de if en els zijn grijs
wat mis ik??

Grijs of zwart ?
Volgens mij is daar niets aan de hand hoor.
Als er daar iets fout zou gaan, dan mag het niet compileren.
Krijg je een foutmelding bij het compileren ?

Alleen de end aan het einde gaat niet goed, en de code tags zijn nog niet helemaal goed gegaan.
Maar daar zit nu dus verbetering in :wink:

Hoi MAS3

ik heb toch nog ergens een probleem
als ik code gebruikt gaan de relays lopen ( zoals bedoelt )
maar dat gaat gelijk lopen zonder de switch gebruik van de switch
gaar dus gelijk lopen

[code]
// met de schakelbare uitgangen sturen we de cleaner
//
// met de button starten we de software
//

const int buttonPin = 2; // nummer waar de schakelaar zit

int (buttonState) = 0; // variable van de schakelaar
void setup()
{
  pinMode(2, INPUT);
  pinMode(8, OUTPUT); // relaiy 1 themparatuur//
  pinMode(9, OUTPUT); // relaiy 2 stomen //
  pinMode(10, OUTPUT); // relaiy 3 ventileren //
  pinMode(11, OUTPUT); // drogen //
}

void loop(){
  
 buttonState = digitalRead(2);
 if (buttonState == HIGH) {       
    digitalWrite(8, HIGH); 
    }
  else { // niet starten:
    digitalWrite(8, LOW);
    }
    
  digitalWrite(8, HIGH);// start relay //
  digitalWrite(8, HIGH);// verwarming aan later de echte opwarm tijd vast stellen//
  delay(500);
  digitalWrite(8, LOW);// op themparatuur //
  delay(50);
  digitalWrite(9, HIGH);// stomen aan//
  delay(500);
  digitalWrite(9, LOW);// stomen uit //
  delay(50);
  digitalWrite(10, HIGH);// ventileren aan//
  delay(500);
  digitalWrite(10, LOW);// ventirelen uit //
  delay(50);
  digitalWrite(11, HIGH); // drogen aan//
  delay(500);
  digitalWrite(11, LOW);// drogen uit //
}

Hoewel geen MAS...maar als ik jouw code vertaal naar gewone taal staat er

Als ButtonState = HOOG dan
   zet pin 8 HOOG
anders
   zet pin 8 LAAG.
einde als
//
// zo dat was het test gedeelte. Nu gewoon de relais schakelen
//
digital write....etc

Nico was sneller klaar met typen, shit..
Kan ik het hele verhaal in de prullenbak gooien.

Ik zeg haakje.

MAS3:
Nico was sneller klaar met typen, shit..
Kan ik het hele verhaal in de prullenbak gooien.

Ik zeg haakje.

you're welcome :slight_smile:

klopt maar waar gaat het fout dan
ik heb toch het zelfde in de code staan?

{}