Dimma med Nexa och en Arduino, *nya bekymmer*

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Dimma med Nexa och en Arduino, lite problem..

Inlägg av Magnus_K »

Sitter och kikar nu men input:en från NEXAn ligger som en interrupt så det var därför man inte hade något mer i loopen i alla fall. Det blir lite att läsa på när man är kod-dyslektiker..

Funktionen du är ute efter är att vid ON så ska tejpen tändas och börja dimma upp och ner. Trycker du ON igen så ska den stanna där den är i fade:ningen men fortsätta vara på. Trycker du ON igen så ska den återuppta fade:ningen.
När du slutligen trycker OFF så ska den släckas?
Om det stämmer så hade jag missat det där med "pausen".

Vad jag kan se så gör det inget att fade-funktionen ligger i loop:en. Denna funktionen kommer rullas om och om igen fram till du trycker på ON/OFF, då triggas ett interrupt som pausar fade-funktionen, utför processCode() och sedan återgår där den var i fade-funktionen/loopen.

Måste klura lite mer men en sak vi kan göra (om ingen annan ser problemet) är att ladda ner "NEXA-koden" igen om verkligen bekräfta att den dimmar LED:en upp och ner med nedan modiferad kod.
Har inte provkört eller kompilerat koden men säg till om du får något fel du inte klurar ut direkt.

Kod: Markera allt

#include <NewRemoteReceiver.h>

boolean codeLearned = false;
unsigned long learnedAddress;
unsigned short learnedUnit;
int receivedCmd;
const int ledPin = 9;       // the pin that the LED is attached to
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by

void setup() {
  // LED-pin as output
  pinMode(9, OUTPUT);

  // Init a new receiver on interrupt pin 0, minimal 2 identical repeats, and callback set to processCode.
  NewRemoteReceiver::init(0, 2, processCode);
}

void loop() {
  // Blink led until a code has been learned
  if (!codeLearned) {
    digitalWrite(13, HIGH);
    delay(500);
    digitalWrite(13, LOW);
    delay(500);
  }
  while(receivedCmd){
    analogWrite(ledPin, brightness);
    // change the brightness for next time through the loop:
    brightness = brightness + fadeAmount;
    // reverse the direction of the fading at the ends of the fade:
    if (brightness <= 0 || brightness >= 255) {
      fadeAmount = -fadeAmount;
    }
    // wait for 30 milliseconds to see the dimming effect
    delay(30);
  }
  brightness = 0;
  analogWrite(ledPin, brightness);
}

// Callback function is called only when a valid code is received.
void processCode(NewRemoteCode receivedCode) {
  // A code has been received.
  // Do we already know the code?
  if (!codeLearned) {
    // No! Let's learn the received code.
    learnedAddress = receivedCode.address;
    learnedUnit = receivedCode.unit;
    codeLearned = true;   
  } else {
    // Yes!   
    // Is the received code identical to the learned code?
    if (receivedCode.address == learnedAddress && receivedCode.unit == learnedUnit) {
      // Yes!     
      // switchType == 1 means on, switchType == 0 means off.
      if (receivedCode.switchType == 1) {
        digitalWrite(13, HIGH);
        receivedCmd = 1;  
      } else if (receivedCode.switchType == 0) {        
        digitalWrite(13, LOW);                          //<<<<< Här är det FRÅN
        receivedCmd = 0;
      }
    }
  }
}
Senast redigerad av Magnus_K 21 januari 2017, 00:11:34, redigerad totalt 2 gånger.
Användarvisningsbild
Jonaz
Inlägg: 2326
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Re: Dimma med Nexa och en Arduino, lite problem..

Inlägg av Jonaz »

"Funktionen du är ute efter är att vid ON så ska tejpen tändas och börja dimma upp och ner. Trycker du ON igen så ska den stanna där den är i fade:ningen men fortsätta vara på. Trycker du ON igen så ska den återuppta fade:ningen.
När du slutligen trycker OFF så ska den släckas?"

Helt korrekt!

Laddar in koden och kollar!
Användarvisningsbild
Jonaz
Inlägg: 2326
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Re: Dimma med Nexa och en Arduino, lite problem..

Inlägg av Jonaz »

Nästan...
Den stannar inte vid on igen, och efter av och på så blinkar det bara..
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Dimma med Nexa och en Arduino, lite problem..

Inlägg av Magnus_K »

Nej, den kommer inte stanna vid ON igen. Det blir nästa funktion att få till. Ska se vad det är jag missat som får det att blinka vid ON igen.
Användarvisningsbild
hanpa
Utsparkad, på semester
Inlägg: 639
Blev medlem: 22 november 2016, 21:54:43
Ort: Hemort

Re: Dimma med Nexa och en Arduino, lite problem..

Inlägg av hanpa »

Koden ser skum ut, speciellt while-loopen. Plus oinitierad variabel är inte så snyggt även om det kanske funkar.

Jag skulle ha löst det med någon state som sätts i samband med att man kodar av ON/OFF.

Kod: Markera allt

enum dimmerStates {
  OFF,
  DIMMING,
  ON
};

dimmerStates dimmerState = OFF;
Och sen sätta och kolla på detta på lämpligt ställe
Skogen
Inlägg: 901
Blev medlem: 5 januari 2013, 22:50:34
Ort: Alingsås

Re: Dimma med Nexa och en Arduino, lite problem..

Inlägg av Skogen »

Om du BARA ska blinka lysdioder så är det väl ok att använda "delay" men annars kan det skapa problem.
Tänk på att koden stannar vid "delay" då tar den inte emot nya kommandon.
Bättre att räkna millisekunder.
Användarvisningsbild
hanpa
Utsparkad, på semester
Inlägg: 639
Blev medlem: 22 november 2016, 21:54:43
Ort: Hemort

Re: Dimma med Nexa och en Arduino, lite problem..

Inlägg av hanpa »

Nej, koden "stannar" inte vid delay och kommandon lär kunna tas emot. Är inte insatt i just denna tillämpning men det ser ut att vara avbrottsstyrt så delay ska inte hindra att kommandon tas emot. Det som händer vid delay är bara att man inte kör något i huvudloopen under den tidsperioden, plus att yield anropas så att annat kan utföras.
Användarvisningsbild
Jonaz
Inlägg: 2326
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Re: Dimma med Nexa och en Arduino, lite problem..

Inlägg av Jonaz »

Efter inlärning av nexa sändaren dimrar den fint upp och ner, trycker man av så dimrar den fint ner till 0 och stannar där.
Det som återstår är att när man trycker på on när den dimrar så skall den stanna, och trycker man ytterligare en gång på on så skall dimringen gå igång igen, och från av läge till on dimras upp till senast värde.

Här är senaste versionen.

Kod: Markera allt

    #include <NewRemoteReceiver.h>
     
    boolean codeLearned = false;
    unsigned long learnedAddress;
    unsigned short learnedUnit;
    int receivedCmd;
    const int ledPin = 9;       // the pin that the LED is attached to
   
     
    void setup() {
      // LED-pin as output
      pinMode(9, OUTPUT);
     pinMode(13, OUTPUT); // Only for debugging
      // Init a new receiver on interrupt pin 0, minimal 2 identical repeats, and callback set to processCode.
      NewRemoteReceiver::init(0, 2, processCode);
    }
     
        void loop() {
      // Blink led until a code has been learned
      if (!codeLearned) {
        digitalWrite(13, HIGH);
        delay(500);
        digitalWrite(13, LOW);
        delay(500);
      }
      if(receivedCmd){
        for (int i = 0; i < 255; i++){
          analogWrite(ledPin, i);
          delay(5);             // Only for fade effect
        }
        for (int i = 255; i > 0; i--){
          analogWrite(ledPin, i);
          delay(5);           // Only for fade effect
        }
      } else {
        analogWrite(ledPin, 0);
      }
    }



        // Callback function is called only when a valid code is received.
    void processCode(NewRemoteCode receivedCode) {
      // A code has been received.
      // Do we already know the code?
      if (!codeLearned) {
        // No! Let's learn the received code.
        learnedAddress = receivedCode.address;
        learnedUnit = receivedCode.unit;
        codeLearned = true;
        digitalWrite(13, LOW);  
      } else {
        // Yes!  
        // Is the received code identical to the learned code?
        if (receivedCode.address == learnedAddress && receivedCode.unit == learnedUnit) {
          // Yes!    
          // switchType == 1 means on, switchType == 0 means off.
          if (receivedCode.switchType == 1) {
            digitalWrite(13, HIGH);
            receivedCmd = 1;  
          } else if (receivedCode.switchType == 0) {                                  
            receivedCmd = 0;
          }
        }
      }
    }
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Dimma med Nexa och en Arduino, lite problem..

Inlägg av Magnus_K »

Ska förklara vilka ändringar jag gjort lite senare (ont om tid just nu), men prova nedan kod.
Jag har försökt att lägga till pausen genom att låsa for-looparna i while-loopar om du togglar ON.
Det är egentligen inte ett direkt snyggt sätt men vi kan ju testa i alla fall.

Kod: Markera allt

#include <NewRemoteReceiver.h>
     
boolean codeLearned = false;
unsigned long learnedAddress;
unsigned short learnedUnit;
int receivedCmd;
int pauseCmd;
const int ledPin = 9;       // the pin that the LED is attached to

 
void setup() {
  // LED-pin as output
  pinMode(9, OUTPUT);
 pinMode(13, OUTPUT); // Only for debugging
  // Init a new receiver on interrupt pin 0, minimal 2 identical repeats, and callback set to processCode.
  NewRemoteReceiver::init(0, 2, processCode);
}
 
    void loop() {
  // Blink led until a code has been learned
  if (!codeLearned) {
    digitalWrite(13, HIGH);
    delay(500);
    digitalWrite(13, LOW);
    delay(500);
  }
  if(receivedCmd){
    for (int i = 0; i < 255; i++){
      analogWrite(ledPin, i);
      while(pauseCmd);
      delay(5);             // Only for fade effect
    }
    for (int i = 255; i > 0; i--){
      analogWrite(ledPin, i);
      while(pauseCmd);
      delay(5);           // Only for fade effect
    }
  } else {
    analogWrite(ledPin, 0);
  }
}



    // Callback function is called only when a valid code is received.
void processCode(NewRemoteCode receivedCode) {
  // A code has been received.
  // Do we already know the code?
  if (!codeLearned) {
    // No! Let's learn the received code.
    learnedAddress = receivedCode.address;
    learnedUnit = receivedCode.unit;
    codeLearned = true; 
  } else {
    // Yes! 
    // Is the received code identical to the learned code?
    if (receivedCode.address == learnedAddress && receivedCode.unit == learnedUnit) {
      // Yes!   
      // switchType == 1 means on, switchType == 0 means off.
      if (receivedCode.switchType == 1) {
        if(receivedCmd){
          if(pauseCmd){
            pauseCmd = 0;
          } else {
            pauseCmd = 1;
          }
        }
        digitalWrite(13, HIGH);
        receivedCmd = 1; 
      } else if (receivedCode.switchType == 0) {
        digitalWrite(13, LOW);                                 
        receivedCmd = 0;
      }
    }
  }
}
Användarvisningsbild
Jonaz
Inlägg: 2326
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Re: Dimma med Nexa och en Arduino, lite problem..

Inlägg av Jonaz »

Nu stannar den vid andra on tryckningen som det är tänkt, dock låser sig programmet där och inget mer händer, pinne 13 funkar dock fortfarande :humm:
Skall pilla lite, inte för att jag tror jag har en lösning direkt.
Borde man inte ha en funktion för att komma ihåg värdet på sista on när man går från off till on? Bara en tanke som förmodligen är tokig.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Dimma med Nexa och en Arduino, lite problem..

Inlägg av Magnus_K »

Bli det bättre om du lägger till pauseCmd = 0; under raden där du släcker LED 13?

Du fastnar just nu i någon av while-looparna tror jag.
Användarvisningsbild
Jonaz
Inlägg: 2326
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Re: Dimma med Nexa och en Arduino, lite problem..

Inlägg av Jonaz »

Nej ingen skillnad vad jag kan se.

EDIT: Fel av mig, den, den fortsätter att dimra antingen upp till 255 eller 0 beronde på när man trycker.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Dimma med Nexa och en Arduino, lite problem..

Inlägg av Magnus_K »

Vet inte riktigt hur man ska bära sig åt att just pausa fade:ningen när det ligger i en sån loop.
Det hade varit lättare om man fade:at tejpen med en timer interrupt, för då hade man bara kunna stänga av interruptet tillfälligt.

Ska klura lite till Jonaz men eventuellt får vi skriva om koden till att fade:a tejpen med en timer istället. Bättre på alla möjliga sätt men tror aldrig jag har gjort det på en Arduino (AVR) tidigare...

Någon annan som har en idé?
Användarvisningsbild
hanpa
Utsparkad, på semester
Inlägg: 639
Blev medlem: 22 november 2016, 21:54:43
Ort: Hemort

Re: Dimma med Nexa och en Arduino, lite problem..

Inlägg av hanpa »

Mycket märklig kodlösning...

Jag hade satt ett state (se tidigare inlägg) i samband med mottagning av kommandon och sen i huvudloopen bara utfört vad som ska utföras i resp. state.

Alltså:

I koden som tar emot kommandon från Nexa:
- Sätt state beroende på vilket kommando som tas emot och vilket state som gällde innan.
- Inget mer...


I huvudloopen:
- Om state är OFF, kommendera släckning
- Om state är DIMMING, kör koden som ökar/minskar ljusstyrkan
- Om state är ON, gör ingenting, dvs behåll tidigare ljusstyrka

Mer än så borde det väl inte vara. Sen kan man kalla staten vad man vill men principen borde hålla och det blir lätt att förstå koden.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Dimma med Nexa och en Arduino, lite problem..

Inlägg av Magnus_K »

Mycket väl medveten om att det är en märklig kodlösning, men kan man inte bättre så... Kanske skulle knipa igen istället?

Vad är DIMMING för någon state då? Har fjärrisen en tredje knapp?
Skriv svar