Peršokti į turinį
  • ŽAIDIMAI
  • , ŽAIDIMAI
  • ŽAIDIMAI

Arduino pagalbos [C++]


KDOPE

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 1639 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Recommended Posts

Sveiki. Taigi jau kelias valandas niekaip negaliu sutvarkyti lempučių.

Prie microcontrollerio esu pajunges 3 lemputes ir mygtuką and breadboardo.

Lemputės prijungtos prie 12, 11 ir 10 pinų. Mygtukas prie 2 pino.

Pats sumanymas buvo padaryti "judančias" lemputes. Jos mirgsi tokia tvarka, kad susidaro tam tikras eiliškumas jų migrsėjime. Su tuo problemų nebuvo. Problema atsirado kai nepajėgiau nieko sugalvoti, o tiksliau kaip sustabdyti tas lemputes laikant mygtuką ir pratęsti iš tos vietos kurioje sustabdžiau.

Lemputės mirgsi tokia tvarka:

RED - yellow - green

RED - YELLOW - green

RED - YELLOW - GREEN

red - YELLOW - GREEN

red - yellow - GREEN

red - yellow - green

Repeat.

Su capslocku reiškia, kad lemputė dega, be capslocko reiškia, kad nedega.

Nuspaudus mygtuką viskas tvarkoje, lemputės baigia mirgsėti ir dega tik tos, kurios degė kai nuspaustas mygtukas buvo, bet negaliu su tuo pratesimu nieko sugalvoti. Atleidus tai pradeda skirtingai mirgsėti, tai užgęsta, jau nebežinau kaip daryti, bandžiau keletą variantų ir nei vienas pilnai neišdegė.

// #define LED_RED 12
// #define LED_YELLOW 11
// #define LED_GREEN 10

#define BUTTON 3

int LED_PIN[3] = {12, 11, 10};
bool LED_STAGES[6][3] = {
	{HIGH, LOW, LOW},
	{HIGH, HIGH, LOW},
	{HIGH, HIGH, HIGH},
	{LOW, HIGH, HIGH},
	{LOW, LOW, HIGH},
	{LOW, LOW, LOW}
};

bool ledStage = 0;
bool lastButton = LOW;
int lastPosition = 0;

void setup()
{
	Serial.begin(9600);

	Serial.print("\n----- NEW MONITOR -----\n");

	pinMode(LED_PIN[0], OUTPUT); // Red
	pinMode(LED_PIN[1], OUTPUT); // Yellow
	pinMode(LED_PIN[2], OUTPUT); // Green

	pinMode(BUTTON, INPUT);
}

void loop()
{
	for(int i = lastPosition; i < 3; i++)
	{
		if(digitalRead(BUTTON) == HIGH)
		{
			lastButton = HIGH;
			for(int j, k; j < 6, k < 3; j++, k++)
			{
				if(digitalRead(LED_PIN[i]) == !LED_STAGES[j][k])
				{
					ledStage = j;
					if(i == 2) lastPosition = 0;
					else lastPosition = i;
				}
			}
			return true;
		}
		else if(lastButton == HIGH && digitalRead(BUTTON) == LOW)
		{
			lastButton = LOW;
			digitalWrite(LED_PIN[i], !LED_STAGES[ledStage++][i]);
			delay(1000);
		}
		else
		{
			char buffer[25];
			sprintf(buffer, "1. LED: %d; READ: %d;\n", i, digitalRead(LED_PIN[i]));
			Serial.print(buffer);
			digitalWrite(LED_PIN[i], !digitalRead(LED_PIN[i]));
			sprintf(buffer, "2. LED: %d; READ: %d;\n", i, digitalRead(LED_PIN[i]));
			Serial.print(buffer);
			delay(1000);
		}
	}
}

 

Nuoroda į komentarą
Dalintis per kitą puslapį

int counter=1;

 

...

 

void loop()

{

   if(button_state==LOW)

   {

      if(counter>=7) counter=counter%6;

      //čia surašai led state pagal counterį. Counteris vaikšto nuo 1 iki 6, atitinkamai sudedi digitalwrite į ledus pagal counterio reikšmę.

      counter=counter+1;

      delay(1000);

   }

   else delay(100);

}

 

Sori jeigu čia nesąmonė, 100 metų neprogramavau Arduino, bet aš bandyčiau kažką tokio.

Esmė loop'o pradžioj pasidaryti if'ą, kuris užmestų trumpą delay jeigu mygtukas nuspaustas ir tiesiog baigtų ciklą. Jeigu mygtukas nenuspaustas, kas ciklą po vieną didini counter'į, kuris įjungia atitinkamą lempučių state'ą, o pasiekęs paskutinį state grįžta prie pirmo.

Redaguota , nario tepalas
Nuoroda į komentarą
Dalintis per kitą puslapį

26 minutes prieš, tepalas parašė:

int counter=1;

 

...

 

void loop()

{

   if(button_state==LOW)

   {

      if(counter>=7) counter=counter%6;

      //čia surašai led state pagal counterį. Counteris vaikšto nuo 1 iki 6, atitinkamai sudedi digitalwrite į ledus pagal counterio reikšmę.

      counter=counter+1;

      delay(1000);

   }

   else delay(100);

}

 

Sori jeigu čia nesąmonė, 100 metų neprogramavau Arduino, bet aš bandyčiau kažką tokio.

Esmė loop'o pradžioj pasidaryti if'ą, kuris užmestų trumpą delay jeigu mygtukas nuspaustas ir tiesiog baigtų ciklą. Jeigu mygtukas nenuspaustas, kas ciklą po vieną didini counter'į, kuris įjungia atitinkamą lempučių state'ą, o pasiekęs paskutinį state grįžta prie pirmo.

Pabandysiu rytoj, dėkui!

prieš 10 valandas(-ų), tepalas parašė:

int counter=1;

 

...

 

void loop()

{

   if(button_state==LOW)

   {

      if(counter>=7) counter=counter%6;

      //čia surašai led state pagal counterį. Counteris vaikšto nuo 1 iki 6, atitinkamai sudedi digitalwrite į ledus pagal counterio reikšmę.

      counter=counter+1;

      delay(1000);

   }

   else delay(100);

}

 

Sori jeigu čia nesąmonė, 100 metų neprogramavau Arduino, bet aš bandyčiau kažką tokio.

Esmė loop'o pradžioj pasidaryti if'ą, kuris užmestų trumpą delay jeigu mygtukas nuspaustas ir tiesiog baigtų ciklą. Jeigu mygtukas nenuspaustas, kas ciklą po vieną didini counter'į, kuris įjungia atitinkamą lempučių state'ą, o pasiekęs paskutinį state grįžta prie pirmo.

Pavyko, padariau! Dėkui už mintį, padėjai labai!

#define BUTTON 2

int LED_PIN[3] = {12, 11, 10};
bool LED_STAGES[6][3] = {
	{LOW, HIGH, HIGH},
	{LOW, LOW, HIGH},
	{LOW, LOW, LOW},
	{HIGH, LOW, LOW},
	{HIGH, HIGH, LOW},
	{HIGH, HIGH, HIGH}
};

int counter = 0;

void setup()
{
	Serial.begin(9600);

	Serial.print("\n----- NEW MONITOR -----\n");

	pinMode(LED_PIN[0], OUTPUT); // Red
	pinMode(LED_PIN[1], OUTPUT); // Yellow
	pinMode(LED_PIN[2], OUTPUT); // Green

	pinMode(BUTTON, INPUT);

	digitalWrite(LED_PIN[0], HIGH);
	digitalWrite(LED_PIN[1], HIGH);
	digitalWrite(LED_PIN[2], HIGH);
}

void loop()
{
	if(digitalRead(BUTTON) == LOW)
	{
		if(counter >= 6) counter = 0;
		for(int i = 0; i < 3; i++) digitalWrite(LED_PIN[i], LED_STAGES[counter][i]);
		counter += 1;
		delay(1000);
	}
	else delay(100);
}

 

Galėtum paklausti, kodėl LED'ų states yra opposite. Vietoj trijų rezistorių panaudojau vieną, kad būtų tvarkingiau. Dabar pinai prijungti prie ledo minuso, o prie 5V srovės pajungtas rezistorius, kuris jungia LED'o pliusą prie srovės. Nežinau ar gražiai paaiškinau, tai prisegu foto :D. Dar reikės pasidomėti ar taip išvis legit, ar taip daroma :D, bet svarbiausia su kodu susitvarkiau, dabar reikės su laidais pažaist. Thanks again!

73036087_399232470954751_7250613619870662656_n.thumb.jpg.668afe2dbceb7f3cf883015d2464620c.jpg

Nuoroda į komentarą
Dalintis per kitą puslapį

prieš 11 valandas(-ų), KasparasDope parašė:

Galėtum paklausti, kodėl LED'ų states yra opposite. Vietoj trijų rezistorių panaudojau vieną, kad būtų tvarkingiau. Dabar pinai prijungti prie ledo minuso, o prie 5V srovės pajungtas rezistorius, kuris jungia LED'o pliusą prie srovės. Nežinau ar gražiai paaiškinau, tai prisegu foto :D. Dar reikės pasidomėti ar taip išvis legit, ar taip daroma :D, bet svarbiausia su kodu susitvarkiau, dabar reikės su laidais pažaist. Thanks again!
 

73036087_399232470954751_7250613619870662656_n.thumb.jpg.668afe2dbceb7f3cf883015d2464620c.jpg

Galėtum ledus jungti prie bendro minuso per rezistorių, nereikėtų tada apvertinėti high ir low state'ų ir, kai led'ai išjungti, neturėtum "kabančio" kontakto su 5V, didinančio tikimybę kažką užtrumpinti. Bet toks jungimas per vieną rezistorių dalina srovę per ledus, tad jeigu šviečia keli vienu metu, tai jie švies silpniau negu kai įjungtas tik kažkuris vienas.

Redaguota , nario tepalas
Nuoroda į komentarą
Dalintis per kitą puslapį

prieš 4 valandas(-ų), tepalas parašė:

Galėtum ledus jungti prie bendro minuso per rezistorių, nereikėtų tada apvertinėti high ir low state'ų ir, kai led'ai išjungti, neturėtum "kabančio" kontakto su 5V, didinančio tikimybę kažką užtrumpinti. Bet toks jungimas per vieną rezistorių dalina srovę per ledus, tad jeigu šviečia keli vienu metu, tai jie švies silpniau negu kai įjungtas tik kažkuris vienas.

Ačiū už patarimą, taip ir padarysiu.

Pastebėjau, kad dalina srovę, tačiau darau tik mokymosi tikslams, tai nelabai man ir svarbu ar ryškiai šviečia, ar nelabai. Svarbiau buvo tvarkingai pajungti, kad nebūtų labai viskas apkrauta, tačiau turėsiu omeny. Dėkui!

Nuoroda į komentarą
Dalintis per kitą puslapį

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 1639 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Prisijungti prie diskusijos

Palikti atsakymą galite iš karto, o užsiregistruoti vėliau. Jeigu jau turite paskyrą mūsų forume, Prisijunkite.

Svečias
Atsakyti šioje temoje...

×   Įklijuotas tekstas turi teksto formatavimą.   Pašalinti teksto formatavimą

  Galimi tik 75 veidukai.

×   Nuoroda buvo automatiškai įterpta.   Įterpti nuorodą paprastai

×   Jūsų ankstesnis pranešimas buvo atkurtas.   Išvalyti redaktorių

×   Jūs negalite įkelti nuotraukas tiesiogiai.Įkelkite arba įdėkite nuotraukas iš URL.

  • Šiame puslapyje naršo:   0 nariai

    • Nėra registruotų narių peržiūrinčių šį forumą.

Skelbimai


×
×
  • Sukurti naują...