Lite Arduinobekymmer...
Re: Lite Arduinobekymmer...
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...
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...
Re: Lite Arduinobekymmer...
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?
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?
Re: Lite Arduinobekymmer...
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...
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...

Re: Lite Arduinobekymmer...
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.
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?
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;
}
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?
Re: Lite Arduinobekymmer...
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);
}
}
Re: Lite Arduinobekymmer...
Men den sänder ju så fort man trycker på knappen. Eller ja så fort du har en ny knapptryckning. Hur alternerar den?
Re: Lite Arduinobekymmer...
> 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.
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.
Re: Lite Arduinobekymmer...
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
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.
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;
}
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.
Re: Lite Arduinobekymmer...
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:
jag hade skrivit så här (gör exakt samma sak):
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");
}
}
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");
}
}