ARDUINO mega - opakovani funkce - VYŘEŠENO
Moderátor: Moderátoři
- ZdenekHQ
- Významný člen
- Příspěvky: 25519
- Registrován: 21 črc 2006, 00:00
- Bydliště: skoro Brno
- Kontaktovat uživatele:
Proto se už nechci učit další programovací jazyky, mám v hlavě Basic, Pascal, x51 assembler (přesněji JSA), php, javascript,html a už se mě to docela solidně plete.
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?]
ale me to takhle funguje a vraci se to zpet, tak ted nevim jestli je tedy toto programove spravne nebo to bude delat paseku?
Kód: Vybrat vše
void loop() {
//hlavni funkce ke ktere se potrebuju vracet
if (teplomer1() >=50) {
Serial.print("nebezi");
getZkouska();
} else {
Serial.print("bezi");
getTest();
}
}
void getTest() {
do {
//ty podminky se vepisuji sem treba
digitalWrite(2,LOW);
//a potom to return vraci zpet do loop
return;
}while(0); //a to while je tedy konec tohoto podprogramu
}
void getZkouska() {
do {
digitalWrite(8,HIGH);
return;
}while(0);
}
- ZdenekHQ
- Významný člen
- Příspěvky: 25519
- Registrován: 21 črc 2006, 00:00
- Bydliště: skoro Brno
- Kontaktovat uživatele:
Zacyklili jsme se víc než samotný MCU.
mtajovsky: Nebuď smutný, může být i hůř, takže relativně je to pořád OK.
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?]
Kód: Vybrat vše
do {
return;
}while(0);
tedy ze me vraci s toho void gettest nebo zkouska zpet do loop,
tak je to OK ne? nebo mi to nedoporucujete tam pouzivat, zpusobilo
by to nejake problemy pri behu?
- ZdenekHQ
- Významný člen
- Příspěvky: 25519
- Registrován: 21 črc 2006, 00:00
- Bydliště: skoro Brno
- Kontaktovat uživatele:
Kód: Vybrat vše
void getZkouska();
{
}
a máš jistotu, že všechny ostatní závorky v programu jsou "spárovány", tak to udělá co?
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?]
a nevystoupí to z ní zpět do loop
Kód: Vybrat vše
void getZkouska();
{
}
ale když to udělám takhle, tak se to do loop vrací
Kód: Vybrat vše
void getZkouska();
{
do {
return;
}while(0);
}
Při definici se středník za jméno funkce nedává
Nahrej tam tohle a pak dej vědět, jestli getZkouska() vrací nebo nevrací
Kód: Vybrat vše
void getZkouska()
{
Serial.println("B");
}
void getZkouska2()
{
Serial.println("Y");
do
{
return;
} while(0);
}
void setup()
{
//Initialize serial and wait for port to open:
Serial.begin(9600);
}
void loop()
{
Serial.println("A");
getZkouska();
Serial.println("C");
Serial.println("X");
getZkouska2();
Serial.println("Z");
}
- ZdenekHQ
- Významný člen
- Příspěvky: 25519
- Registrován: 21 črc 2006, 00:00
- Bydliště: skoro Brno
- Kontaktovat uživatele:
frpr666 píše:Už vidím chybu! Píšeš: void getZkouska();
Při definici se středník za jméno funkce nedává
Ten středník jsem sem zavlekl já. V tom aby se prase vyznalo, tohle přece musí překladač buď spolknout, nebo vyhodit chybu...
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?]
Jinak může svítit #8 furt v log1 a #2 furt v log0
Kód: Vybrat vše
digitalWrite(2,LOW);
digitalWrite(8,HIGH);
uz se mi to motalo
jinak uz jsem na to asi prisel
kdyz jsem tam nahral tento doporuceny kod od "frpr666"
Kód: Vybrat vše
void getZkouska()
{
Serial.println("B");
}
void getZkouska2()
{
Serial.println("Y");
do
{
return;
} while(0);
}
void setup()
{
//Initialize serial and wait for port to open:
Serial.begin(9600);
}
void loop()
{
Serial.println("A");
getZkouska();
Serial.println("C");
Serial.println("X");
getZkouska2();
Serial.println("Z");
}
tak to jelo A,B,C,X,Y,Z coz by melo takhle fungovat, tak jsem ho rozsiril
jeste o podminku s teplotou:
Kód: Vybrat vše
#include <OneWire.h>
OneWire ds_2(8);
float teplomer2() {
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius_1, fahrenheit_1;
if ( !ds_2.search(addr)) {
Serial.println();
ds_2.reset_search();
delay(250);
}
for( i = 0; i < 8; i++) {
Serial.write(' ');
}
if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
}
ds_2.reset();
ds_2.select(addr);
ds_2.write(0x44, 1); // start conversion, with parasite power on at the end
present = ds_2.reset();
ds_2.select(addr);
ds_2.write(0xBE); // Read Scratchpad
Serial.print(" ");
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds_2.read();
Serial.print(" ");
}
Serial.println();
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
}
celsius_1 = (float)raw / 16.0;
fahrenheit_1 = celsius_1 * 1.8 + 32.0;
float stupne_1 = celsius_1;
return stupne_1;
}
void getZkouska()
{
Serial.println("B");
}
void getZkouska2()
{
Serial.println("Y");
do
{
return;
} while(0);
}
void setup()
{
//Initialize serial and wait for port to open:
Serial.begin(9600);
}
void loop()
{
if (teplomer2() <= 25) {
Serial.println("A");
getZkouska();
Serial.println("C");
} else {
Serial.println("X");
getZkouska2();
}
Serial.println("Z");
Serial.println(teplomer2());
delay(10000);
}
a tohle taky fungovalo, tak jsem jeste vyhodil i to
Kód: Vybrat vše
do
{
return;
} while(0);
a jelo to i bez toho a prohlidl jsem si co mam ja v programu a co je tady v tom...
Chyba byla v tom ze ja mel ty getTest a getZkouska pod loop,
kdezto v programu od "frpr666" jsou void get nad setupem a kdyz jsem je prehodil nad setup, tak to najednou jede bez nejmensi chybicky.
Celej problem byl tedy v tom, ze ty void get nesmi byt pod loop...
- ZdenekHQ
- Významný člen
- Příspěvky: 25519
- Registrován: 21 črc 2006, 00:00
- Bydliště: skoro Brno
- Kontaktovat uživatele:
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?]
U mě to funguje i když dám funkce getZkouska(), getZkouska2() pod void loop(). Schválně si to zkuste i u sebe.
edit1: v jedné otočce loopu volej funkci teplomer2() jen jednou, a teplotu si ulož do nějaké proměnné, protože funkce teplomer2() je časově náročná. Pokud funkci voláš vícekrát, zbytečně si prodlužuješ cyklus.
Např.
Kód: Vybrat vše
teplomer2_value = teplomer2();
if (teplomer2_value>20)
{
...
if (teplomer2_value>50)
{
...
}
}