Lite Arduinobekymmer...

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Lite Arduinobekymmer...

Inlägg av sodjan »

Istället för att ha:

int var1, var2, var3, var4, var5;

så har du :

int var[5];

I koden har du sedan tillgång till var[0] - var[4].
Notera att index börjar på 0 (standard i C).

En stor skillnad är att indexet kan vara en variabel, var[ind]
t.ex, eller vad man nu vill kalla den...
Miramithe
Inlägg: 1423
Blev medlem: 21 januari 2013, 17:45:10
Ort: Borlänge

Re: Lite Arduinobekymmer...

Inlägg av Miramithe »

En sak jag satt och tänkte och mixtrade med nyss var hur gör man för att toggla en annan funktion?

Just nu sitter jag och mer eller mindre leker med en rf modul (en billig 433mhz både mottagare och sändare) jag har en dosa som jag tänder och släcker fönsterlampor och vitrinskåps belysningen, iaf sniffa rätt på koden den sänder var inga problem, det kan jag. Men när man ska skicka den, hur skriver man då om man vill toggla funktionen för en knapp? den skickar ju 2 olika bitar en för tända och en för släcka, LED var ju lätt där kunde man ju bara invertera föregående värde eller toggla mellan 2 värden, men hur ska man göra här?

Ska man göra lika att den sparar ett värde high or low (1 eller 0) och från det om förgående värde är tex high så ska den sända snutten med bitar dom är för low?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Lite Arduinobekymmer...

Inlägg av sodjan »

Jag är inte helt med på vad du frågar om.

Behöver du vet vilket som var föregående läge (tänt/släckt)?
I så fall sparar du bara det i en variabel/flagga i koden.
Om du sedan behöver "byta läge" så kollar du hur den står
nu och skickar ut det andra läget.
Är det tänt? Släck!
Är det släckt? Tänd!

Om du vill tända/släcka oavsett vad nuvarande läge är, så
är det ju enklare, bara att "tända" eller "släcka" och du behöver
inte hålla reda på vilket det nuvarande läget är.

> ...om man vill toggla funktionen för en knapp?

Har en alltså *en* knapp som ska ha två olika funktioner?

Tja, det är väl bara att hålla reda på vilken funktion som
knappen har "just nu", och sedan byta funktion när det
händer något som gör att den ska byta funktion...
Vad är problemet/frågan?

> Ska man göra lika att den sparar ett värde high or low (1 eller 0) och från det om förgående
> värde är tex high så ska den sända snutten med bitar dom är för low?

Ja visst! Om det är den funktionen du behöver, så gör så.
Är det någon fråga kring just det?

Knappen har alltså inte två utan bara *en* funktion,
"byt läge på lampan". D.v.s inte "tänd" och "släck".
Men det blir ju mer filosofi än elektronik... :-)
Miramithe
Inlägg: 1423
Blev medlem: 21 januari 2013, 17:45:10
Ort: Borlänge

Re: Lite Arduinobekymmer...

Inlägg av Miramithe »

Okej vi tar det från början så det blir glasklart.
Har en 433mhz modul som jag ska sända en på och en avsignal med, har bitarna som ska sändas, ska använda en knapp och när man trycker på den första gången ska den skicka "på" och trycker man igen ska den skicka "av" alltså alternera/växla/toggla mellan på och av, precis som i början på denna tråd när det då handlade om LED som skulle tändas/släckas med bara en knapp per LED.
Det finns ingen feedback för om den är på eller av så det behöver bara skickas.

Kod: Markera allt

const int led = 13;
const int buttonPin = 9;
#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

int buttonState;
int lastButtonState = LOW;
int ledState = HIGH;

long lastDebounceTime = 0;
long debounceDelay = 50;

void setup() {
  
  pinMode(buttonPin, INPUT);
  pinMode(led, OUTPUT);


  Serial.begin(9600);
    mySwitch.enableTransmit(10);
}

void loop() {
  
  int reading = digitalRead(buttonPin);
  
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }
    
  if ((millis() - lastDebounceTime) > debounceDelay) {
    
    if (reading != buttonState) {
      buttonState = reading;
      
    if (buttonState == HIGH) {
     ledState = !ledState;
     }  
   }
  }
  
  digitalWrite(led, ledState);
  lastButtonState = reading;
  
}
Om man tar den koden bara för toggle funktionen, med en led som indikerar om det är på eller av.
Var i detta sätter jag in att den ska sända mina bitar med data?

Ska man sätta i början på loopen typ "if (ledState = LOW); skicka data" eller ska den ligga efter att man läser knappen, om den ändrat sig ska man skicka bitarna, eller är det helt fel att lägga in det if?
LarryXz
Inlägg: 670
Blev medlem: 13 mars 2013, 20:31:08
Ort: Norra Uppland

Re: Lite Arduinobekymmer...

Inlägg av LarryXz »

Kod: Markera allt

int transmitterPin = 11;
int buttonPin = 10;

boolean radioState = LOW;
Radio radio = Radio(transmitterPin);

void setup()
{
	radio.initialize();
}

void loop()
{
	if (digitalRead(buttonPin) == HIGH)
	{
		//Invert state
		radioState = !radioState;
		//Then send it
		radio.sendState(radioState);
	}
}
Miramithe
Inlägg: 1423
Blev medlem: 21 januari 2013, 17:45:10
Ort: Borlänge

Re: Lite Arduinobekymmer...

Inlägg av Miramithe »

Men den sänder ju så fort man trycker på knappen. Eller ja så fort du har en ny knapptryckning. Hur alternerar den?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Lite Arduinobekymmer...

Inlägg av sodjan »

> Hur alternerar den?

radioState = !radioState;

Sen så behöver du så klart lägga dit lite logik för att
vänta på "debounce" och kanske så att den inte börjar
blinka med ljuset om man håller knappen intryckt. D.v.s
att även vänta på att man släpper knappen innan man
kollar efter intryckt knapp igen.
Miramithe
Inlägg: 1423
Blev medlem: 21 januari 2013, 17:45:10
Ort: Borlänge

Re: Lite Arduinobekymmer...

Inlägg av Miramithe »

Ja den gör ju lika som för output på LED som var från början att om man trycker på knappen ändrar den, det jag inte förstår är var jag ska skriva in Binära koden den ska skicka, iaf så tog jag den gamla koden och skrev om lite så nu funkar den, men

Kod: Markera allt

const int led = 13;
const int buttonPin = 9;
#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

int buttonState;
int lastButtonState = LOW;
int ledState = LOW;

long lastDebounceTime = 0;
long debounceDelay = 50;

void setup() {
  
  pinMode(buttonPin, INPUT);
  pinMode(led, OUTPUT);


  Serial.begin(9600);
    mySwitch.enableTransmit(10);
}

void loop() {
  
  int reading = digitalRead(buttonPin);
  
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }
    
  if ((millis() - lastDebounceTime) > debounceDelay) {
    
    if (reading != buttonState) {
      buttonState = reading;
      
     if (buttonState == HIGH) {
      ledState = !ledState;
     }
     else if(ledState == HIGH) {
      Serial.println("on");
      mySwitch.sendTriState("0FFFFF0FFFF1");
     }
     else if(ledState == LOW) {
      Serial.println("off");
      mySwitch.sendTriState("0FFFFF0FFFF0");
     }  
    }
  }
  
  digitalWrite(led, ledState);
  lastButtonState = reading;
}
men det är ju inte helt rätt eller? else if skulle jag vilja ha som if bara men då funkar det inte.
Nu skriver den ju ut i serialmonitor om den är på eller av eller ja den säger om den skickat att det ska vara på eller av.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Lite Arduinobekymmer...

Inlägg av jesse »

Ju fler if-satser man blandar och har i varandra desto mer spaghettikod blir det. Till slut blir det oläsligt.
Därför är det bra att göra funktioner istället.

Men...

på rad 40 ska du inte ha else if. Du ska istället ha de följande raderna (rad 40-46) innanför parenteserna på ifsatsen på rad 37.
I och med att du togglar värdet på ledState så ska du också sända informationen.

Så det blir:

Kod: Markera allt

 if (buttonState == HIGH) {
      ledState = !ledState;
    
     if(ledState == HIGH) {
      Serial.println("on");
      mySwitch.sendTriState("0FFFFF0FFFF1");
     }
     else if(ledState == LOW) {
      Serial.println("off");
      mySwitch.sendTriState("0FFFFF0FFFF0");
     } 
 } 
jag hade skrivit så här (gör exakt samma sak):

Kod: Markera allt

...
 if (buttonState == HIGH) {
      ledState = !ledState;
      sendData(ledState);
 } 
...

void sendData(int state) { //*** int kan ersättas med ett åttabitars tal uin8_t så blir koden effektivare ***
     if(state == HIGH) {
      Serial.println("on");
      mySwitch.sendTriState("0FFFFF0FFFF1");
     }
     else if(state == LOW) {
      Serial.println("off");
      mySwitch.sendTriState("0FFFFF0FFFF0");
     } 
 } 
Miramithe
Inlägg: 1423
Blev medlem: 21 januari 2013, 17:45:10
Ort: Borlänge

Re: Lite Arduinobekymmer...

Inlägg av Miramithe »

Tackar ska testa detta senare :D
Skriv svar