Sida 4 av 10
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 4 maj 2014, 15:14:00
av Al_Bundy
Ja. Det är bara för pedagogiskt syfte att skriva i är lika med i då om....
Men nu har jag stött på ytterligare ett problem.
Jag har ca tre stycken while loops som är i varandra t.ex
Och då blir det helt enkelt en random bugg någon annan stans. Är det så att en while loop ska helst avslutas innan man börjar på en ny?
Min bugg är att den tappar ett värde som ska skrivas ut på skärmen. Istället för "Keep value: 44?" Så blir det "Keep value: ?"
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 4 maj 2014, 15:25:54
av sodjan
Hur avbryter du den innersta (och mellersta) loopen?
Har du några "break;" där någonstans? Annars så kommer
du att "fastna" innerst och aldrig komma ut igen...
Kod: Markera allt
while(1)
{
while(1)
{
while(1)
{
...
...
break;
}
...
...
break;
}
}
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 4 maj 2014, 15:32:30
av Al_Bundy
Inte ett enda break!
Men däremot har jag ett argument som gör while loopen falsk så den inte körs.
Men kanske ska köra med break;
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 4 maj 2014, 15:33:39
av robbie
Nu ser jag inte riktigt varför man skulle vilja ha 3 st while(1)-loopar nästlade. Men det går att ha flera nästlade om man håller reda på vad som ska räknas så att man inte fastnar i någon lopp. Tex.
Kod: Markera allt
while(i<2047)
{
i+=1;
//etc
while (j<1023)
{
j+=1;
//etc
}
}
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 4 maj 2014, 15:38:51
av Al_Bundy
Loopen är även inom en funktion.
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 4 maj 2014, 15:40:28
av Al_Bundy
robbie skrev:Nu ser jag inte riktigt varför man skulle vilja ha 3 st while(1)-loopar nästlade. Men det går att ha flera nästlade om man håller reda på vad som ska räknas så att man inte fastnar i någon lopp. Tex.
Kod: Markera allt
while(i<2047)
{
i+=1;
//etc
while (j<1023)
{
j+=1;
//etc
}
}
Det är snarare så här jag har skrivit:
Kod: Markera allt
while(1)
{
if(i = 0)
{
while(1)
}
else
{
while(1)
}
}
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 4 maj 2014, 15:46:49
av robbie
Jag blev inte klokare av ditt exempel. Om i=0 startas en evighetsloop, annars startas samma evighetsloop, som dessutom redan är startad innan if-satsen.
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 4 maj 2014, 15:49:48
av Al_Bundy
Detta var ett typ exempel bara.
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 4 maj 2014, 15:59:36
av robbie
Ok, finns inte så mycket att säga.
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 4 maj 2014, 16:13:54
av Al_Bundy
Hittade felet nu!
Om jag anropade displayen och bad den skriva ut något så blev det fel annanstans.
Så lösningen var att ta bort denna rad
Har aldrig gillat Nokia 5110 displayen.
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 4 maj 2014, 16:25:28
av sodjan
> Detta var ett typ exempel bara.
Vad är det som är "bara" ???
Varför posta exempel kod om den inte är rellevant för frågan?
Vad är det du egentligen frågar om?
> Hittade felet nu!
Jaha, men det där har ju inte ett smack med det som du frågade om.
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 4 maj 2014, 16:43:34
av Al_Bundy
Du borde bli svenskalärare.
Det var ett BARA typexempel på hur jag hade lagt while loops som, med if-satser.
Jag hittade felet och det var att jag hade ropat upp display.print() tydligen för många gånger. Lite konstigt att detta ska vara begränsat.

Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 4 maj 2014, 16:53:28
av TomasL
Al, du borde lära dig hur man postar här i forumet.
Har du frågor om kodning, och om du vill ha hjälp med detta, så postar du den kod du har skrivit, inte en massa annat orelevant svammel.
"typexempel" är i dessa lägen fullständigt ointressanta.
Och nej, det finns inga begränsningar hur många gånger du anropar en funktion, så länge de inte är rekursiva, så kan du anropa en och samma funktion ett oändligt antal gånger.
Uppenbarligen ligger dit eventuella fel någon annanstans.
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 4 maj 2014, 17:06:39
av Al_Bundy
Förr sa ni "Jag förstår inte så mycket av den kod du skrev". Så då postade jag ett typexempel, men inte ens det räckte.
Men okej! Här kommer den!
Kod: Markera allt
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 12
// pin 7 - Serial clock out (SCLK)
// pin 8 - Serial data out (DIN)
// pin 13 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 2 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 8, 13, 4, 2);
// Setup a oneWire instance to communicate with any OneWire devices
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
// Deceleration for LED, relays, speaker
const int pin_led_green = 10; // green
const int pin_led_red = 9; // red
const int pin_relay1 = 11; // relay 1
const int pin_relay2 = 6; // relay 2
const int pin_tone = 5; // Speaker
int first; // first value at question
int second; // second value at question
int minvalue; // min value is the minimun range e.g 30 or 50.
String labels[5][5] = { {"*****TIME*****", "Dv0 time:", "Range 30-99:", String(first), String(second) },
{"*****TEMP*****", "Dv0 temp:", "Range 50-99:", String(first), String(second) },
{"*****TIME*****", "Dv1 time:", "Range 30-99:", String(first), String(second) },
{"*****TEMP*****", "Dv1 temp:", "Range 50-99:", String(first), String(second) },
{"***END TEMP***", "End temp:", "Range 50-99:", String(first), String(second) }};
void setup()
{
// Sett green and red LED output
pinMode(pin_led_green, OUTPUT);
pinMode(pin_led_red, OUTPUT);
pinMode(pin_relay1, OUTPUT);
pinMode(pin_relay2, OUTPUT);
digitalWrite(pin_relay1, HIGH);
digitalWrite(pin_relay2, HIGH);
// Sett a tone at start
tone(pin_tone, 400, 400);
// Flash with LED at start
digitalWrite(pin_led_green, HIGH);
digitalWrite(pin_led_red, HIGH);
delay(400);
digitalWrite(pin_led_green, LOW);
digitalWrite(pin_led_red, LOW);
display.begin(); // Begin to use the display
display.setContrast(50); // set contrast
display.clearDisplay(); // Remove the adafruit logo and clear!
sensors.begin(); // Start up the temperature library
}
void loop()
{
int choose = start();
const int maxi = choose;
int i = 0;
int BrewList[choose];
while (i < maxi)
{
BrewList[i] = brewFunc(i);
// 100 = back
// 200 = Accept
// 300 = ask the same question again
if (BrewList[i] == 100 ) // Just back one question. i cannot be negative number.
{
if (i == 0)
{
i = i;
}
else // back but ask the question again.
{
i = i - 1;
}
}
else if (BrewList[i] == 300) // ask the same question again.
{
i = i;
}
else // Just keep forward and ask a new question
{
i = i + 1;
}
}
// now for the real temperature loop
display.clearDisplay();
for (i = 0; i < maxi; i++)
{
// Display the values
display.print(labels[i][1]);
display.println(BrewList[i]);
display.display();
}
display.print("Keep valueB/E?");
display.display();
while (choose != 70) // 70 is just random number
{
choose = tangent_key();
delay(500);
if (choose == 200) // 200 is E for accept/exicute
{
the_loop(BrewList, maxi);
while(1) // THE END!
{
tone(pin_tone, 600, 400);
delay(1000);
}
}
else if (choose == 100) // 100 is B for back.
{
display.clearDisplay();
display.print("Back to menu");
display.display();
delay(2000);
choose = 70;
}
else
{
display.clearDisplay();
display.println("Invalid value");
display.print("Enter B or E");
display.display();
}
}
// end of loop. Let's begin whith a new menu!
}
int start()
{
display.clearDisplay();
display.println("*****MENU*****");
display.print("Press 1 or 2:");
display.display();
int temponaryKey = 1023;
while(temponaryKey != 1 || 2)
{
temponaryKey = tangent_key();
delay(500);
if (temponaryKey == 1)
{
display.clearDisplay();
display.print("You press: 1");
display.display();
delay(2000);
return 5;
}
else if (temponaryKey == 2)
{
display.clearDisplay();
display.print("You press: 2");
display.display();
delay(2000);
return 2;
}
else
{
display.clearDisplay();
display.println("Invalid number");
display.print("Try again");
display.display();
delay(2000);
tone(pin_tone, 800, 400);
display.clearDisplay();
}
}
}
int tangent_key() // press any key to choose metod
{
int tangent = 1023;
while(tangent == 1023)
{
// This is a voltage devider
while(tangent >= 1015)
{
tangent = analogRead(A5); // Analog pin 5
}
if (tangent > 585 && tangent < 595) // number 1
{
tone(pin_tone, 400, 400);
return 1;
}
else if (tangent > 50 && tangent < 60) // number 2
{
tone(pin_tone, 400, 400);
return 2;
}
else if (tangent > 370 && tangent < 390) // number 3
{
tone(pin_tone, 400, 400);
return 3;
}
else if (tangent > 999 && tangent < 1004) // number 4
{
tone(pin_tone, 400, 400);
return 4;
}
else if (tangent > 35 && tangent < 47) // number 5
{
tone(pin_tone, 400, 400);
return 5;
}
else if (tangent > 10 && tangent < 19) // number 6
{
tone(pin_tone, 400, 400);
return 6;
}
else if (tangent > 800 && tangent < 815) // number 7
{
tone(pin_tone, 400, 400);
return 7;
}
else if (tangent > 4 && tangent < 10) // number 8
{
tone(pin_tone, 400, 400);
return 8;
}
else if (tangent > 170 && tangent < 185) // number 9
{
tone(pin_tone, 400, 400);
return 9;
}
else if (tangent >= 0 && tangent < 1) // number 0
{
tone(pin_tone, 400, 400);
return 0;
}
else if (tangent > 855 && tangent < 875) // number 100 or B for back
{
tone(pin_tone, 400, 400);
display.clearDisplay();
return 100;
}
else if (tangent > 1006 && tangent < 1012) // number 200 or E for enter
{
tone(pin_tone, 400, 400);
display.clearDisplay();
return 200;
}
else
{
display.clearDisplay();
display.println("****ERROR****");
display.println("Try again");
display.print("Enter number");
display.display();
delay(3000);
tangent = 1023; // reset tangent to value 1023 and star over again
}
}
}
int brewFunc(int i)
{
// Display Menu, regulator and range
display.clearDisplay();
display.print(labels[i][0]); // Menu
display.println(labels[i][1]); // Device
display.println(labels[i][2]); // Range
display.display();
// Add first number
first = tangent_key();
delay(1000); // just to slow down
if (first == 100) // if press button B as furst number. Button B is value 100.
{
display.clearDisplay();
display.print("*****BACK*****");
display.print("Going back....");
display.display();
delay(1000);
return 100; // Just step back one question
}
else if (first == 200) // if press button E as furst number. Button E is value 200.
{
display.clearDisplay();
display.print("*****ERROR!***");
display.print("Not now!");
display.print("Returning.....");
display.display();
delay(1000);
return 300; // Just ask the same question again.
}
else
{
display.clearDisplay();
display.print(labels[i][0]); // Menu
display.println(labels[i][1]); // Device
display.println(labels[i][2]); // Range
display.print(first); // display the first value
display.display();
}
// Add second number
second = tangent_key();
delay(1000); // just to slow down
if (second == 100) // if press button B as furst number. Button B is value 100.
{
display.clearDisplay();
display.print("*****BACK*****");
display.print("Going back....");
display.display();
delay(1000);
return 100; // Just step back one question
}
else if (second == 200) // if press button E as second number. Button E is value 200.
{
while (second == 200)
{
display.clearDisplay();
display.print("*****ERROR!***");
display.print("Not E now!");
display.print("Enter number");
display.display();
delay(1000);
// Add a new second number
second = tangent_key();
delay(1000); // just to slow down
if (second == 100)
{
display.clearDisplay();
display.print("*****BACK*****");
display.print("Going back....");
display.display();
delay(1000);
return 100; // Just step back one question
}
else
{
// Nothing
}
}
// End of while-loop
display.clearDisplay();
display.print(labels[i][0]); // Menu
display.println(labels[i][1]); // Device
display.println(labels[i][2]); // Range
display.print(first); // display the first value
display.print(second); // display the second value
display.display();
delay(1000);
display.clearDisplay();
display.print("Keep value:");
display.print(String(String(first) += String(second) += "?")); // display first_second value.
display.display();
int Kepp_value = tangent_key();
delay(1000);
if (Kepp_value == 100) // Back = NO - Just go back to the same question again
{
display.clearDisplay();
display.print("*****BACK*****");
display.print("Going back....");
display.display();
delay(1000);
return 100; // 100 = Just step back one question
}
else if(Kepp_value == 200) // E = YES - Keep value
{
if (i == 0 || i == 2)
{
minvalue = 30; // min time value. Max temp and time is allways 99.
}
else
{
minvalue = 50; // min temp value. Max temp and time is allways 99.
}
if ((String(String(first) += String(second))).toInt() >= minvalue && (String(String(first) += String(second))).toInt() <= 99)
{
display.clearDisplay();
display.print("*****DONE*****");
display.print("Done....");
display.print(String(String(first) += String(second)));
display.display();
delay(1000);
return (String(String(first) += String(second))).toInt(); // Return the first_second value
}
else
{
display.clearDisplay();
display.print("*****BACK*****");
display.print("Not in range.");
display.print("Going back....");
display.display();
delay(1000);
return 300; // 300 is back only to the same question again.
}
}
}
else
{
display.clearDisplay();
display.print(labels[i][0]); // Menu
display.println(labels[i][1]); // Device
display.println(labels[i][2]); // Range
display.print(first); // display the first value
display.print(second); // display the second value
display.display();
delay(1000);
display.clearDisplay();
display.print("Keep value:");
display.print(String(String(first) += String(second) += "?")); // display first_second value.
display.display();
int Kepp_value = tangent_key();
delay(1000);
if (Kepp_value == 100) // Back = NO - Just go back to the same question again
{
display.clearDisplay();
display.print("*****BACK*****");
display.print("Going back....");
display.display();
delay(1000);
return 300; // 300 is back only to the same question again.
// Just return.
}
else if(Kepp_value == 200) // E = YES - Keep value
{
if (i == 0 || i == 2)
{
minvalue = 1;
}
else
{
minvalue = 1;
}
if ((String(String(first) += String(second))).toInt() >= minvalue && (String(String(first) += String(second))).toInt() <= 99)
{
display.clearDisplay();
display.print("*****DONE*****");
display.print("Done....");
display.print(String(String(first) += String(second)));
display.display();
delay(1000);
return (String(String(first) += String(second))).toInt(); // Return the first_second value
}
else
{
display.clearDisplay();
display.print("*****BACK*****");
display.println("Not in range.");
display.print("Going back....");
display.display();
delay(1000);
return 300; // 300 is back only to the same question again.
}
}
}
}
void the_loop(int BrewList[], int way)
{
// way can be 2 or 5. 2 is halfbrew and 5 is full brew.
// BrewList[] contains values from the questions.
digitalWrite(pin_led_red, HIGH); // start red led.
if (way == 5)
{
int i = 0;
int time = 0;
while(1)
{
sensors.requestTemperatures(); // request sensors temperature
// time clock
if (i == 60)
{
time++;
i = 0;
}
else
{
i++;
}
display.display();
display.clearDisplay();
display.print("Temp dv0:");
display.print(sensors.getTempCByIndex(0));
display.print("Temp dv1:");
display.print(sensors.getTempCByIndex(1));
display.print("End temp:");
display.println(BrewList[4]);
display.print("Time dv0:");
if (BrewList[0] - time <= 0) // brewlist[0] is time limit for Dv0 time
{
if (BrewList[0] - time == -1) // End time!
{
digitalWrite(pin_relay2, HIGH); // Turn OFF the relay 2 for dv0.
while(1) // BrewList[4] is the integear end temp value.
{
sensors.requestTemperatures(); // request sensors temperature
if(sensors.getTempCByIndex(0) >= BrewList[4])
{
display.clearDisplay();
display.display();
break;
}
else
{
display.clearDisplay();
display.print("***END TEMP***");
display.print("Temp dv0:");
display.print(sensors.getTempCByIndex(0));
display.print("End temp:");
display.print(BrewList[4]);
digitalWrite(pin_relay1, LOW); // Turn ON relay for dv0.
display.display();
}
}
break; // end loop.
}
else
{
display.println("0");
}
}
else
{
display.println(BrewList[0] - time);
}
display.print("Time dv1:");
if (BrewList[2] >= time) // brewlist[2] is time limit for Dv1 time
{
display.println(-BrewList[2] + time); // show before_start_time who is minus.
}
else if (BrewList[2] < time)
{
display.println(BrewList[0] - time); // count down to end time.
}
else
{
display.println("0");
}
// dv0 is first tank
if (sensors.getTempCByIndex(0) < BrewList[1]) // if sensor dv0 lower that choosen value ->
{
digitalWrite(pin_relay1, LOW); // Turn ON
}
else
{
digitalWrite(pin_relay1, HIGH); // Turn OFF
}
// dv1 is second tank.
if (time > BrewList[2])
{
if (sensors.getTempCByIndex(1) < BrewList[3]) // if sensor dv1 lower that choosen value ->
{
digitalWrite(pin_relay2, LOW); // Turn ON
}
else
{
digitalWrite(pin_relay2, HIGH); // Turn OFF
}
}
else
{
// Nothing
}
//delay(1000);
}
digitalWrite(pin_relay1, HIGH); // Turn OFF relay for dv0.
digitalWrite(pin_led_red, LOW); // Turn OFF the red led.
digitalWrite(pin_led_green, HIGH); // Turn ON the green led.
}
else
{
// HÄR SKA ANDRA DELEN AV KODEN KOMMA.
}
}
Re: Normalt att det blir bugg om man anropar funktion i funk
Postat: 4 maj 2014, 17:09:02
av Al_Bundy
Det är denna kodrad som ej skriver ut riktigt
Kod: Markera allt
display.print(String(String(first) += String(second) += "?")); // display first_second value.
Exempel:
Detta blir
Keep value: 45?
till detta
Keep value: ?
Om jag skriver en till extra till.
display.print();