Dimma med Nexa och en Arduino, *nya bekymmer*

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
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 »

Funktionerna som skall finnas är:
- Dimma upp/ner , klart
- Stanna på senaste värdet man dimmat till, klart
- Dimma ner till helt avstängt, klart
- Ligga kvar i avstängt läge, klart
- Från avstängt läge dimma upp till senaste värdet man dimmat till, den jobbar vi på.

Är jag på någorlunda rätt väg?
Lade till OFF_TO_PAUSE
enum dimmerStates {
OFF,
DIMMING,
PAUSE,
OFF_TO_PAUSE
};




I loopen har vi.

Kod: Markera allt

if(dimmerState == OFF){  //Turn it off with fade down effect
           
        if(ledValue > 0){
          ledValue--;
          analogWrite(ledPin, ledValue);
        }
      }
      if(dimmerState == PAUSE){  // Pause dimming, and hold value, can be empty for now..
        }
      if(dimmerState == DIMMING){
      ledValue = ledValue + dimChange ;
        if ( (ledValue > 255) || (ledValue < 0) ) {
          dimChange = -dimChange; ; // byt håll
          ledValue = ledValue + dimChange;  // backa tillbaka ett snäpp...
        }
      analogWrite(ledPin, ledValue);
     
      }
      if(dimmerState == OFF_TO_PAUSE){
        digitalWrite(9,HIGH);
        delay(400);                            //Debugging only, remove later
        digitalWrite(9,LOW);
        delay(400);                         //Debugging only remove later
      }
      delay(5);
    }



Och i void processCode(NewRemoteCode receivedCode)

Kod: Markera allt

if (receivedCode.switchType == 1) { // We are turning on
            if( (dimmerState == PAUSE) || (dimmerState == OFF) ) {
              dimmerState = DIMMING;      
            } else {
              dimmerState = PAUSE;
            }
           
         if ( (dimmerState == DIMMING) || (dimmerState == OFF) ) {          // Är jag någorlunda på rätt väg?
              dimmerState = OFF_TO_PAUSE;      
            } else{
              
            }
             digitalWrite(13, HIGH);
          } 
          else if (receivedCode.switchType == 0) {
            dimmerState = OFF;
            digitalWrite(13, LOW);
          }
Man försöker i blindo. :)

Edit ändrade till C++
Senast redigerad av Jonaz 23 januari 2017, 09:19:08, redigerad totalt 2 gånger.
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 »

Höll på att fråga varför du döpt staten till OFF_TO_PAUSE men nu inser jag att jag nog missuppfattat "mönstret" lite.
När du har dimmat tejpen till rätt styrka så trycker du på ON, då stannar dimmningen på rätt styrka. Slår du sedan av tejpen och på igen så ska den återgå till tidigare värde och stanna där, alltså inte återta samma styrka och sen börja dimma upp/ner direkt?

Ju mer jag tänker på det så kanske det blir ett logiskt sätt att ställa in styrkan med bara en ON och OFF knapp. Jösses vad trög jag känner mig men skyller på att jag aldrig varit i närheten av något självdimmande ljus med minne innan :wink:

Om fallet är som ovan så kanske det blir tydligare att byta ut PAUSE till STEADY istället?
Välj gärna också C++ i rullgardinen för "Syntaxmarkera kod" istället för att C-knappen när du lägger in kod. På så sätt försvinner inte indenteringen och man får med lite radnummer samt färger. Underlättar mycket när man ska referera till olika punkter i 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 »

Nu har jag försökt återskapa följande funktion nedan:

- Vid första uppstart kommer allt vara nollat
- Vid ON så kollar den om något tidigare värde för ljusstyrka satts. Då detta inte är fallet så kommer den börja dimma upp och ner.
- Om ON nu trycks igen under den repeterande dimmningen så kommer den stanna och spara undan det nya värdet. Den intar STEADY-state.
- Om ON trycks ytterligare så börjar den dimma igen, osv.
- Om OFF trycks när den är STEADY så dimmas den ner och sätter state OFF.
- Trycks nu ON igen så kollar den om något fast värde tidigare angetts. Har den det så dimma upp till det värdet, annars så börja dimma upp och ner.

Kod: Markera allt

#include <NewRemoteReceiver.h>
     
boolean codeLearned = false;
unsigned long learnedAddress;
unsigned short learnedUnit;
int ledValue = 0;
int steadyLedValue = 0;
int dimChange = 1;
int steadySet = 0;
const int ledPin = 9;       // the pin that the LED is attached to

enum dimmerStates {
OFF,
STEADY,
DIMMING,
DIMMING_TO_OFF,
DIMMING_TO_STEADY
};

dimmerStates dimmerState = OFF;

 
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);
  }

  switch (dimmerState) {
    case STEADY:
      // DO NOTHING, LEAVE LED AT STEADY STATE
      break;
    case DIMMING_TO_OFF:
      DIM_TO_OFF();
      break;
    case DIMMING:
      DIM();
      break;
    case DIMMING_TO_STEADY:
      DIM_TO_STEADY();
      break;
    case OFF:
      ledValue = 0;
      break;
  }
  analogWrite(ledPin, ledValue);
  delay(5)
}


// 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(dimmerState == DIMMING_TO_STEADY) {
          dimmerState = DIMMING;       
        } else if (dimmerState == DIMMING) {
          dimmerState = STEADY;
          steadyLedValue = ledValue;
          steadySet = 1;
        } else if (dimmerState == STEADY) {
          dimmerState = DIMMING;
        } else if (dimmingState == OFF) {
          if(steadySet){
            dimmingState = DIMMING_TO_STEADY;
          } else {
          dimmerState = DIMMING;
          }
        }
        digitalWrite(13, HIGH);
      } else if (receivedCode.switchType == 0) {
        dimmerState = DIMMING_TO_OFF;
        digitalWrite(13, LOW);
      }
    }
  }
}

void DIM() {

  ledValue = ledValue + dimChange;

  if ( (ledValue > 255) || (ledValue < 0) ) {
      dimChange = -dimChange;  // byt håll
      ledValue = ledValue + dimChange;  // backa tillbaka ett snäpp...
  }
}


void DIM_TO_OFF() {

  if(ledvalue > 0){
     ledvalue--; 
  } else {
    dimmerState = OFF;
  }
}

void DIM_TO_STEADY() {
  if(ledValue < steadyLedValue) {
    ledvalue++;
  } else {
    dimmingState = STEADY;
  }
}
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 »

:bravo: :bravo: :bravo:
Ett stort tack till Magnus_K och hanpa!!

Korrigerade lite i koden ovan, var bara lite fel namn, och små och stora bokstäver som behövdes ändras.
Koden i sin helhet. Hoppas fler kan ha nytta av detta.

Kod: Markera allt

/*
 * Demo for RF remote switch receiver. 
 * This example is for the new KaKu / Home Easy / Nexa type of remotes!
 *
 * For details, see NewRemoteReceiver.h!
 *
 * With this sketch you can control a LED connected to digital pin 9 and 13,
 * after the sketch learned the code. After start, the LED on pin 13 starts to blink,
 * until a valid code has been received. The led on 13 stops blinking. Now you
 * can control the LED on 9 with the remote.
 *
 * Note: only unit-switches are supported in this sketch, no group or dim.
 *
 * Set-up: connect the receiver to digital pin 2 and a LED to digital pin 13 and 9.
 */
  #include <NewRemoteReceiver.h>
         
    boolean codeLearned = false;
    unsigned long learnedAddress;
    unsigned short learnedUnit;
    int ledValue = 0;
    int steadyLedValue = 0;
    int dimChange = 1;
    int steadySet = 0;
    const int ledPin = 9;       // the pin that the LED is attached to
     
    enum dimmerStates {
    OFF,
    STEADY,
    DIMMING,
    DIMMING_TO_OFF,
    DIMMING_TO_STEADY
    };
     
    dimmerStates dimmerState = OFF;
     
     
    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);
      }
     
      switch (dimmerState) {
        case STEADY:
          // DO NOTHING, LEAVE LED AT STEADY STATE
          break;
        case DIMMING_TO_OFF:
          DIM_TO_OFF();
          break;
        case DIMMING:
          DIM();
          break;
        case DIMMING_TO_STEADY:
          DIM_TO_STEADY();
          break;
        case OFF:
          ledValue = 0;
          break;
      }
      analogWrite(ledPin, ledValue);
      delay(5);
    }
     
     
    // 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(dimmerState == DIMMING_TO_STEADY) {
              dimmerState = DIMMING;      
            } else if (dimmerState == DIMMING) {
              dimmerState = STEADY;
              steadyLedValue = ledValue;
              steadySet = 1;
            } else if (dimmerState == STEADY) {
              dimmerState = DIMMING;
            } else if (dimmerState == OFF) {
              if(steadySet){
                dimmerState = DIMMING_TO_STEADY;
              } else {
              dimmerState = DIMMING;
              }
            }
            digitalWrite(13, HIGH);
          } else if (receivedCode.switchType == 0) {
            dimmerState = DIMMING_TO_OFF;
            digitalWrite(13, LOW);
          }
        }
      }
    }
     
    void DIM() {
     
      ledValue = ledValue + dimChange;
     
      if ( (ledValue > 255) || (ledValue < 0) ) {
          dimChange = -dimChange;  // byt håll
          ledValue = ledValue + dimChange;  // backa tillbaka ett snäpp...
      }
    }
     
     
    void DIM_TO_OFF() {
     
      if(ledValue > 0){
         ledValue--;
      } else {
        dimmerState = OFF;
      }
    }
     
    void DIM_TO_STEADY() {
      if(ledValue < steadyLedValue) {
        ledValue++;
      } else {
        dimmerState = STEADY;
      }
    }
Edit: Skrev in beskrivningen också.

Ja ha, då var denna klar vad skall vi hitta på nu då? :roll:
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, *Löst*

Inlägg av Magnus_K »

Roligt att det fungerade! Det var tur att hanpa styrde upp det här annars vet jag inte vart det hade slutat :wink:

Är det någon del av koden du inte riktigt förstår? Förklarar gärna om så är fallet.

Eventuellt hade man kunnat göra om alla elseif's till en switch(), precis som i huvudloopen, för att få det lite mer tydligt.
Blir ingen praktisk skillnad men kanske tydligare och lättare att kommentera. Det avgör du.

Det är bara att köra vidare. Hårdvaran brukar vara den enkla biten tycker jag. Det är mjukvaran som skapar mest huvudbry.
Användarvisningsbild
Jonaz
Inlägg: 2326
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Re: Dimma med Nexa och en Arduino, *Löst*

Inlägg av Jonaz »

Jag tror jag för står, det gäller att klura ut var {} skall sitta, men börjar få lite kläm på det, framförallt i if saterna.

Under

Kod: Markera allt

enum dimmerStates {
    OFF,
    STEADY,
    DIMMING,
    DIMMING_TO_OFF,
    DIMMING_TO_STEADY    <<<< Varför skall det inte vare en , där?
    };
Är det för att det är den sista bara? För det verkar inte göra någon skillnad om man sätter ett , där.
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, *Löst*

Inlägg av Magnus_K »

Ja precis. Det är bara för att den är sist i listan.
Jag tror du kan skriva alla på rad också om du vill, men det brukar inte bli lika tydligt.
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, *Löst*

Inlägg av Magnus_K »

Som hjälp till ditt {}-problem så tänkte jag tipsa om nedan.
Det är mycket möjligt att du redan vet om det här men personligen hjälper det mig mycket.

Om du placerar markören vid den vänstra eller högra klammern, så kommer IDE't automatiskt sätta en blå ruta kring den klammern den anser höra ihop med.
Skulle den blåa rutan hamna på fel ställe ställe så saknas det en motsatt klammer någonstans.
Visst, skulle man missa ett helt par {} inom funktionen så förstår inte IDE't detta.

Det hjälper också mycket att ha en "standard" över vart man placerar dom. Ett tips där är att låta IDE't göra den placeringen.
skriver du tex if(statement) { och sedan trycker enter, så kommer du automagiskt få en "rätt" placerad } och markören för-indenterad. Kodsnutten nedan visar hur det ser ut.

Kod: Markera allt

if(statement) {
  | <--- Markören
}
Klammer.JPG
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Jonaz
Inlägg: 2326
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Re: Dimma med Nexa och en Arduino, *Löst*

Inlägg av Jonaz »

Japp det visste jag faktiskt, det med IDE't lärde jag mig under denna resa.

Verkar dock ha lite hårdvaru problem som jag inte tänkt på innan.
Har jag för litet motstånd (220 Ohm) till basen till transistorn (BD139) som går till tejpen så tar Arduinon inte emot signalerna från nexan ordentligt.
Har jag däremot ett 10K så går det fint, dock så blir det för lite spänning ut till tejpen så den lyser för svagt.

Hur kan det komma sig? att den lyser svagare förstår jag då transistorn inte öppnar fullt pga motståndet, men signalen från nexan?

Edit: Ändrade lite fakta fel.
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, *Löst*

Inlägg av Magnus_K »

En gissning är att du drar för mycket ström genom utgången på Arduinon (för hög bas-ström) men det skulle underlätta mycket med ett schema/bild på hela kopplingen.
Vad är det för en tejp du har, och hur lång är den?
Användarvisningsbild
Jonaz
Inlägg: 2326
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Re: Dimma med Nexa och en Arduino, *Löst*

Inlägg av Jonaz »

Ja så kan det såklart vara.
Fixar en bild, skall bara städa upp labbplattan. :oops:
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, *Löst*

Inlägg av Magnus_K »

Om så skulle vara fallet så får du nog vara lite försiktig innan du bränner den utgången.
Eventuellt kan du kanske byta till någon N-kanals Mosfet eller Darlington-trissa?
Användarvisningsbild
Jonaz
Inlägg: 2326
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Re: Dimma med Nexa och en Arduino, *Löst*

Inlägg av Jonaz »

Motstånden sitter i serie 470 Ohm + 470 Ohm + 10K , sedan finns ett på 1K, som går till basen.
Det var 470 Ohm inte 220 som jag skrev innan. Kör jag med 1K så verkar det funka hyfsat. Men det är nog bättre att byta som du säger.
Tejpen är just nu 5 meter och drar typ 0.6A
DSC_0802.JPG

Edit: Ändrade lite i texten
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av Jonaz 23 januari 2017, 13:14:21, redigerad totalt 1 gång.
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, *Löst*

Inlägg av Magnus_K »

Tror det är pga överbelastning som Arduinon slutar kommunicera. Att det börjar fungera bättre när du går upp i basmotstånd tyder också på det.

Det skulle vara intressant att koppla bort arduinon och mata basmotstånden med direkt 5V istället. Samt mäta vilken bas-ström det är med 470 resp 1k.
Testar du så var försiktig så du inte eldar något :wink:

Återkom gärna hur det gick.
Användarvisningsbild
Jonaz
Inlägg: 2326
Blev medlem: 4 november 2003, 22:06:33
Ort: Huddinge

Re: Dimma med Nexa och en Arduino, *Löst*

Inlägg av Jonaz »

Matning från datorn via USB.
0.03mA på 1K
0.07mA på 470 Ohm

Via labbagg
0.04mA på 1K
0.08mA på 470 Ohm

Tycker det verkar lite lite?
Skriv svar