praegune kellaaeg 20.06.2025 00:39:25
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
striker13
HV Guru

liitunud: 03.10.2005
|
15.02.2014 14:37:35
C++ natuke abi |
|
|
Arduinoga mässan niisama ja oleks vaja programmile väike lisa teha, aga ei oska leida mingit asjalikku õpetust.
Nimelt oleks siis vaja, et programm käivitaks loop osa alles siis, kui sensorValue on väiksem 300-st ja sellel ajal, kui väärtus on rohkem, väljastaks teksti "oota". Ja seda siis ainult käivitamisel. Kui ta hiljem uuesti alla 300 läheb, siis väljastaks ikka väärtust "0".
int sensorValue;
void setup()
{
Serial.begin(9600);
}
void loop()
{
sensorValue = analogRead(0);
if(sensorValue < 749) Serial.println("0");
if(sensorValue > 750 && sensorValue < 800) Serial.println("1");
if(sensorValue > 801 && sensorValue < 850) Serial.println("2");
if(sensorValue > 851 && sensorValue < 900) Serial.println("3");
if(sensorValue > 901 && sensorValue < 925) Serial.println("4");
if(sensorValue > 926 && sensorValue < 950) Serial.println("5");
else;
delay(1000);
} |
ot: |
kood ise ilmselt ei paku erilist silmailu ja annaks ka mugavamalt teha, aga töötab |
_________________ Sarcasm is just one of the many services I offer to people who ask stupid questions. |
|
Kommentaarid: 95 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
90 |
|
tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
15.02.2014 14:52:42
|
|
|
striker13, tekite üks loop juurde, mida käitataks enne peamist loopi senikaua, kuni väärtus on vähemalt 300?
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
striker13
HV Guru

liitunud: 03.10.2005
|
15.02.2014 15:59:22
|
|
|
milline see välja näeks? Niisama ühe void loop juurde teen, viskab errori
_________________ Sarcasm is just one of the many services I offer to people who ask stupid questions. |
|
Kommentaarid: 95 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
90 |
|
tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
15.02.2014 16:09:30
|
|
|
Hm, tundub et enne tulistasin liiga puusalt.
Määra mingi muutuja alla kirja, et pole veel kordagi 300 saavutatud.
Iga kord loopis kontrollid, et kas see muutuja on tõene või mitte.
Kui pole tõene, kontrollid et kas 300 on saavutatud või mitte.
300 saavutamisel muudad muutuja ära ja edaspidi jooksutad loopi siis nii nagu ise soovid.
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
striker13
HV Guru

liitunud: 03.10.2005
|
15.02.2014 16:22:56
|
|
|
ma sellest põhimõttest saan aru, kuidas ta peaks olema, lihtsalt keelt ei oska nii palju, et see "ära tõlkida"
_________________ Sarcasm is just one of the many services I offer to people who ask stupid questions. |
|
Kommentaarid: 95 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
90 |
|
tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
15.02.2014 17:04:36
|
|
|
Lisa üks boolean tüüpi muutuja koodi algusesse, vaikeväärtusega false.
Loop() algusesse teed ühe if'i, kus kontrollid, et kas see muutuja (boolean) on true või false.
Kui on false, kontrolli et kas sensorValue on vähemalt 300.
Kui sensorValue on vähemalt 300, määra antud muutuja (boolean) väärtuseks true, kutsu välja delay() ja välju funktsioonist (return).
Peale if'i lihtsalt teed oma tavapärast tegevust nagu praegugi.
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
striker13
HV Guru

liitunud: 03.10.2005
|
15.02.2014 17:36:56
|
|
|
Proovisin mis ma proovisin, aga ei tule välja. Nii palju on, et ei väljasta neid 1,2,3 jne kuni sensorValue on rohkem kui 180, aga seda "oota" ei kirjuta ja läheb koguaeg algusesse tagasi.
int sensorValue;
bool bvalue2(false);
void setup()
{
Serial.begin(9600);
}
void loop()
{
sensorValue = analogRead(0);
Serial.println(sensorValue, DEC);
if(bool bvalue2 = false) Serial.println("Oota");{
if(sensorValue > 180) bool bvalue2 = true;
else
if(sensorValue < 749) Serial.println("0");
if(sensorValue > 750 && sensorValue < 800) Serial.println("1");
if(sensorValue > 801 && sensorValue < 850) Serial.println("2");
if(sensorValue > 851 && sensorValue < 900) Serial.println("3");
if(sensorValue > 901 && sensorValue < 925) Serial.println("4");
if(sensorValue > 926 && sensorValue < 950) Serial.println("5");
else;
delay(1000);
}
} |
_________________ Sarcasm is just one of the many services I offer to people who ask stupid questions. |
|
Kommentaarid: 95 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
90 |
|
tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
15.02.2014 19:02:26
|
|
|
striker13, on näha, et sul pole aimugi programmeerimiskeele süntaksist.
Soovitan alustada siit: http://arduino.cc/en/Tutorial/HomePage
Programmeerimiskeel on seal C++, soovitan ka selle kohta eraldi õpetusi uurida.
viimati muutis mikk36 15.02.2014 19:05:14, muudetud 1 kord |
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
Renka
HV Guru

liitunud: 01.04.2002
|
15.02.2014 19:13:26
|
|
|
Miskit sellist ehk.
If / else kasutamine ja süntaks üldisemalt tee omale selgeks Statement ei saa olla tingimuse ja bloki alguse vahel. Lisaks on olemas ka else if, et asju lihtsustada ja mitte liigselt konditsioone käivitada.
c++:
|
int sensorValue; bool bvalue2(false); void setup() { Serial.begin(9600); } void loop() { sensorValue = analogRead(0); Serial.println(sensorValue, DEC); if (bool bvalue2 = false) { Serial.println("Oota"); if (sensorValue > 180) bool bvalue2 = true; } else { if (sensorValue < 749) Serial.println("0"); else if (sensorValue < 800) Serial.println("1"); else if (sensorValue < 850) Serial.println("2"); else if (sensorValue < 900) Serial.println("3"); else if (sensorValue < 925) Serial.println("4"); else if (sensorValue < 950) Serial.println("5"); else; } delay(1000); }
|
EDIT: oh kurat seal koodis on ju nii palju jama veel Ole hea kirjuta korrektse süntaksiga kood valmis ja siis vaatame edasi kui asi ikka ei tööta.
Mida näiteks see rida tegema peaks? Tõenäoliselt hoopis miskit muud kui hetkel teeb.
c++:
|
if (bool bvalue2 = false)
|
_________________ There is no place like 127.0.0.1 |
|
Kommentaarid: 71 loe/lisa |
Kasutajad arvavad: |
   |
:: |
2 :: |
1 :: |
61 |
|
tagasi üles |
|
 |
striker13
HV Guru

liitunud: 03.10.2005
|
|
Kommentaarid: 95 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
90 |
|
tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
15.02.2014 19:22:55
|
|
|
striker13, tee ja katseta neid Arduino harjutusi seal järjest läbi ja mõtle iga rea koodi peale, et mida see teeb.
Ei oma küll ise Arduinot ega isegi analoogi, aga kiirel pilgul õpetustest üle käies tunduvad hästi kirjeldatud ja dokumenteeritud olema.
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
striker13
HV Guru

liitunud: 03.10.2005
|
15.02.2014 20:24:11
|
|
|
Kas ühe if lause sees saab teine if lause ka olla?
.....
if(kontroll = 1) { Serial.println("Oota"); if(sensorValue < 175) { kontroll = 2; } }
else {
.....
Nagu aru saan, siis praegu kirjas nii, et alguses defineeritud kontroll = 1, nüüd esimese if lausega kontrollib, kas see on 1. Kui on, siis kirjutab "Oota" JA kontrollib järgmise if lausega kas sensorValue on väiksem kui 175 ja kui on, muudab kontroll = 2-ks. Ehk et kui ta järgmise tiiruga uuesti tuleb kontrollima, peaks nüüd kontroll = 2 ja minema automaatselt üle else lause osa peale. Pärast else-i tuleks siis need väärtused, mille puhul kirjutab kas 1,2 jne, aga millise if lausega see else ennast praegusel juhul seob üldse?
_________________ Sarcasm is just one of the many services I offer to people who ask stupid questions. |
|
Kommentaarid: 95 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
90 |
|
tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
15.02.2014 20:40:05
|
|
|
striker13, esimene asi: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B
Teiseks:
Kirjuta lahti oma koodirida rohkem:
c++:
|
if(kontroll == 1) { Serial.println("Oota"); if(sensorValue < 175) { kontroll = 2; } }
|
Ära aja määramist ja võrdlust sassi omavahel (= vs ==).
Kolmandaks: programmeeritakse reeglina inglise keeles, see tähendab et ka kõik muutujate nimed kirjutatakse inglise keeles.
See tagab ka selle, et iga võõramaalane saab sinu koodist aru, kui sa talle seda näitad.
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
striker13
HV Guru

liitunud: 03.10.2005
|
17.04.2015 21:29:12
|
|
|
aga tänud, tundub, et nüüd töötab sai päris palju keelest endast ka selgemaks
edit:
Ei hakka uut teemat tegema, aga küsiks veel natuke abi.
Praegu kood:
Spoiler 
#include <MenuBackend.h>
#include <LiquidCrystal.h>
#include <Stepper.h>
const int buttonPinLeft = 24;
const int buttonPinRight = 22;
const int buttonPinEsc = 44;
const int buttonPinEnter = 42;
const int stepsPerRevolution = 64;
const int buttonPin = 46;
int buttonState = 0;
Stepper myStepper(stepsPerRevolution, 53,52,51,50);
int lastButtonPushed = 0;
int lastButtonEnterState = LOW;
int lastButtonEscState = LOW;
int lastButtonLeftState = LOW;
int lastButtonRightState = LOW;
int pikkus = 1000; <----------- pikkus
long lastEnterDebounceTime = 0;
long lastEscDebounceTime = 0;
long lastLeftDebounceTime = 0;
long lastRightDebounceTime = 0;
long debounceDelay = 500;
LiquidCrystal lcd(36, 34, 32, 30, 28, 26);
MenuBackend menu = MenuBackend(menuUsed,menuChanged);
MenuItem menu1Item1 = MenuItem("Pikkus");
MenuItem menuItem1SubItem1 = MenuItem("105 mm");
MenuItem menuItem1SubItem2 = MenuItem("195 mm");
MenuItem menu1Item2 = MenuItem("Kiirus");
MenuItem menuItem2SubItem1 = MenuItem("1 m/min");
MenuItem menuItem2SubItem2 = MenuItem("1,5 m/min");
MenuItem menuItem3SubItem3 = MenuItem("2 m/min");
MenuItem menu1Item3 = MenuItem("Item3");
void setup()
{
pinMode(buttonPin, INPUT);
myStepper.setSpeed(120);
pinMode(buttonPinLeft, INPUT);
pinMode(buttonPinRight, INPUT);
pinMode(buttonPinEnter, INPUT);
pinMode(buttonPinEsc, INPUT);
lcd.begin(16, 2);
//configure menu
menu.getRoot().add(menu1Item1);
menu1Item1.addRight(menu1Item2).addRight(menu1Item3);
menu1Item1.add(menuItem1SubItem1).addRight(menuItem1SubItem2);
menu1Item2.add(menuItem2SubItem1).addRight(menuItem2SubItem2).addRight(menuItem3SubItem3);
menu.toRoot();
lcd.setCursor(0,0);
lcd.print("Vooliku loikur");
}
void loop()
{
buttonState = digitalRead(buttonPin);
readButtons();
navigateMenus();
if (buttonState == HIGH) {
myStepper.step(pikkus); <--------- Stepperi liikumine
delay(100);
}
}
void menuChanged(MenuChangeEvent changed){
MenuItem newMenuItem=changed.to;
lcd.setCursor(0,1);
if(newMenuItem.getName()==menu.getRoot()){
lcd.print("Peamenyy ");
}else if(newMenuItem.getName()=="Pikkus"){
lcd.print("Pikkus ");
}else if(newMenuItem.getName()=="105 mm"){ <------------ menüüst pikkuse valik
lcd.print("105mm");
}else if(newMenuItem.getName()=="195 mm"){
lcd.print("195mm ");
}else if(newMenuItem.getName()=="Kiirus"){
lcd.print("Kiirus ");
}else if(newMenuItem.getName()=="1 m/min"){
lcd.print("1m/min ");
}else if(newMenuItem.getName()=="1,5 m/min"){
lcd.print("1,5m/min ");
}else if(newMenuItem.getName()=="2 m/min"){
lcd.print("2m/min ");
}else if(newMenuItem.getName()=="Item3"){
lcd.print("Item3 ");
}
}
void menuUsed(MenuUseEvent used){
lcd.setCursor(0,0);
lcd.print("Valik: ");
lcd.setCursor(0,1);
lcd.print(used.item.getName());
delay(3000);
lcd.setCursor(0,0);
lcd.print("Vooliku loikur");
menu.toRoot();
}
void readButtons(){
int reading;
int buttonEnterState=LOW;
int buttonEscState=LOW;
int buttonLeftState=LOW;
int buttonRightState=LOW;
//Enter button
// read the state of the switch into a local variable:
reading = digitalRead(buttonPinEnter);
// check to see if you just pressed the enter button
// (i.e. the input went from LOW to HIGH), and you've waited
// long enough since the last press to ignore any noise:
// If the switch changed, due to noise or pressing:
if (reading != lastButtonEnterState) {
// reset the debouncing timer
lastEnterDebounceTime = millis();
}
if ((millis() - lastEnterDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer
// than the debounce delay, so take it as the actual current state:
buttonEnterState=reading;
lastEnterDebounceTime=millis();
}
// save the reading. Next time through the loop,
// it'll be the lastButtonState:
lastButtonEnterState = reading;
//Esc button
// read the state of the switch into a local variable:
reading = digitalRead(buttonPinEsc);
// check to see if you just pressed the Down button
// (i.e. the input went from LOW to HIGH), and you've waited
// long enough since the last press to ignore any noise:
// If the switch changed, due to noise or pressing:
if (reading != lastButtonEscState) {
// reset the debouncing timer
lastEscDebounceTime = millis();
}
if ((millis() - lastEscDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer
// than the debounce delay, so take it as the actual current state:
buttonEscState = reading;
lastEscDebounceTime=millis();
}
// save the reading. Next time through the loop,
// it'll be the lastButtonState:
lastButtonEscState = reading;
//Down button
// read the state of the switch into a local variable:
reading = digitalRead(buttonPinRight);
// check to see if you just pressed the Down button
// (i.e. the input went from LOW to HIGH), and you've waited
// long enough since the last press to ignore any noise:
// If the switch changed, due to noise or pressing:
if (reading != lastButtonRightState) {
// reset the debouncing timer
lastRightDebounceTime = millis();
}
if ((millis() - lastRightDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer
// than the debounce delay, so take it as the actual current state:
buttonRightState = reading;
lastRightDebounceTime =millis();
}
// save the reading. Next time through the loop,
// it'll be the lastButtonState:
lastButtonRightState = reading;
//Up button
// read the state of the switch into a local variable:
reading = digitalRead(buttonPinLeft);
// check to see if you just pressed the Down button
// (i.e. the input went from LOW to HIGH), and you've waited
// long enough since the last press to ignore any noise:
// If the switch changed, due to noise or pressing:
if (reading != lastButtonLeftState) {
// reset the debouncing timer
lastLeftDebounceTime = millis();
}
if ((millis() - lastLeftDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer
// than the debounce delay, so take it as the actual current state:
buttonLeftState = reading;
lastLeftDebounceTime=millis();;
}
// save the reading. Next time through the loop,
// it'll be the lastButtonState:
lastButtonLeftState = reading;
//records which button has been pressed
if (buttonEnterState==HIGH){
lastButtonPushed=buttonPinEnter;
}else if(buttonEscState==HIGH){
lastButtonPushed=buttonPinEsc;
}else if(buttonRightState==HIGH){
lastButtonPushed=buttonPinRight;
}else if(buttonLeftState==HIGH){
lastButtonPushed=buttonPinLeft;
}else{
lastButtonPushed=0;
}
}
void navigateMenus() {
MenuItem currentMenu=menu.getCurrent();
switch (lastButtonPushed){
case buttonPinEnter:
if(!(currentMenu.moveDown())){ //if the current menu has a child and has been pressed enter then menu navigate to item below
menu.use();
}else{ //otherwise, if menu has no child and has been pressed enter the current menu is used
menu.moveDown();
}
break;
case buttonPinEsc:
menu.toRoot(); //back to main
break;
case buttonPinRight:
menu.moveRight();
break;
case buttonPinLeft:
menu.moveLeft();
break;
}
lastButtonPushed=0; //reset the lastButtonPushed variable
}
|
Soov oleks, et kui teed pikkuse valiku menüüs, siis ta määraks muutuja pikkus-e väärtuse ja kasutaks seda väärtust stepperi liigutamiseks.
Kas nii on üldse õige määrata liikumise pikkust: myStepper.step(pikkus);
_________________ Sarcasm is just one of the many services I offer to people who ask stupid questions. |
|
Kommentaarid: 95 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
90 |
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|
Hinnavaatlus ei vastuta foorumis tehtud postituste eest.
|