Peršokti į turinį
KasparasDope

Arduino pagalbos [C++]

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);
		}
	}
}

 

  • Teigiamai 1

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
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
  • Teigiamai 1

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
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

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
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
  • Teigiamai 1

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
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!

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį

Komentuoti gali tik prisijungę nariai

Jeigu turite paskyrą, prisijunkite

Sukurti paskyrą

Sukurkite paskyrą mūsų forume

Registruotis

Prisijungti

Turite paskyrą? Prisijunkite

Prisijungti dabar

  • Narių peržiūri šį forumą:   0 nariai

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


  • SuperGames programele
  • SuperGames programele


×