idea, hovimestari botti

se if elsen sijoittelu oli tarkoitettu sulle opiskelumielessä mietittäväksi mihin se tulee…
koodia kannattaa tutkia rivi riviltä ja miettiä mitä siinä tapahtuu & kirjoittaa kommenttia ko riville, jos jotain kohtaa ei ymmärrä niin sitten tutkimaan dokumentaatiota, arduino.cc on ystäväsi ja jos ei sieltä aukea niin aina voi yrittää kysyä mitä joku asia tekee.

olisiko se sitten abouttirallaa näin:

int on = 0; //laitetaan on muuttujan arvoksi 0
unsigned long last = millis();

void loop() {
if (irrecv.decode(&results)) {
if (millis() - last > 250) {
on = !on; //nitkutellaan on muuttujan avoksi 1 tai 0 ??
if(results = FD0857)//jos 1nappia painettu tehjään suluissa määrätty asia
{
digitalWrite(RELAY1_PIN, on ? HIGH : LOW);//muutetaan rele1 tila
}
else if(results = FD0858)
{
digitalWrite(RELAY2_PIN, on ? HIGH : LOW);
}

//jne…

}
last = millis();      
irrecv.resume(); // Receive the next value

joo voip sen tehdä tuosta lyhkäsemmästä tai poistaa ekasta turhat tai kirjottaa kokonaan oma tai…

kiitos sinulle suuresti uk350 kun jaksat minua auttaa. Kun tuolla koodilla kokeilin niin työntää tällaista erroria:
“FD0858 was not declared in this scope”
eli jos oikein ymmärrän niin tuo koodin pätkä tulee jonnekkin muualle kuin tuohon looppiin. Tutkin humenna isää. Kiitos.

Suosittelen tutustumaan ekana Arduinoon ja sen ohjelmointikieleen. Itse luin viime vuonna Sulautetut-kirjan (kannattaa tarkistaa lähikirjasto, ainakin mellä oli juuri saapunut, vaikka pieni paikkakunta onkin) ja pidin sitä aika sivistävänä. Muistaakseni se sopii sellaisellekin, jolla ei ole kokemusta ohjelmoinnista.

arduino.cc/en/Tutorial/HomePage
arduino.cc/en/Reference/HomePage
sulautetut.fi/

Tuossa virheilmoituksessa sanotaan ettei FD0858 ole määritelty eli etsitään sen nimistä muuttujaa (tai mitä muuta se nyt voikaan olla), joten laitappa se lainausmerkkeihin jolloin siitä tulee arvo FD0858.

Muoks. Joo, tajusinpa nukkumaan mentyäni, että hexähän se siellä eli 0x alkuun eikä mitään lainausmerkkejä. :stuck_out_tongue:

Nopeasti vilaistuna vain viimeisimmät viestit: jos kyse oli hexarvosta, niin laita se muotoon 0xFD0858. Muutoin kääntäjä luulee sitä muuttujaksi.
Ja if-lauseessa oli varmaan tarkoitus tutkia arvoa, eikä sijoittaa, joten if(results == 0xFD0858).

tuotapa mietin itekki jotta tartteepiko olla 0x edessä mutta masa kerkeskin jo viisaampana vastata

kiitos taas kaikille. Nyt käytin sitten tällaista koodia ja pukkaa erroria; no match for ‘operator==’ in ‘results == 16582723l’ Mm elii… se ei tunnista tuota results sanaa? mitä tehdä?

[code]
#include <IRremote.h>

int RECV_PIN = 11;
int RELAY_PIN = 4;

IRrecv irrecv(RECV_PIN);
decode_results results;

// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
// decode_results *results = (decode_results *)v
void dump(decode_results *results) {
int count = results->rawlen;
if (results->decode_type == UNKNOWN) {
Serial.println(“Could not decode message”);
}
else {
if (results->decode_type == NEC) {
Serial.print("Decoded NEC: ");
}
else if (results->decode_type == SONY) {
Serial.print("Decoded SONY: “);
}
else if (results->decode_type == RC5) {
Serial.print(“Decoded RC5: “);
}
else if (results->decode_type == RC6) {
Serial.print(“Decoded RC6: “);
}
Serial.print(results->value, HEX);
Serial.print(” (”);
Serial.print(results->bits, DEC);
Serial.println(” bits)”);
}
Serial.print(“Raw (”);
Serial.print(count, DEC);
Serial.print(”): ");

for (int i = 0; i < count; i++) {
if ((i % 2) == 1) {
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
}
else {
Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
}
Serial.print(" “);
}
Serial.println(”");
}

void setup()
{
pinMode(RELAY_PIN, OUTPUT);
pinMode(13, OUTPUT);
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
}

int on = 0;
unsigned long last = millis();

void loop() {
if (irrecv.decode(&results)) {
if (millis() - last > 250) {
on = !on; //nitkutellaan on muuttujan avoksi 1 tai 0 ??
if(results == 0xFD0857)//jos 1nappia painettu tehjään suluissa määrätty asia
{
digitalWrite(RELAY_PIN, on ? HIGH : LOW);//muutetaan rele1 tila
}
else if(results == 0xFD0858)
{
digitalWrite(13, on ? HIGH : LOW);
}

}
last = millis();      
irrecv.resume(); // Receive the next value

}
}[/code]

no entäpä jos se tulisi ollakkin näin…

if(results->value == 0xFD0857)

Kiitos.
Nyt kuitenkin työntää tällaista errorria;

base operand of ‘->’ has non pointer type ‘decode_results’

Hetken jo luulin että yoimisi kun kokeilin tällaista koodia mutta ei… edelleen ledi syttyy, ei väliä mitä painaa…

[code]#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
pinMode(13, OUTPUT);
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
}

void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
if (irrecv.decode(&results));
{
if(results.value == 0xFD30CF);//
{
digitalWrite(13,HIGH);
delay (1000);//
}
if(results.value == 0xFD00FF);
{
digitalWrite(13,LOW);
}
}
{
irrecv.resume(); // Receive the next value
}

}
}[/code]

Moro!
Aloittelijana tässä itekkin hääräilen ja painiskelin vähän saman tyyppisen ongelman parissa… itselläni homma lähti toimiin kun otin noiden if rivien lopusta ; pois …

Joo niin näkyy tekevän :smiley: Jes! Nyt toimii simppelillä koodilla juuri niinkuin haluankin! :slight_smile: Kiitos sinulle ja kaikille muillekkin jotka olette minua auttaneet! :slight_smile:
Nyt sitten kuitenkin (tyhmä) kysymys; mitä nuo “;” pisteet tekevät? -noin niiku suomeksi?

Nyt viikonloppuna saan tuohon akun, tosin moottorinohjaimen koodia en ehdi yhdistää koska koli aukeaa=> olen rinteessä. Mutta sitä mukaa tuo alkaa olemaan todella hyvällä mallilla, vielä jos kerkeäisin käydä tuohon toisen moottorinohjaimen ohjeileaan niitä cd asema “käsiä”.

käsittääkseni ; ilmoittaa ohjelmarivin päättymisestä tai jotain sinnepäin… :confused:

Käytännössä, mutta kyse on oikeamminkin komennosta. Ehtolauseisiin ja silmukoihin noita ei käytetä. Tosin sen saa yleensä kyllä laittaa lopettavan aaltosulkeen } perään.

Itse tykkään laittaa aloittavan aaltosulkeen { samalle riville sen ehdon kanssa, mutta se on lähinnä tyyliseikka ja juontaa juurensa Javasta, jota opetellessani piti noudattaa Java Coding Conventions -ohjeita.

Jep, puolipiste kertoo komennon loppuvan. Täten voidaan esim kirjoittaa periaatteessa kaikki koodi yhdelle riville viljelemällä vaan puolipisteitä oikeissa kohdissa.
Toisaalta sillä voidaan jättää esim. ehto- tai toistorakenteen sisältö tyhjäksi ilman, että käytetään kaarisulkeita:

if(jotain == 1)
    ;
else
{
    fobar();
}

tai vaikka delay looppi:

while(--kauntteri > 0)
    ;

kauntterin_jalkeen();

Tässä tapauksessa jos oli suoraan if:n perässä puolipiste, niin kävi juurikin siten, että if:n runko oli tyhjä, eli ehdon toteutuessa tehtiin ei-mitään, ja se if:n rungoksi tarkoitettu blokki kaarisulkeiden välissä suoritettiin aina riippumatta if:n tuloksesta, eli se oli käytännössä vain “koodia if:n jälkeen”.

Nyt tein koodin joka kaukosäätimestä nappeja painamalla kääntelee moottoria. Tai ainakin niin sen pitäisi tehdä, taisin vaan rikkoa tuon moottorinohjaimen kun moottori vain vähän nytkähtää. Vika ei ole koodissa, pattereissa ja tuskimpa kytkennöissäkään. Joten ainoa
mahdollisuus on että kytkin nuo patteron virrat jossain vaiheessa vääriin pinneihin ja tuo meni rikki… Noh, pitänee ostaa uusi.

Tuo kaukosäädin ainakin taitaa olla ihan täysi rimpula, joten tuumin uuteen vaihtamista kun senhän pitäisi olla aika helppoa? Olisikohan joku tv kaukosäädin singnaaliltaan vahvin¿

Joo, vaihdoin kaukosäädintä mutta siltikin toimii vähän huonosti. Antaa jatkuvasti aiis fffff ja 0 tulosta (serialmonitorille). Eli vissiin tohon koodiin pitäisi lisätä jotain… hmm…

Eli nyt on tällanen vähän kummallinen ongelma. [code]/*

  • IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
  • An IR detector/demodulator must be connected to the input RECV_PIN.
  • Version 0.1 July, 2009
  • Copyright 2009 Ken Shirriff
  • http://arcfn.com
    */

#include <IRremote.h>
int motor1 = 2; //declares the first pin for the motor

int motor2 = 4; //declares the other pin for the motor

int motorpmw = 9; // this is the pmw that will set how much battery power the motor is getting (speed)

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{

pinMode(motor1, OUTPUT); //

pinMode(motor2, OUTPUT); // these simply are declaring them as outputs

pinMode(motorpmw, OUTPUT); //

pinMode(13, OUTPUT);
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
}

void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
if (irrecv.decode(&results))
{
if(results.value == 0xFD30CF)//
{
digitalWrite(13,LOW);
delay (1000);//
}
if(results.value == 0xFD00FF)
{
digitalWrite(13,HIGH);
tone(6, 340, 200);
{
if(results.value == 0xFD20DF)
analogWrite(motorpmw, 255); // this is the analog speed value for the arduino (0-255)
digitalWrite(motor1, HIGH);
digitalWrite(motor2, LOW); //turns the motors on - forwards
}
}
}
{
irrecv.resume(); // Receive the next value
}

}
}[/code]

Tätä (tai mitä tahansa muunnelmaa tästä) käyttäessäni tulee sellainen ongelma että kun tuo kerran vastaanottaa tuon tietyn koodin (if(results.value == 0xFD30CF)//) tekee se pyydetyn toiminnon ja sen jälkeen kun pianelen kaukosäätimestä nappeja tulee serialmonitoriin pelkkää nollaa. Missä vika?
Kun tuolla lopuusahan on tuo " irrecv.resume();" jonka lullisi siis käskevän vastaanottaa seuraavan arvon…

Aivan ensimmäiseksi: opettele käyttämään sisennyksiä koodatessa, aivan kaameaa lukea tuo nykyine :S

Varsinaisesta viasta en osaa sanoa muuta kuin äkkiseltään näytti ainakin yksi aaltosulku olevan väärin päin, tosin tuostakaan en varmaksi mene vannomaan, kun ei tuosta koodista selvää saanut edellämainitun ongelman vuoksi :stuck_out_tongue:

Kiitos. Mitä tarkalleen ottaen tarkoitat sisennyksillä?
Itse tuumin että johtuisiko vika siitä että tuolta puuttuu elsent, ja on vain ifiä. Noh muokkasi koodia ja jäin tällaiseen jumiin kun valittaa; “error excpected unqualified-id before ‘{’ token”
että mitä pitäis laittaa enne jotakin noista ‘{’ :sta?

Tässä selvennykseksi se muokattu koodi jolla tuo errori tulee.


#include <IRremote.h>
int motor1 = 2; //declares the first pin for the motor 




int motor2 = 4; //declares the other pin for the motor



int motorpmw = 9; // this is the pmw that will set how much battery power the motor is getting (speed)

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  
pinMode(motor1, OUTPUT); //

pinMode(motor2, OUTPUT); // these simply are declaring them as outputs

pinMode(motorpmw, OUTPUT); //

  pinMode(13, OUTPUT);
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() { 
 if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
if (irrecv.decode(&results)){
  }
if(results.value == 0xFD30CF)//
{
digitalWrite(13,LOW);
delay (1000);//
}
else if(results.value == 0xFD00FF)
{
digitalWrite(13,HIGH);
tone(6, 340, 200);
}
else if(results.value == 0xFD20DF)
{
analogWrite(motorpmw, 255); // this is the analog speed value for the arduino (0-255)
digitalWrite(motor1, HIGH);
digitalWrite(motor2, LOW); //turns the motors on - forwards
}
}
}
{   
    irrecv.resume(); // Receive the next value
}

Tarviiko arduinon kanssa asentaa WinAVR? Sen mukana tulisi programmers notepad… Se taisi osata käyttäytyä. Tosin Arduino on IDE ja nyt tekisi mieli taas sanoa jotain ikävää siitä.

[code]#include <IRremote.h>
int motor1 = 2; //declares the first pin for the motor

int motor2 = 4; //declares the other pin for the motor

int motorpmw = 9; // this is the pmw that will set how much battery power the motor is getting (speed)

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
pinMode(motor1, OUTPUT); //

pinMode(motor2, OUTPUT); // these simply are declaring them as outputs

pinMode(motorpmw, OUTPUT); //

pinMode(13, OUTPUT);
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver

}

void loop()
{
if (irrecv.decode(&results))
{
Serial.println(results.value, HEX);
}

if (irrecv.decode(&results))
{

}

if(results.value == 0xFD30CF)//
{
	digitalWrite(13,LOW);
	delay (1000);//
}

else if(results.value == 0xFD00FF)
{
	digitalWrite(13,HIGH);
	tone(6, 340, 200);
}
else if(results.value == 0xFD20DF)
{
	analogWrite(motorpmw, 255); // this is the analog speed value for the arduino (0-255)
	digitalWrite(motor1, HIGH);
	digitalWrite(motor2, LOW); //turns the motors on - forwards
}

irrecv.resume(); // Receive the next value

}[/code]

Lisäsin sisennykset tohon aikaisempaan koodiisi, jolloin siitä tuli huomattavasti helpommin luettava. Samalla poistin muutaman ylimääräisen kaarisulun koodin lopusta.

Tosiaan kannattaa opetella käyttämään noita sisennyksiä. Se helpottaa huomattavasti esim. puuttuvien kaarisulkujen ja muiden virheiden havaitsemista.