.update tijdens een while functie.

Arduino specifieke Software
Berichten: 11
Geregistreerd: 23 Mrt 2016, 21:14

.update tijdens een while functie.

Berichtdoor arendtje88 » 23 Mrt 2016, 21:37

Goedenavond,
Het vollegde is verwarrend. maar ik ga proberen het beste er van te maken.
Al enige tijd volg ik alles op dit forum, maar nu zit ik met een vraag/probleem waar ik zelf niet uit komt.
Hoogst waarschijnlijk is het vreslijk simpel. maar ik zie het niet meer :)

Mijn project betreft het gebruik van een touchscreen en de mogelijkheid om hier allemaal verschillende programma's te jkiezen die geluid produceert gerelateerd aan de inkomende variable waarde,
ik heb hiervoor een class gemaakt. ( beetje zoals hier : https://learn.adafruit.com/multi-taskin ... y-solution)

Nu komt bij na de keuze van het programma het probleem.
De .update lijnen in de void loop worden aan voorwaaardes gehangen.
Maar als ik de "if" functie gebruik worden deze 1 malig uitgevoerd en komt het programma tot stilstand omdat de pin niet wordt geupdate.

Mijn gedachte gingen uit naar "while" die nog steeds de voorwaardes hadden van de druk. maar zoals iedreen weet een soort loopje kan maken in je loop.
dit werkt redelijk goed.
totdat ik terug naaar de keuze menu wil gaan uit mijn programma.

Code: Alles selecteren
   
    // PROGRAMMA UITVOEREND
  if (currentPage == '5') { // 5 is uitvoerings scherm
    programma1();
    if (myTouch.dataAvailable()) {
      myTouch.read();
      x=myTouch.getX(); // X coordinat
      y=myTouch.getY(); // Y coordinat
     
            // Terug knop
      if ((x>=10) && (x<=60) &&(y>=10) && (y<=36)) {
        drawFrame(10, 10, 60, 36);
        currentPage = '1'; // hoofdscherm
        selectedUnit == 0;
        myGLCD.clrScr();
        drawHomeScreen(); // tekend weer hoofdscherm
      } 
    }
  }


programma1 start de void programma1.
waarin de
Code: Alles selecteren
   led1.Update();
   led2.Update();

( deze zijn uit het voorbeeld) moeten worden gehangen aan de voorwaardes maar wel dat ze continu worden geupdate als ze aan de drukvoorwaardes voldoen (dus een while funtie). ( (while value >= 100 && <= 200) of iets dergelijks)

Er moet een manier worden bedacht dat tijdens de while functie hij nog steeds kijkt naar de backbuttun uit het eerste stukje code..


Tevens de reden van het niet posten van mijn gehele code. is dat de gene die dit leest morgen waarschijnlijk nog zit uit te puzzelen wat bij wat hoort, door mijn apparte manier van commenten :3



Ik hoop dat iemand hier het antwoord of een tip kan geven hoe ik dit (beter) kan uitvoeren!

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: .update tijdens een while functie.

Berichtdoor nicoverduin » 24 Mrt 2016, 08:32

Zet die hele sketch hier toch maar ff neer..... Want hier is ook geen touw aan vast te knopen.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 11
Geregistreerd: 23 Mrt 2016, 21:14

Re: .update tijdens een while functie.

Berichtdoor arendtje88 » 24 Mrt 2016, 09:44

cpp code
#include <UTFT.h> 
#include <UTouch.h>

//==== Creating Objects
UTFT myGLCD(SSD1289,38,39,40,41); //Parameters should be adjusted to your Display/Schield model
UTouch myTouch( 6, 5, 4, 3, 2);

//==== Defining Variables
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];


int x, y;

char currentPage, selectedUnit;

// variablen voor programma's hier noteren.
//zoals OA de druksensors etc.
const int VCC = 13; // 5 volt voor de sensors, dit ivm dat de standart 5v pin al in gebruik is door het scherm.

void setup() {
// Initial setup
myGLCD.InitLCD();
myGLCD.clrScr();
myTouch.InitTouch();
myTouch.setPrecision(PREC_MEDIUM);

// Defining Pin Modes
pinMode(VCC, OUTPUT); // VCC
digitalWrite(VCC, HIGH); // +5V - Pin 13 as VCC

drawHomeScreen(); // start op met menu
currentPage = '0'; // benoemeing van de pagina;s (dit is home)
selectedUnit = '0'; // Dit gaat de programma keuze worden, elke programma krijgt een "unit" en bij dit unit komt de toon. (pagina besparend kunnen maar tot 9 met deze libary , zeker naar de aanpassing erin) (nog niet uitgetest)
}







void loop() {
// HOOFDMENU & uitlezen van het scherm naar de keuze menu's ( de menus zijn onderin de code gevormd)
if (currentPage == '0') { // 0 defineert het hoofdmenu & menu waarin hij opstart.
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX(); // X coordinat
y=myTouch.getY(); // Y coordinat

// Programma knop
if ((x>=35) && (x<=285) && (y>=90) && (y<=130)) {
drawFrame(35, 90, 285, 130); // zorgt voor het rode randtje waarneer aangedrukt
currentPage = '1'; // locatie waar we zich bevinden na de knop
myGLCD.clrScr(); // maakt scherm leeg (bug met doorlopende lijenen opgelost hierdoor)
drawProgrammaMenu(); // volgende pagina
}
// custum knop
if ((x>=35) && (x<=285) && (y>=140) && (y<=180)) {
drawFrame(35, 140, 285, 180);
currentPage = '2'; // nog niet begonnen functie.
myGLCD.clrScr();
//drawLedControl(); // naar betreffende pagina // dit is nog niet gemaakt op 13-3-2016
}
// service knop
if ((x>=35) && (x<=155) && (y>=190) && (y<=230)) { // (35, 190, 155, 230);
drawFrame(35, 190, 155, 230);
currentPage = '3';
myGLCD.clrScr();
//drawLedControl(); // dit is nog niet gemaakt op 13-3-2016
}
// info knop
if ((x>=165) && (x<=285) && (y>=190) && (y<=230)) { // ( 165, 190, 285, 230);
drawFrame(165, 190, 285, 230);
currentPage = '4';
myGLCD.clrScr();
drawInfoMenu();
}
}
}
//----------------------------------------------------------------------------------------------------------------------------------
// PROGRAMMA KIES MENU DRUKUITLEESVLAK
if (currentPage == '1') { // 1 moet zijn het programma keuze menu.
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX(); // X coordinat
y=myTouch.getY(); // Y coordinat

// P1
if ((x>=35) && (x<=155) && (y>=90) && (y<=130)) {
drawFrame(35, 90, 155, 130); // zorgt voor het rode randtje waarneer aangedrukt
currentPage = '5'; // locatie waar we zich bevinden na de knop
selectedUnit == 1; // ik hoop hiermee de programma waarde te kunnen kopelen aa menu, zonder hier een apparte pagina voor te hoeven te inplanteeren.
myGLCD.clrScr(); // maakt scherm leeg (bug met doorlopende lijenen opgelost hierdoor)
drawProgramma(); // volgende pagina Aanpassen naar een bepaalde waaarde (zoald de druksensors
}
// P2
if ((x>=165) && (x<=285) && (y>=90) && (y<=130)) {
drawFrame(165, 90, 285, 130);
currentPage = '5';
selectedUnit == 2;
myGLCD.clrScr();
drawProgramma();
}
// P3
if ((x>=35) && (x<=155) && (y>=140) && (y<=180)) {
drawFrame(35, 140, 155, 180);
currentPage = '5';
selectedUnit == 3;
myGLCD.clrScr();
drawProgramma();
}
// P4
if ((x>=165) && (x<=285) && (y>=140) && (y<=180)) {
drawFrame(165, 140, 285, 180);
currentPage = '5';
selectedUnit == 4;
myGLCD.clrScr();
drawProgramma();
}
// P5
if ((x>=35) && (x<=155) && (y>=190) && (y<=230)) {
drawFrame(35, 190, 155, 230);
currentPage = '5';
selectedUnit == 5;
myGLCD.clrScr();
drawProgramma();
}
// P6
if ((x>=165) && (x<=285) && (y>=190) && (y<=230)) {
drawFrame(165, 190, 285, 230);
currentPage = '5';
selectedUnit == 6;
myGLCD.clrScr();
drawProgramma();
}
// Terug knop
if ((x>=10) && (x<=60) &&(y>=10) && (y<=36)) {
drawFrame(10, 10, 60, 36);
currentPage = '0'; // hoofdscherm
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen(); // tekend weer hoofdscherm
}
}
}
//----------------------------------------------------------------------------------------------------------------------------------
// PROGRAMMA UITVOEREND
if (currentPage == '5') { // 5 is uitvoerings scherm
if (myTouch.dataAvailable()) {
pizza(); // Hier wordt programa uitgevoerd.,
myTouch.read();
x=myTouch.getX(); // X coordinat
y=myTouch.getY(); // Y coordinat

// Terug knop
if ((x>=10) && (x<=60) &&(y>=10) && (y<=36)) {
drawFrame(10, 10, 60, 36);
currentPage = '1'; // hoofdscherm
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen(); // tekend weer hoofdscherm
}
}
}


}// vodi loop ding









//drawHomeScreen - custum function
//-----------------------------------------------------------------------------------
void drawHomeScreen() {
//hoofdpagina
myGLCD.setBackColor(0,0,0); // achtergrond kleur
myGLCD.setColor(255, 255, 255); // wit
myGLCD.setFont(BigFont); // letterltype groot
myGLCD.print("goede tekst zetten", CENTER, 10); // tekst op scherm
myGLCD.setColor(255, 0, 0); // rood
myGLCD.drawLine(0,32,319,32); // lijn rood onder tekst
myGLCD.setColor(255, 255, 255); // Sets color to white
myGLCD.setFont(SmallFont); // Sets the font to small
myGLCD.print("gemaakt door blablabla", CENTER, 41); // Prints the string
myGLCD.setFont(BigFont);
myGLCD.print("Kies optie", CENTER, 64);

// knop programma's
myGLCD.setColor(16, 167, 103); // Sets green color
myGLCD.fillRoundRect (35, 90, 285, 130); // Draws filled rounded rectangle
myGLCD.setColor(255, 255, 255); // Sets color to white
myGLCD.drawRoundRect (35, 90, 285, 130); // Draws rounded rectangle without a fill, so the overall appearance of the button looks like it has a frame
myGLCD.setFont(BigFont); // Sets the font to big
myGLCD.setBackColor(16, 167, 103); // Sets the background color of the area where the text will be printed to green, same as the button
myGLCD.print("Standart Programma's", CENTER, 102); // Prints the string

// knop custum
myGLCD.setColor(16, 167, 103);
myGLCD.fillRoundRect (35, 140, 285, 180); // x1 y1, x2 y2 (x is links naar rechts, y boven naar beneden)
myGLCD.setColor(255, 255, 255);
myGLCD.drawRoundRect (35, 140, 285, 180);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(16, 167, 103);
myGLCD.print("Custum programma", CENTER, 152);

// knop service (links)
myGLCD.setColor(16, 167, 103);
myGLCD.fillRoundRect (35, 190, 155, 230);
myGLCD.setColor(255, 255, 255);
myGLCD.drawRoundRect (35, 190, 155, 230);
myGLCD.setFont(SmallFont);
myGLCD.setBackColor(16, 167, 103);
myGLCD.print("Service", 40, 202);

// knop info (rechts)
myGLCD.setColor(16, 167, 103);
myGLCD.fillRoundRect ( 165, 190, 285, 230);
myGLCD.setColor(255, 255, 255);
myGLCD.drawRoundRect (165, 190, 285, 230);
myGLCD.setFont(SmallFont);
myGLCD.setBackColor(16, 167, 103);
myGLCD.print("Disclaimer", 170, 202);
} // home pagina (start pagina) ("0")
// frame commando
//-----------------------------------------------------------------------------------
void drawFrame(int x1, int y1, int x2, int y2) {
myGLCD.setColor(255, 0, 0);
myGLCD.drawRoundRect (x1, y1, x2, y2);
while (myTouch.dataAvailable())
myTouch.read();
myGLCD.setColor(255, 255, 255);
myGLCD.drawRoundRect (x1, y1, x2, y2); // commande voor het gekozen knopje funcite highliten!
}
// Programma menu
//-----------------------------------------------------------------------------------
void drawProgrammaMenu() {
// keuze menu programma's eerst terug knop
myGLCD.setColor(100, 155, 203);
myGLCD.fillRoundRect (10, 10, 60, 36);
myGLCD.setColor(255, 255, 255);
myGLCD.drawRoundRect (10, 10, 60, 36);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(100, 155, 203);
myGLCD.print("<-", 18, 15);
myGLCD.setBackColor(0, 0, 0);
myGLCD.setFont(SmallFont);
myGLCD.print("Hoofdmenu", 70, 18);
myGLCD.setColor(255, 0, 0);
myGLCD.drawLine(0,50,319,50); // x en y posities // terug knop

// knop programma 1
myGLCD.setColor(16, 167, 103);
myGLCD.fillRoundRect (35, 90, 155, 130);
myGLCD.setColor(255, 255, 255);
myGLCD.drawRoundRect (35, 90, 155, 130);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(16, 167, 103);
myGLCD.print("P1", 40, 102);

// knop programma 2
myGLCD.setColor(16, 167, 103);
myGLCD.fillRoundRect (165, 90, 285, 130);
myGLCD.setColor(255, 255, 255);
myGLCD.drawRoundRect (165, 90, 285, 130);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(16, 167, 103);
myGLCD.print("P2", 170, 102);

// knop programma 3
myGLCD.setColor(16, 167, 103);
myGLCD.fillRoundRect (35, 140, 155, 180); // x1 y1, x2 y2 (x is links naar rechts, y boven naar beneden)
myGLCD.setColor(255, 255, 255);
myGLCD.drawRoundRect (35, 140, 155, 180);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(16, 167, 103);
myGLCD.print("P3", 40, 152);

// knop programma 4
myGLCD.setColor(16, 167, 103);
myGLCD.fillRoundRect (165, 140, 285, 180); // x1 y1, x2 y2 (x is links naar rechts, y boven naar beneden)
myGLCD.setColor(255, 255, 255);
myGLCD.drawRoundRect (165, 140, 285, 180);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(16, 167, 103);
myGLCD.print("P4", 170, 152);

// knop programma 5
myGLCD.setColor(16, 167, 103);
myGLCD.fillRoundRect (35, 190, 155, 230);
myGLCD.setColor(255, 255, 255);
myGLCD.drawRoundRect (35, 190, 155, 230);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(16, 167, 103);
myGLCD.print("P5", 40, 202);

//knop programma 6
myGLCD.setColor(16, 167, 103);
myGLCD.fillRoundRect ( 165, 190, 285, 230);
myGLCD.setColor(255, 255, 255);
myGLCD.drawRoundRect (165, 190, 285, 230);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(16, 167, 103);
myGLCD.print("P6", 170, 202);
}
// Uitvoerend scherm
//-----------------------------------------------------------------------------------
void drawProgramma() {
// programma P1 eerst terug knop
myGLCD.setColor(100, 155, 203);
myGLCD.fillRoundRect (10, 10, 60, 36);
myGLCD.setColor(255, 255, 255);
myGLCD.drawRoundRect (10, 10, 60, 36);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(100, 155, 203);
myGLCD.print("<-", 18, 15);
myGLCD.setBackColor(0, 0, 0);
myGLCD.setFont(SmallFont);
myGLCD.print("terug", 70, 18);
myGLCD.setColor(255, 0, 0);
myGLCD.drawLine(0,50,319,50); // x en y posities // terug knop

myGLCD.setFont(BigFont);
myGLCD.setBackColor(16, 167, 103);
myGLCD.print("Programma is in uitvoering", CENTER, 202);
}
// Info programma
//-----------------------------------------------------------------------------------
void drawInfoMenu() {
// Informatie (disclaimer)
myGLCD.setColor(100, 155, 203);
myGLCD.fillRoundRect (10, 10, 60, 36);
myGLCD.setColor(255, 255, 255);
myGLCD.drawRoundRect (10, 10, 60, 36);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(100, 155, 203);
myGLCD.print("<-", 18, 15);
myGLCD.setBackColor(0, 0, 0);
myGLCD.setFont(SmallFont);
myGLCD.print("terug", 70, 18);
myGLCD.setColor(255, 0, 0);
myGLCD.drawLine(0,50,319,50); // x en y posities // terug knop

myGLCD.setFont(BigFont);
myGLCD.setBackColor(16, 167, 103);
myGLCD.print("informatie", CENTER, 202);
}


void pizza() {
digitalWrite(11, HIGH);
}


cpp code
#include "Arduino.h"



class Bpm60 // standart waaruit we verder werken.
{
int SpeakerPin; // speaker pin nummer (wordt 11 (PWM))
long OnTime; //miliseconden AAN
long OffTime; //miliseconden UIT
int freq = 36;
int SpeakerState; // onthoudt de huidige status LED
unsigned long previousMillis; // onthoudt de miliseconden

public:
Bpm60(int pin, long on, long off)
{
SpeakerPin = pin;
pinMode(SpeakerPin, OUTPUT);

OnTime = on;
OffTime = off;

SpeakerState = LOW;
previousMillis = 0; // de waardes bij clas bmp60
}

void setFreq(int frekwentie){
freq = frekwentie;
}

void Update()
{
unsigned long currentMillis = millis(); // kijkt naar tijd

if((SpeakerState == HIGH && (currentMillis - previousMillis >= OnTime)))
{
SpeakerState = LOW; // zet speaker uit
previousMillis = currentMillis; // onthoudt tijd
digitalWrite(SpeakerPin, SpeakerState); // update status speaker
}
else if ((SpeakerState ==LOW && (currentMillis - previousMillis + OnTime >= OffTime)))
{
tone(11,freq,OnTime); // toon generator. pin/feqeuntie/duur. hierbij is duur ook bovin in gegeven maar de code werkt anders niet??
previousMillis = currentMillis;
digitalWrite(SpeakerPin, SpeakerState); //
}
}
}; // Gedebugdt

Bpm60 Speaker1(11, 39, 1500);
Bpm60 Speaker2(11, 39, 2500); // instelbare waarde voor speaker (tijd totaal & lengte toon)
Bpm60 Speaker3(11, 39, 3500);
Bpm60 Speaker4(11, 39, 6000);
Bpm60 Speaker5(11, 39, 8000);

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);

Speaker1.setFreq(50);
Speaker2.setFreq(200); // greqeuntie toon
Speaker3.setFreq(500);
Speaker4.setFreq(800);
Speaker5.setFreq(1100);

}


void loop() {
// put your main code here, to run repeatedly:
Speaker1.Update();
Speaker2.Update();
Speaker3.Update();
Speaker4.Update();
Speaker5.Update();

}


dit is in preciepe een oudere verise van mijn code waar nog wat aan scheelt.
en wat dingen nog niet heeft verwerkt. zoals oa anologe inpunt en dingen. (dit om het tch iets simpeler te houden)
maar het idee is er.
De Speaker".update moeten in de "Void pizza" komen <- om makkelijk op te zoeken
als het programma draait, moet deze funtie gehele tijd in een loop worden gedraaid, zonder IF funtie. want dan stop ht updaten naar 1 keer. "while"(?)

maar tijdens de loop moet nog wel worden gekeken naar de backknop of deze is ingedrukt.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: .update tijdens een while functie.

Berichtdoor nicoverduin » 24 Mrt 2016, 10:10

Allereerst staan er dit soort dingen in het programma:
cpp code
selectedUnit == 3;

Hier wordt selectedUnit niet 3 oid. Wat er gebeurt is dat deze regel een waarde true of false geeft. Alleen hij zit niet in een if statement dus gebeurt er verder niets mee.

Verder zou ik eerst beginnen met de hele menu opbouw in een aparte functie te zetten als ook het lezen van de touch.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 11
Geregistreerd: 23 Mrt 2016, 21:14

Re: .update tijdens een while functie.

Berichtdoor arendtje88 » 24 Mrt 2016, 11:27

Zoals ik al zijn, dit is een vroege versie geweest.

U heeft gelijk, en ik kwam hier in de praktijk ook achter dat dit niet werkte met "==" maar dat het '=' moest zijn.
Goed gezien ;)


Maar mijn probleem is enkel de .update in een loop onder voorwaardes te duwen.
Dus of door "while ( variable 1 tussen a en b && currentunit = "")
maar ook dat hij nog steeds naar die backbutton kijkt.

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: .update tijdens een while functie.

Berichtdoor shooter » 24 Mrt 2016, 11:53

bekijk eens hoe dat werkt met state.
en in je loop zet je dan de als backbutton state =90 neer, dan in een aparte functie case state doen waar je dan alles onderverdeelt.

begin met state 10,20 etc dan kun je er nog states tussenplakken als je wat vergeten bent.
de update is gewoon een functie die opgeroepen wordt in de mainloop.
paul deelen
shooter@home.nl

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 76 gasten