Sketch atmega328p sleep und Interrupt?

Hallo an alle.

Ich möchte diesen Sketch zum laufen bekommen aber er klemmt im Sleep u. einiges andere funktioniert noch nicht.

Ich programmiere direkt den atmega328p u. nutze den Nano als Programmer. Das funktioniert alles super.

Aus Gründen der Platine muss der Taster auf PIN 11 (Physisch 15 OC2A OC2 MOSI PCINT4 PB4) bleiben.Daher muss ich bin change für den Interrupt auf PCint4 legen.

Also soll es einen Taster geben der den Interrupt auslöst u.den Sleep-Modus unterbricht so dass Void Starter aufgerufen wird. Außerdem soll der Timer alle vier Sekunden auch einen Interrupt auslösen, so das der loop durchläuft.

Wenn kein Taster gedrückt ist && USB Status = 0 ist, geht er in sleep. Er geht auch in den Sleep Mode weil nur 2 mA gezogen werden.

Der timer unterbricht den sleep nicht und der Interrupt vom Taster geht auch nicht. Sieht man auch gut weil loop nicht mehr durchlaufen wird, sonst würde wenn der USB Status 1 ist.

-Hauptlicht geht für 5h an wenn USB Status 0 ist

-Wenn nichts passiert - Sleep aktiviert

-Timer unterbricht Sleep Mode, Loop läuft durch

-Taster geht auf 1 u. löst Interrupt aus u. startet Void Starter

-Wenn USB Status 1 ist, Hauptlicht aus

#include <avr/sleep.h>
#include <TimerOne.h>

int USBvcc     = 16;
int Taster     = 11; // (physischer Pin 15)
int Rot        = 6;
int Weis       = 5;
int Sound      = 10;
int Hauptlicht = 9;

int Status; 
int Tasterzustand; 
int R;
int W;
int H = 255;

int USBStatus;

unsigned long currentMillis = millis(); // Zeitspeicher

volatile bool tasterInterrupt = false;  // Flag für Interrupt

void setup() {
  pinMode(Hauptlicht, OUTPUT); // LED-Ausgang
  pinMode(Rot, OUTPUT);
  pinMode(Weis, OUTPUT);
  pinMode(Sound, OUTPUT);
  pinMode(Taster, INPUT); 
  pinMode(USBvcc, INPUT);

  // Timer-Interrupt einrichten (alle 4 Sekunden)
  Timer1.initialize(4000000); // 4 Sekunden
  Timer1.attachInterrupt(timerInterrupt); // Timer-Interrupt-Funktion zuweisen

  // Pin Change Interrupt aktivieren für Taster (PB4 = PCINT4)
  PCICR |= (1 << PCIE0);    // Aktiviert PCINTs für Port B
  PCMSK0 |= (1 << PCINT4);  // Aktiviert PCINT für PB4 (Pin 11)
  sei();                    // Globale Interrupts aktivieren
}

void loop() {
  USBStatus = digitalRead(USBvcc);
  Tasterzustand = digitalRead(Taster);
  Zeit();

  // Wenn Taster-Interrupt ausgelöst wird und der USB-Status 0 ist, dann Starter ausführen
  if (tasterInterrupt && USBStatus == 0) {
    Starter();  // Starter-Funktion ausführen
  }

  // Wenn der USB-Status 1 ist, Hauptlicht ausschalten
  if (USBStatus == 1) {
    digitalWrite(Hauptlicht, 0); 
  }

  // Wenn der Taster-Interrupt nicht ausgelöst wurde und der USB-Status 0 ist
  if (!tasterInterrupt && USBStatus == 0) {
    // Den Schlafmodus aktivieren
    goToSleep();  // in den Schlafmodus gehen
  }
}

void timerInterrupt() {
  // Funktion, die bei jedem Timer-Interrupt ausgelöst wird
  // Wird verwendet, um den Sleep-Modus zu unterbrechen
}

void goToSleep() {
  // Interrupt für den Taster aktivieren (Wake-Up)
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Power-Down-Modus wählen
  sleep_enable(); // Schlafmodus aktivieren
  sleep_mode(); // In den Schlafmodus gehen

  // Der Mikrocontroller wird hier durch den Timer-Interrupt oder den Taster-Interrupt geweckt
  sleep_disable(); // Schlafmodus deaktivieren nach dem Aufwachen
  tasterInterrupt = false; // Interrupt-Flag zurücksetzen
}

ISR(PCINT0_vect) {
  // ISR für Pin Change Interrupt auf Port B (PB4 = Pin 11)
  if (digitalRead(Taster) == HIGH) { // Prüfen, ob der Taster gedrückt wurde
    wakeUp();
  }
}

void wakeUp() {
  // Taster Interrupt, um den Mikrocontroller aufzuwecken
  tasterInterrupt = true;
}

void Zeit() {
  if (millis() - currentMillis >= 86400000) {
    currentMillis = millis();  // 24h abgelaufen -> Zeitspeicher neu setzen
  } else if ((millis() - currentMillis < 18000000) && (USBStatus == 0)) { 
    analogWrite(Hauptlicht, 255);  // Licht für die ersten 6h
  } else {
    analogWrite(Hauptlicht, 0);  // Licht ausschalten, wenn keine Bedingung erfüllt ist
  }
}

void Starter() {
    delay(1000);
    digitalWrite(Sound, HIGH);
    delay(100);
    digitalWrite(Sound, LOW);

    for (int D = 0; D <= 254;) {
      analogWrite(Rot, R = R + 5);
      D = D + 5;
      delay(50); 
    }

    for (int D = 0; D <= 34;) {
      for (int X = 0; X <= 254;) {
        analogWrite(Rot, R = R - 5);
        analogWrite(Weis, W = W + 5);
        analogWrite(Hauptlicht, H = H - 5);
        X = X + 5; 
        delay(10); 
      }

      for (int X = 0; X <= 254;) {
        analogWrite(Rot, R = R + 5);
        analogWrite(Weis, W = W - 5);
        analogWrite(Hauptlicht, H = H + 5);
        X = X + 5; 
        delay(10); 
      } 
      D = D + 1;
    }

    for (int X = 0; X <= 254;) {
      analogWrite(Hauptlicht, H = H - 5);
      X = X + 5; 
      delay(5);  
    }

    for (int D = 0; D <= 254;) {
      analogWrite(Rot, R = R - 5);
      analogWrite(Hauptlicht, H = H + 5);
      D = D + 5;
      delay(40);  
    }
}
Programmiersprache, sleep
Feuchtigkeitssensor wie sinnvoller anwenden in automatischer Gießanlage (Arduino)?

Hi,

Ich habe mir vor einem Jahr eine automatische Gießanlage mit einem Arduino gebaut. Die macht ihre Arbeit hervorragend. Gießt ein bis zwei Mal am Tag die Blumenkästen. Wassertank reicht etwa 14 Tage, ist der leer schaltet sich die Pumpe nicht an. Alles prima.

Jedoch war die eigentliche Absicht, erst die Feuchtigkeit zu messen und danach zu entscheiden ob gegossen werden muss oder nicht. Platine ist schon ne Weile angepasst und der Sketch geschrieben.

Mein Problem ist aber, dass ich mir den Messvorgang selber, einfacher vorgestellt hätte. Ich habe innerhalb nur eines Blumenkastens extreme Unterschiede in der Feuchtigkeit. Der Sensor ist so programmiert das der Wert einen Bereich von 0 bis 100 hat. Nun ist der Wert selber so unterschiedlich innerhalb weniger Zentimeter das zwischen etwa 40 und 80 alles möglich ist.

Ich hab kein Plan wie ich ansatzweise einen Mittelwert erreiche oder ob ich es ganz anders angehen muss. Ich habe eigentlich auch keinen Bock in jedem Kasten 2 Sensoren einzustellen und dann den Mittelwert zu errechnen.

Erst mal wäre das ein enormer Kabelsalat und dann wäre das immer noch ungenau weil der Wert innerhalb keiner Bereiche stark von einander abweicht.

Ich überlege schon seit Wochen wie es doch möglich wäre, eine sinnvolle Messung vorzunehmen.

Bild zum Beitrag
Erde, Giessen, Arduino, Blumenkasten, Feuchtigkeit, messen, Sensor
STAR TREK! Essen im Holodeck?

Eine Frage für Kenner.

Eine Frage die mich schon eine Weile beschäftigt. Was passiert wenn man Nahrung zu sich nimmt die nicht mit ins Holodeck genommen wurde.

Wie ich dem Internet entnehmen konnte, hat nicht nur mich diese Frage beschäftigt. Und es scheint zwischen den Serien auch einige Unterschiede wie auch Fehler zu geben.

Im Grunde ist ein Holodeck ein Ort an dem Projektionen in Kraftfeldern gehalten werden. Es gibt aber ein Problem würde man zb. einen Apfel essen der in seinen Strukturen, bis zum kleinsten Krümel aus Licht und Energie also Kraftfeldern besteht bzw. davon auch zusammen gehalten wird. Dies ist dann nicht grade gesund und würde auch sofort wieder verschwinden, wenn man das Holodeck verlässt. Besonders wenn die unechte Nahrung grade beim Verdauungsvorgang ist. Gleiches für Getränke die eigentlich unecht sind aber als Hologramm in den Organismus aufgenommen werden.

Nun ist auch in einem Buch "in welchem es wohl um die StarTrek Technik geht" die Rede davon, dass die Objekte welche von echten Personen berührt werden, repliziert würden. Also Mensch berührt Apfel, Apfel wird repliziert.

Der Unterschied ist der, dass dabei die Energie direkt in Materie umgewandelt wird, also das die Anordnung bis zum Atom erfolgt und so der Äpfel erstellt, also repliziert wird. Er ist echt und nicht aus Energie und Kraftfeldern.

Bei Voyager aber, wo eben auch auf dem Holodeck gegessen wird, dürfte dies nicht zutreffen denn sie haben auf Grund ihrer Lage und der damit verbundenen Energieknappheit, nur eine gewisse Zuteilung an Replikationnahrung.

Es würde also wenig Sinn machen, im Holodeck echte Nahrung zu replizieren, wenn es eben nicht genug Energie (oder was auch immer dafür genau notwendig ist) gibt.

Bei DS9 wiederum nehmen sich die Personen ihr Essen auch mit aufs Holodeck. Allerdings ist es auch möglich das Quark dies so wünscht wegen seiner Profite.

Auf der Enterprise erzählt Data, dass einiges auf dem Holodeck echt wäre, anderes nicht.

Außerdem gibt es da noch so ein paar Sachen wo Personen mit dreckiger oder nasser Kleidung das Holodeck verlassen. Wasser und Dreck müssten eigentlich auch nicht mehr außerhalb existieren.

Projektion und Replikation. Alles könnte so klar sein wenn sie nicht im Holodeck essen würden. Persönlich dachte ich bis heut auch nur, dass Replikatoren nur Dinge replizieren bzw. auflösen können.

Was ist eure Meinung zum Thema Essen auf dem Holodeck, wie könnte man sich dies erklären??

ps. Es geht hier nicht um die absolute reelle Wissenschaft, sondern um die von Science Fiction.

Bild zum Beitrag
Essen, Nahrung, Star Trek, Star Trek: Voyager, Hologramm, Star Trek: The Next Generation
Warum lässt sich die Partition nicht vergrößern (SD Karte klonen)?

Bitte nur Antworten die sich auf meine Frage beziehen und die auch helfen!

Ich will meinen mirco SD auf eine größere SD klonen. Dafür habe ich erst mal ein Image mit Win32 Disk Imager erstellt und dieses dann auf die neue SD gespielt.

Mir war schon klar das er nun das Image in der Größe so übernimmt, wie das original eben auf der sd Karte groß ist. Also habe ich jetzt einen nicht zugeordneten Bereich sowie eine exFat Partition. Nun dachte ich, ich könne diese einfach wie üblich vergrößern. Schon 100 mal gemacht. Geht aber nicht. Im Windows ist in der Datenträgerverwaltung die Option ausgegraut und deshalb habe ich das Programm Minitool Partition Wizard oder mit Aomei Partition Assistant versucht, welche ein paar Funktionen mehr bietet wie die Datenträgerverwaltung von Windows. Dort kann ich die Partition verschieden Größe ändern auswählen, aber letztendlich auch keine Veränderungen vornehmen. Also die vorhandenen Partition vergrößern.

Habe dann von Linux gebootet und da GParted verwendet. Meldung steht auf dem Foto.

Habe dann mit HD Clone ein Image und das dann auf die sd zurück gespielt. Aber genau das gleiche Problem. Eine Partition mit den Daten und eine unpartitionierte. Und immer kann ich die vorhanden extFAT Partition nicht vergrößern.

Ich schall es einfach nicht. Wer hat eine Lösung und kann helfen?

Bild zum Beitrag
PC, Computer, Windows, Klonen, SD-Karte, Partition