Spannungsunterbrechung als Schaltzustand nutzen

Moin Moin,

Ich bin neu in der Arduino Umgebung.
Für ein Projekt benötige ich eure Hilfe.

Ich möcht ein PWM Signal an einem Ausgang schalten
50, 75, 100 %

Das Umschalten soll geschen wenn ich die Versorgungsspannung entferne, beim wieder versorgen soll das Programm in den Nächten Modus springen, nach 100 wider bei 50 anfangen und so weiter.

Wie lese und Speicher ich den den Zustand wenn der MC wieder Spannung bekommt?

Gruß
Alex

Hallo
das geht.
im setup aus den EEPROM dem letzen Zustand lesen. Den nächsten Zustand erzeugen, diesen mit analogWtite ausgeben, im EEPROM speichern und mit while(1); den Sketch stoppen.

kodo_sh:
Ich möcht ein PWM Signal an einem Ausgang schalten
Das Umschalten soll geschen wenn ich die Versorgungsspannung entferne, beim wieder versorgen soll das Programm in den Nächten Modus springen, nach 100 wider bei 50 anfangen und so weiter.

Wie lese und Speicher ich den den Zustand wenn der MC wieder Spannung bekommt?

Du speicherst in einem Byte den Schritt, den Du ausführst.
Du startest ganz normal, schreibst das Byte in das eeprom.
Dann startest wieder, liest den wert aus dem eeprom, addierst +1 schreibst in den eeprom
Dann startest neu, wie oben.
Ist bei der Berechnung der Höchstwert überschritte, machst Du byte=1 und schreibst in eeprom....

kodo_sh:
Ich bin neu in der Arduino Umgebung.

Moin,
welchen Arduino verwendest Du?

Zum testen soll es erstmal auf dem UNO laufen.

Später dann auf einen MC möglichst kleiner mech. Aufbau.
MC + FET + bisschen perepherie.
Platine 10x20mm ist das Ziel.

Gruß Alex

kodo_sh:
Zum testen soll es erstmal auf dem UNO laufen.

Später dann auf einen MC möglichst kleiner mech. Aufbau.
MC + FET + bisschen perepherie.
Platine 10x20mm ist das Ziel.

Da ist doch der ATtiny85 ideal für geeignet.

kodo_sh:
Zum testen soll es erstmal auf dem UNO laufen.

Dann eventuell so:

#include <EEPROM.h>
const byte pwmAusgang = 3;

byte EEPROMReadInt ( unsigned int eeAdresse )
{
  byte wert;
  EEPROM.get( eeAdresse, wert );
  return wert;
}

void EEPROMWriteInt ( unsigned int eeAdresse , byte wert )
{
  EEPROM.put(eeAdresse, wert);
}

void setup(void)
{
  Serial.begin(9600);
  Serial.println("Anfang");
  const unsigned int eeAdresse = 0;
  byte wert = EEPROMReadInt(eeAdresse);
  Serial.print("von EEPROM: ");
  Serial.print(wert);
  switch (wert) {
    case 127:  // 50%
      wert = 191;
      break;
    case 191:  // 75%
      wert = 255;
      break;
    case 255:  // 100%
    default:
      wert = 127;
      break;
  }
  EEPROMWriteInt(eeAdresse, wert);
  Serial.print("\tneu: ");
  Serial.print(wert);
  Serial.println();
  analogWrite(pwmAusgang, wert);
}

void loop(void) {}

EDIT 1: umgestellt auf 50%, 75% und 100%
EDIT 2: unsigned int wert geändert in byte wert. Dank an michael_x!

agmue:

void setup(void)

{

EEPROMWriteInt(eeAdresse, wert);
  Serial.print("\tneu: ");
  Serial.print(wert);
  Serial.println();
  analogWrite(pwmAusgang, wert);
}

Na siehste - so schnell gelöst... :wink:

Und hier der obligatorische Hinweis, das wirklich und wahrhaftig im setup zu machen und nicht im loop() - oder dort sicherstellen, das das nur einmal nach dem Start ausgeführt wird.

Guter Hinweis!

#include <EEPROM.h>

constexpr byte aPin        {11};
constexpr byte anzahl      { 3};
const byte values[anzahl]  {127,191,255}; 

byte stufe EEMEM {0};

void setup() 
{
  byte index = EEPROM[int(&stufe)];
  if(index >= (anzahl-1)) index = 0;
    else index++;
  EEPROM[int(&stufe)] = index;
  analogWrite(aPin,values[index]);
}

void loop(){}

Hallo
ich habe auch noch eine Lösung für dich zum Testen.

#include <EEPROM.h>
const int PinPWM=6;
const byte LedPWM[]={255*0/100,255*50/100,255*75/100,255*100/100};
const int Adresse=0;
void setup() {
  pinMode (PinPWM,OUTPUT);
  int zaehler=EEPROM.read(Adresse);
  EEPROM.write(Adresse,++zaehler);
  analogWrite (PinPWM,LedPWM[zaehler%sizeof(LedPWM)]);
}

@combie
vielen Danke! genau das was es machen soll.

Danke auch allen anderen für Eure schnell angebotene Hilfe.

Gruß
Alex

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.