Pomoc so stmievacom

Odpovědět
dusky
Příspěvky: 5
Registrován: 11 říj 2018, 19:00
Reputation: 0

Pomoc so stmievacom

Příspěvek od dusky » 11 říj 2018, 19:32

Ahojte!
Na nete som nasiel paradny program pre stmievanie led. Chcel by som ho pouzit v aute na smievanie osvetlenia noh. Program funguje dobre, no chcelo by to este par uprav. V podstate potrebujem sledovat stav na troch vstupoch a podmienky by som potreboval nesledovne: ak dig1=high alebo dig3=high a dig2=low rozsvieti sa na maximum ak sa nezapne dig2 v casovom intervale, led zhasne. Teraz hlavny problem ak je dig2=high a dig1=low, dig3=low, tak upravi svietivost, cize prida alebo ubere svietivost na nastavenu hodnotu (povedzme 147) bez cakania. Ak je dig2= high a dig3=high rozsvieti sa na maximum. Popis v praxi: otvorim dvere alebo odomknem central, tak sa led rozvieti na maximum a caka na nastartovanie. Ak start nenastane do minuty, tak led pomaly zhasne. Ak start nastane do minuty (dig2 je s-kontakt) a dvere su zavrete, tak sa jas upravi na nastavenu hodnotu (zosilni alebo zoslabi jas z predosleho stavu). Ak je auto nastartovane (s-kontakt je zopnuty) a otvoria sa dvere, tak sa led rozsvieti na maximum, po zatvoreni sa jas vrati do nastavenej hodnoty. Priznavam sa, ze takato uprava je nad moje sily (som uplny amater) a po neuspesnom pokuse o kontakt s autorom programu sa tymto smerom obraciam s prosbou na vas.
za pomoc vopred dakujem :)

Kód: Vybrat vše

/**
 * ATTiny85 PWM LED Dimmer
 * v. 1.3a
 * Copyright (C) 2014 Robert Ulbricht
 *
 * Smooth Led ON/OFF controlled with digital pin 1 or 2.
 * Use HC-SR501 as signal source.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/ 

#include "wiring_private.h"
#include <avr/sleep.h>

//#define RDEBUG

// pin definitions
const int led  = 9;
const int dig1 = 2;
const int dig2 = 3;
const int dig3 = 4;

// states
enum states {stBoot, stDark, stOn, stHold, stOff, stOff30, stHold30};
states state=stBoot;
enum wdtimer {wdt16ms=0, wdt32ms, wdt64ms, wdt128ms, wdt250ms, wdt500ms, wdt1s, wdt2s, wdt4s, wdt8s};
volatile boolean signal_wdt = 1;

#if defined RDEBUG
  //#include <SoftwareSerial.h>

  const int dig_tx = 2;
  const int dig_rx = 5;
  SoftwareSerial s85(dig_rx, dig_tx); // RX, TX
#endif

// base ON period
const unsigned long pot_value = 2000;
unsigned long dig_last;
int value = 0;
#if defined RDEBUG
  const unsigned long hold_value = 5*1000L;
#else
  // base hold period
  const unsigned long hold_value = 45*1000L;
#endif

// ATMEL ATTINY85
//
//                  +-\/-+
//      (D 5) PB5  1|    |8  Vcc
// dig2 (D 3) PB3  2|    |7  PB2 (D 2)
//      (D 4) PB4  3|    |6  PB1 (D 1) dig1
//            GND  4|    |5  PB0 (D 0) led
//                  +----+ 

// table of exponential values
// generated for values of i from 0 to 255 -> x=round( pow( 2.0, i/32.0) - 1);
const byte table[] PROGMEM = {
  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
  0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
  1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   2,   2,   2,   2,
  2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   3,   3,   3,   3,   3,   3,
  3,   3,   3,   3,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,   4,   5,
  5,   5,   5,   5,   5,   5,   5,   6,   6,   6,   6,   6,   6,   6,   7,   7,
  7,   7,   7,   8,   8,   8,   8,   8,   9,   9,   9,   9,   9,  10,  10,  10,
 10,  11,  11,  11,  11,  12,  12,  12,  12,  13,  13,  13,  14,  14,  14,  15,
 15,  15,  16,  16,  16,  17,  17,  18,  18,  18,  19,  19,  20,  20,  21,  21,
 22,  22,  23,  23,  24,  24,  25,  25,  26,  26,  27,  28,  28,  29,  30,  30,
 31,  32,  32,  33,  34,  35,  35,  36,  37,  38,  39,  40,  40,  41,  42,  43,
 44,  45,  46,  47,  48,  49,  51,  52,  53,  54,  55,  56,  58,  59,  60,  62,
 63,  64,  66,  67,  69,  70,  72,  73,  75,  77,  78,  80,  82,  84,  86,  88,
 90,  91,  94,  96,  98, 100, 102, 104, 107, 109, 111, 114, 116, 119, 122, 124,
127, 130, 133, 136, 139, 142, 145, 148, 151, 155, 158, 161, 165, 169, 172, 176,
180, 184, 188, 192, 196, 201, 205, 210, 214, 219, 224, 229, 234, 239, 244, 250
};

///
/// Setup ports
///
void setup() {                
  // disable adc
  cbi(ADCSRA, ADEN);
  setup_watchdog(wdt64ms);

  pinMode(led, OUTPUT); 
  pinMode(dig1, INPUT); 
  pinMode(dig2, INPUT); 
  pinMode(dig3, INPUT); 
#if defined RDEBUG
  s85.begin(9600);
  s85.println(F("ATtiny85 LED dimmer"));
#else
  for(int i=0;i<2;i++)
    ShowLedIsLive();
#endif
state=stDark;
}

///
/// Signal on pin 1 or 2
///
int HasSignal()
{
if(digitalRead(dig1))
  return true;
if(digitalRead(dig2))
  return true;
if(digitalRead(dig3))
  return true;
return false;
}

///
/// Test of LEDs functionality
///
void ShowLedIsLive()
{
digitalWrite(led, HIGH); 
delay(200);
digitalWrite(led, LOW); 
delay(200);  
}

///
/// Slow increasing of intensity
///
void LightOn()
{
#if defined RDEBUG
  s85.println(F("Light ON"));
#endif
unsigned long ms=millis();
unsigned long m=0;
unsigned long m2=pot_value;
while(m<m2)
  {
  int v=map(m,0,m2,value,255);
  //int vm=pgm_read_byte(&table[v]);
  analogWrite(led,v); 
  m=millis()-ms; 
  }
digitalWrite(led, HIGH);
value=255; 
dig_last=millis()+hold_value;
#if defined RDEBUG
  //s85.print(F("dig_last="));
  //s85.println(dig_last);
#endif
state=stHold;
}

///
///  Wait until digital pin is OFF + hold_value
///
void LightHold() {
#if defined RDEBUG
  s85.println(F("Light HOLD"));
#endif
while(millis()<dig_last)
  {
  int p=HasSignal();
  if(p) // still ON
    {
    dig_last=millis()+hold_value;
    #if defined RDEBUG
      //s85.print(F("dig_last="));
      //s85.println(dig_last);
    #endif
    }
  }
state=stOff;
}

///
/// Slow decreasing of intensity
///
void LightOff() {
#if defined RDEBUG
  s85.println(F("Light OFF"));
#endif
unsigned long ms=millis();
unsigned long m=0;
unsigned long m2=pot_value*6; // 6x on period
while(m<m2)
  {
  int p=HasSignal();
  if(p)
    {
    state=stOn;
    #if defined RDEBUG
      s85.print(F("Signal break at "));
      //s85.println(value);
    #endif
    return;
    }
  value=map(m,0,m2,255,0);  
  int vm=pgm_read_byte(&table[value]);
  value=vm;
  analogWrite(led,vm); 
  if(value<20) {
    state=stHold30;
    return;
    }
  m=millis()-ms; 
  }
digitalWrite(led, LOW);
value=0;
#if defined RDEBUG
  s85.println(F("Dark"));
#endif
state=stDark;
}

///
/// Handles darkness
///
void LightDark() {
  int p=HasSignal();
  if(p)
    state=stOn;
  else
    system_sleep();
}

///
/// Handled dusk
///
void LightHold30() {
#if defined RDEBUG
  s85.println(F("Light HOLD 30"));
#endif
dig_last=millis()+hold_value;
while(millis()<dig_last)
  {
  int p=HasSignal();
  if(p) // still ON
    {
    #if defined RDEBUG
      //s85.print(F("dig_last="));
      //s85.println(dig_last);
    #endif
    state=stOn;
    return;
    }
  }
state=stOff30;
}

///
/// From dusk to darkness
///
void LightOff30() {
#if defined RDEBUG
  s85.println(F("OFF 30"));
#endif
unsigned long ms=millis();
unsigned long m=0;
unsigned long m2=pot_value;
while(m<m2)
  {
  int p=HasSignal();
  if(p)
    {
    state=stOn;
    return;
    }
  int v=map(m,0,m2,value,0);  
  analogWrite(led,v);
  value=v; 
  m=millis()-ms; 
  }
digitalWrite(led, LOW);
value=0;
state=stDark;
}

///
/// Main loop
///
void loop() {
  switch(state) {
    case stDark:
      LightDark();
      break;
    case stOn:
      LightOn();
      break;
    case stHold:
      LightHold();
      break;
    case stOff:
      LightOff();
      break;
    case stHold30:
      LightHold30();
      break;
    case stOff30:
      LightOff30();
      break;
  }
}

///
/// set system into the sleep state 
/// system wakes up when wtchdog is timed out
///
void system_sleep() {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
  sleep_enable();
  sleep_mode();                        // System sleeps here
  sleep_disable();                     // System continues execution here when watchdog timed out 
}

///
/// Setup watchdog
///
/// 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
/// 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
///
void setup_watchdog(byte t) {
  byte bb;
  int ww;
  if(t>wdt8s)
    t=wdt8s;
  bb=t&7; // WDP[2:0]
  if(t>wdt2s)
    sbi(bb,WDP3);
  sbi(bb,WDCE);
  ww=bb;

  cbi(MCUSR,WDRF);
  // start timed sequence
  WDTCR |= (1<<WDCE) | (1<<WDE);
  // set new watchdog timeout value
  WDTCR = bb;
  sbi(WDTCR,WDIE);
}

///
/// Watchdog Interrupt Service
///
/// is executed when watchdog timed out
///
ISR(WDT_vect) {
  signal_wdt=1;  // set global flag
}

dusky
Příspěvky: 5
Registrován: 11 říj 2018, 19:00
Reputation: 0

Pomoc so stmievacom

Příspěvek od dusky » 14 říj 2018, 17:40

vymyslel som nieco taketo

Kód: Vybrat vše

#include <LEDFader.h>
#include <Bounce2.h>
#include <Curve.h>

#define kluc 3
#define central 2
#define dvere 4
LEDFader led = LEDFader(9);

int ledState = 0;
unsigned long previousMillis = 0;
unsigned long currentMillis = 0;
const long interval = 40000;  

void setup() {
  pinMode(kluc, INPUT);
  pinMode(central, INPUT);
  pinMode(dvere, INPUT);
}

void loop() {

  currentMillis = millis();


  if (digitalRead(central) == 1) {
    previousMillis = currentMillis;
    led.fade(70, 1000);
    }
    
  else if (digitalRead(dvere) == 1) {
    previousMillis = currentMillis;
    led.fade(255, 1000);
   }

  else if (digitalRead(dvere) == 1 && digitalRead(kluc) == 1) {
    previousMillis = currentMillis;
    led.fade(255, 1000);
    ledState = 1;}

  else if (digitalRead(kluc) == 1 && digitalRead(dvere) == 0) {
    previousMillis = currentMillis;
    led.fade(70, 1000);
    ledState = 1;
    previousMillis = currentMillis;}
    else if (currentMillis  >= interval + previousMillis) {
      led.fade(0,3000);}
   
        
  
  led.update();
}
a celkom to aj funguje :o :lol: ak tam mam nejaku tu chybu, prosim o opravu :P

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 5 hostů