Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

Navigation



Über uns
HomepageKontakt


Rechtliches
Impressum

geraetschaften:elektronik:belichtungsgeraet

Nachbau

Material:

  1. Philips HB 170 Gesichtsbräuner Solarium (oder ähnlich)
  2. Gehäuse (z.B. Koffer) Achtung: Es sollte ein Mindestabstand zwischen Platine und UV Röhren vorhanden sein, da sonst auf der Platine Schatten der Röhren entstehen können!
  3. Handy Ladegerät
  4. Ardoino Pro mini/Nano oder ähnlich
  5. Relais 5 Volt / 230 V
  6. n-channel Mosfet (wichtig: Logic Level)
  7. GRV ENCODER
  8. Taster
  9. freilauf Diode
  10. 5v Active Buzzer
  11. OLED 0.96„ I2C/SPI Display
  12. DS3231 Real Time Clock

Der Schaltplan sieht wie folgt aus:

Der Source Code (kann sicherlich noch verbessert werden) nachfolgend:

// Belichtungsgeraet by schuballaa v 1.0

#include <Wire.h>
#include "U8glib.h"
#include <DS3231.h>
#include <ClickEncoder.h>
#include <TimerOne.h>

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); // I2C / TWI

DS3231 clock;
RTCDateTime dt;

unsigned long previousMillis = 0;
const long interval = 1000;

char* unixTime;  // a string for the output (returned value) of the dateFormat function
long longUnixTime;  // a long variable to hold the long value of unixTime
long zeitjetzt;
long stopzeit;
long belichtungszeitverbleibend;

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2

int belichtungszeit = 100;
int belichtungsstatus = 0;
int startcountdown = 0;
int abbrechen = 0;
int startstopgesperrt = 0;

const int Relais = 12;
const int Buzzer = 6;
const int StartStop = 7;

int StartStopGedrueckt = 0;
int StartStopState = 0;

ClickEncoder * encoder;
int16_t last, value;

void timerIsr() {
  encoder->service();
}

void boot_logo() {
  u8g.setFont(u8g_font_osb21);
  u8g.drawStr(55, 20, "by");
  u8g.drawStr(-2, 60, "Schuballaa");
}

void Belichtung_Beendet() {
  u8g.setFont(u8g_font_osb21);
  u8g.drawStr(-5, 25, "Belichtung");
  u8g.drawStr(20, 60, "beendet");
}

void Belichtung_abgebrochen() {
  u8g.setFont(u8g_font_osb21);
  u8g.drawStr(20, 40, "abbruch");
}

void Belichtung_startet_in_4() {
  u8g.setFont(u8g_font_osb21);
  u8g.drawStr(15, 25, "start in");
  u8g.drawStr(55, 60, "4");
}

void Belichtung_startet_in_3() {
  u8g.setFont(u8g_font_osb21);
  u8g.drawStr(15, 25, "start in");
  u8g.drawStr(55, 60, "3");
}

void Belichtung_startet_in_2() {
  u8g.setFont(u8g_font_osb21);
  u8g.drawStr(15, 25, "start in");
  u8g.drawStr(55, 60, "2");
}

void Belichtung_startet_in_1() {
  u8g.setFont(u8g_font_osb21);
  u8g.drawStr(15, 25, "start in");
  u8g.drawStr(55, 60, "1");
}

void beep() {
  digitalWrite(Buzzer, HIGH);
  delay(500);
  digitalWrite(Buzzer, LOW);
  delay(500);
}

void belichtungszeiteinstellen() {

  if (value <9999 && value> 999) {
    u8g.firstPage();
    do {
      u8g.setFont(u8g_font_fur42n);
      char buf[9];
      sprintf (buf, "%d", value);
      u8g.drawStr(0, 55, buf);
    } while ( u8g.nextPage() );
  }

  if (value <1000 && value> 99) {
    u8g.firstPage();
    do {
      u8g.setFont(u8g_font_fur49n);
      char buf[9];
      sprintf (buf, "%d", value);
      u8g.drawStr(7, 55, buf);
    } while ( u8g.nextPage() );
  }

  if (value <= 99 && value> 9) {
    u8g.firstPage();
    do {
      u8g.setFont(u8g_font_fur49n);
      char buf[9];
      sprintf (buf, "%d", value);
      u8g.drawStr(30, 55, buf);
    } while ( u8g.nextPage() );
  }

  if (value <= 9 && value> -1) {
    u8g.firstPage();
    do {
      u8g.setFont(u8g_font_fur49n);
      char buf[9];
      sprintf (buf, "%d", value);
      u8g.drawStr(50, 55, buf);
    } while ( u8g.nextPage() );
  }
}

void countdownanzeigen() {
  if (belichtungszeitverbleibend <9999 && belichtungszeitverbleibend> 999) {
    u8g.firstPage();
    do {
      u8g.setFont(u8g_font_fur42n);
      char buf[9];
      sprintf (buf, "%d", belichtungszeitverbleibend);
      u8g.drawStr(0, 55, buf);
    } while ( u8g.nextPage() );
  }

  if (belichtungszeitverbleibend <1000 && belichtungszeitverbleibend> 99) {
    u8g.firstPage();
    do {
      u8g.setFont(u8g_font_fur49n);
      char buf[9];
      sprintf (buf, "%d", belichtungszeitverbleibend);
      u8g.drawStr(7, 55, buf);
    } while ( u8g.nextPage() );
  }

  if (belichtungszeitverbleibend <= 99 && belichtungszeitverbleibend>= 10) {
    u8g.firstPage();
    do {
      u8g.setFont(u8g_font_fur49n);
      char buf[9];
      sprintf (buf, "%d", belichtungszeitverbleibend);
      u8g.drawStr(30, 55, buf);
    } while ( u8g.nextPage() );
  }

  if (belichtungszeitverbleibend <= 9 && belichtungszeitverbleibend> -1) {
    u8g.firstPage();
    do {
      u8g.setFont(u8g_font_fur49n);
      char buf[9];
      sprintf (buf, "%d", belichtungszeitverbleibend);
      u8g.drawStr(50, 55, buf);
    } while ( u8g.nextPage() );
  }
}

void setup(void) {

  u8g.firstPage();
  do {
  } while ( u8g.nextPage() );

  Serial.begin(57600);

  pinMode(Buzzer, OUTPUT);
  pinMode(Relais, OUTPUT);
  pinMode(StartStop, INPUT_PULLUP);

  delay(1000);
  digitalWrite(Buzzer, HIGH);
  u8g.firstPage();
  do {
    boot_logo();
  } while ( u8g.nextPage() );
  delay(1000);
  digitalWrite(Buzzer, LOW);
  delay(3000);
  // Initialize DS3231
  Serial.println("Initialize DS3231");
  clock.begin();
  clock.setDateTime(2012, 2, 21, 00, 00, 00);

  // flip screen, if required
  // u8g.setRot180();

  // set SPI backup if required
  //u8g.setHardwareBackup(u8g_backup_avr_spi);

  // assign default color value
  if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
    u8g.setColorIndex(255);     // white
  }
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
    u8g.setColorIndex(3);         // max intensity
  }
  else if ( u8g.getMode() == U8G_MODE_BW ) {
    u8g.setColorIndex(1);         // pixel on
  }
  else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
    u8g.setHiColorByRGB(255, 255, 255);
  }

  encoder = new ClickEncoder(3, 4, 5);

  Timer1.initialize(1000);
  Timer1.attachInterrupt(timerIsr);

  last = -1;

  value = belichtungszeit;

}

void loop(void) {

  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis>= interval) {
    previousMillis = currentMillis;

    if (startstopgesperrt == 1) {
      startstopgesperrt = 0;
    }

    if (belichtungsstatus == 4) {
      belichtungsstatus = 5;
    }

    if (belichtungsstatus == 3) {
      digitalWrite(Relais, HIGH);
      u8g.firstPage();
      do {
        Belichtung_startet_in_1();
      } while ( u8g.nextPage() );
      belichtungsstatus = 4;
    }

    if (belichtungsstatus == 2) {
      digitalWrite(Relais, HIGH);
      u8g.firstPage();
      do {
        Belichtung_startet_in_2();
      } while ( u8g.nextPage() );
      belichtungsstatus = 3;
    }

    if (belichtungsstatus == 1) {
      digitalWrite(Relais, HIGH);
      u8g.firstPage();
      do {
        Belichtung_startet_in_3();
      } while ( u8g.nextPage() );
      belichtungsstatus = 2;
    }

  }

  StartStopState = digitalRead(StartStop);

  if (StartStopState == LOW && startstopgesperrt == 0) {
    StartStopGedrueckt = 1;
  }

  if (StartStopState == HIGH && StartStopGedrueckt == 1 && startstopgesperrt == 0) {
    Serial.println("Start Stop Taste gedrückt");
    StartStopGedrueckt = 0;

    if (belichtungsstatus == 0) {
      belichtungsstatus = 1;
    }

    if (belichtungsstatus == 2 or belichtungsstatus == 3 or belichtungsstatus == 4 or belichtungsstatus == 5 or belichtungsstatus == 6) {
      abbrechen = 1;
    }

    if (belichtungsstatus == 7 or belichtungsstatus == 8) {
      abbrechen = 0;
      belichtungsstatus = 0;
      Serial.println("neustart");
      belichtungszeit = value;
    }

    startstopgesperrt = 1;
  }

  if (belichtungsstatus == 0) {

    value  = encoder->getValue();

    if (value != last) {
      if (value <1) {
        value = 0;
      } else {
        last = value;
      }
      Serial.print("Encoder Value: ");
      Serial.println(value);
    }
  }

  if (abbrechen == 1) {
    abbrechen = 2;
    digitalWrite(Relais, LOW);
    u8g.firstPage();
    do {
      Belichtung_abgebrochen();
    } while ( u8g.nextPage() );
    digitalWrite(Buzzer, HIGH);
    delay(2000);
    digitalWrite(Buzzer, LOW);
    belichtungsstatus = 8;
  }

  if (belichtungsstatus == 0) {
    belichtungszeiteinstellen();
  }

  if (belichtungsstatus == 6 && abbrechen == 0) {
    dt = clock.getDateTime();
    unixTime = clock.dateFormat("U", dt); // get the unixTime string (unixTime declared char* above)
    longUnixTime = atol(unixTime);
    zeitjetzt = longUnixTime;

    belichtungszeitverbleibend = stopzeit - zeitjetzt;

    Serial.print("zeitjetzt: ");
    Serial.println(zeitjetzt);

    Serial.print("stopzeit: ");
    Serial.println(stopzeit);

    Serial.print("belichtungszeitverbleibend: ");
    Serial.println(belichtungszeitverbleibend);

    countdownanzeigen();

    if (belichtungszeitverbleibend == value) {
      beep();
    }

    if (belichtungszeitverbleibend == 0) {
      Serial.println("Belichtung Beendet");
      digitalWrite(Relais, LOW);
      belichtungsstatus = 7;
      u8g.firstPage();
      do {
        Belichtung_Beendet();
      } while ( u8g.nextPage() );
      digitalWrite(Buzzer, HIGH);
      delay(1000);
      digitalWrite(Buzzer, LOW);
      delay(1000);
      digitalWrite(Buzzer, HIGH);
      delay(1000);
      digitalWrite(Buzzer, LOW);
      delay(1000);
      digitalWrite(Buzzer, HIGH);
      delay(1000);
      digitalWrite(Buzzer, LOW);
    }
  }

  if (belichtungsstatus == 5) {
    dt = clock.getDateTime();
    unixTime = clock.dateFormat("U", dt); // get the unixTime string (unixTime declared char* above)
    longUnixTime = atol(unixTime);
    stopzeit = longUnixTime   value;
    zeitjetzt = longUnixTime;
    belichtungsstatus = 6;
  }

  //Serial.println(belichtungsstatus);
}
geraetschaften/elektronik/belichtungsgeraet.txt · Zuletzt geändert: 2020-09-19 17:09 von schuballaa