메이커 Maker

거주환경 개선을 위한 창문 연구 2

지구빵집 2020. 10. 30. 11:28
반응형

 

 

한참 된 프로젝트지만 남겨야 할 내용이라 번역하여 옮깁니다. 원문의 출처는 Arduino 프로젝트“욕실 창”입니다. 저작자는 문제가 있거나 어려움이 있다면 자기에게 연락하라고 합니다. 2013년에 실행한 프로젝트라 실제 연락이 닿을지는 미지수입니다. 

 

이 튜토리얼에서는 다양한 색상의 초경량 LED로 조명되는 가짜 창을 만드는 방법을 설명합니다. 이들은 Arduino 마이크로 컨트롤러 보드에 의해 제어되므로 현재 낮이 밝은 분위기에 반영됩니다. 이 튜토리얼에 대한 질문과 팁 또는 수정 사항이 있으면 저에게 연락하십시오! 저는 프로가 아니며 몇 가지를 최적화할 수 있다는 것을 알고 있습니다. 윈도 프로젝트의 사진과 경험을 저에게 보내주세요! 데모 모드 비디오, 3 초 = 1 시간. 동영상은 오전 4시에 시작되며 일출 시간은 7 초입니다.  

 

자료 (독일 상점 링크 포함) :
- 전자 제품 :
o 16 개의 슈퍼 라이트 LED, 5mm : http://www.reichelt.de/LEDs-super-ultrahell/2/index.html?;ACTION=2;LA=3;GROUPID=3019
§ 4 * LED 5-05000 BL
§ 4 * LED 5-14000 GE
§ 4 * LED 5-16000 RT
§ 4 * LED 5-16000 WW
o 16 * 5mm LED 용 몽타주 클립 : http://www.reichelt.de/LED-Zubehoer/MONTAGERING-5MM/3//index.html?ACTION=3&GROUPID=3044&ARTICLE=12529&SHOW=1&START=0&OFFSET=16&
o ULN 2803A (트랜지스터 어레이 ) : http://www.reichelt.de/ICs-U-ZTK-/ULN-2803A/3/index.html?;ACTION=3;LA=446;ARTICLE=22085;GROUPID= 2921; artnr = ULN + 2803A
o 전원 어댑터 :
§ 벽 사마귀 : http://www.reichelt.de/Festspannungsnetzteile/SNT-600-12V/3//index.html?ACTION=3&GROUPID=4946&ARTICLE=108294&SHOW=1&START=0&OFFSET=16&
§ 또는 내장 전원 공급 장치 회로 (벽 사마귀의 내부를 가져 왔습니다…)
o 저항기
o 전선, 브레드 보드
o Arduino Uno 보드
- 플렉시 유리, 3mm : http://www.plexiglas-shop.com/DE/de/details.htm?$product=c4vxotqb32k~p&$category=8ny276huqre
- 가짜 창틀 : http://www.maisonsdumonde.com/UK/en/produits/fiche/seaside-window-picture-122855.htm
- 목재 바, MDF 플레이트, 나사
- 불연성 디퓨저 포일 (또는 Kellogg의 시리얼 가방 내부 가져 가기 : http://www.masterpaklb.com/pictures/products/Products_0.5697308_cereal-bags-header.jpg )
- 알루미늄 랩

 

단계 :

 

1. Arduino 프로그래밍 :

 

기본 프로그램은 기본적으로 세 줄의 코드입니다 (100-103 줄). 설정에서 보정한 후 현재 시간을 제공하는 Arduino 시간 라이브러리 (코드 라인 4 참조)를 포함했습니다 (65 행). 0에서 24 사이의 현재 주간은 변수 uhrzeit (100 행)에 있습니다. 이제 가벼운 분위기는 어디에 저장됩니까? 2차원 const int 배열 ledmat는 여러 주간에 원하는 조명 분위기에 대한 정보를 전달합니다 (13-44 행). 여기에는 -20 (꺼짐)에서 0 (완전 밝기)까지의 dB 단위로 4 개의 LED 색상 레벨을 전달하는 10 개의 벡터, 전체 레벨 및 이러한 레벨이 적용되는 해당 주간이 포함됩니다. 예를 들어 21 행 {-5, -2, -20, -10 , 0,7 }의 세 번째 벡터는 7 : 00h에 -5dB 흰색, -2dB 노란색, 빨간색 없음 및 -10dB 파란색 0dB의 전체 전체 레벨. 이제 ledmat에서 조회할 수 있도록 현재 주간과 배열 인덱스 간의 변환이 필요합니다. 이를 위해 get_stundenindices 루틴 이 호출되어 (102 행) 벡터가 적용된 마지막 주간에 해당하는 배열 인덱스 ( hourindex )와 벡터가 적용된 다음 주간에 해당하는 배열 인덱스 ( hourindex_next )를 알려줍니다. 게다가 이 두 주간 사이에 실제로 변수 fade에 의해 어디에 있는지 알려줍니다. 예를 들어 오전 6시 30 분에 벡터 1 (6.00; 19 행)과 벡터 2 (7:00; 22 행) 사이의 중간에 있으므로 hourindex = 1 및 hourindex _next = 2 with fade= 0.5. 다음 단계는 이미 루틴 writeLED (라인 103)에 쓰는 LED입니다. 이 루틴은 이전에 계산된 인덱스를 사용하여 어레이 ledmat에서 관련 매개 변수를 찾습니다. fade 매개 변수를 사용하면 LED 레벨이 주간에 해당하는 정의된 값 사이에서 선형으로 보간 됩니다. 로가리듬 dB 값과 올바른 0 ~ 255 사이의 번역 INT의 그 값 analogWrite를 예상하는이 루틴에서 이루어집니다 ledpegel. 끝났습니다. 설치 부분에서 프로그램을 시작한 직후에 빠른 동작으로 데모 루프를 실행 (하루 1.5 분)하여 방문자에게 보여줄 수 있다고 말해야 합니다.;) 이 데모 루프의 비디오는 위에 나와 있습니다. 

 

 

2. 회로

 

나는 LED를 운반하는 MDF 스트립 바로 뒤에 맞는 브레드 보드에 작은 회로를 만들었습니다. 스케치를 잃어 버렸습니다. 죄송합니다. 누군가가 이 프로젝트를 수행한다면 여기에 회로를 다시 게시하십시오 J 그러나 회로는 매우 간단합니다. ULN 2803A 트랜지스터 어레이와 16 개의 저항, Arduino 보드의 와이어 연결만 포함되어 있습니다. 16 개의 LED에. Arduino의 각 4 개의 AnalogWrite 출력 보드 (7-10 행에 정의됨)는 ULN 2803A의 두 입력에 연결되었습니다. ULN 2803A의 8 개 출력이 사용되었습니다. 그들 각각은 두 개의 LED와 두 개의 저항에 연결되었습니다. 따라서 각각의 두 LED는 병렬 또는 직렬이었습니다. 5V가 분할되고 LED에 올바른 전압이 있도록 필요한 저항을 계산하십시오. 4 개의 LED 색상은 작동 전압과 전류가 다릅니다! LED 및 ULN 2803A 용 5V와 ULN 2803A 용 접지는 Arduino 보드에서 연결됩니다. 회로를 마친 후 LED 장착 막대에 맞도록 충분히 긴 전선으로 LED를 연결합니다 (아래 참조).

 

3. 나무 프레임

 

- 뒷판 만들기 : 이것은 직접 만들거나 예를 들어 다음에서 구입 한 창틀과 길이와 너비가 정확히 동일한 MDF 플레이트 또는 플레이크 보드입니다. http://www.maisonsdumonde.com/UK/en /produits/fiche/seaside-window-picture-122855.htm - 창틀의 위쪽, 아래쪽, 왼쪽 및 오른쪽 "벽"으로 4 개의 나무 막대를 만듭니다. 크기 : a) 왼쪽 및 오른쪽 벽 막대의 경우 : 길이 = 창틀의 높이, 너비 : 약 5-6cm, 브레드 보드의 최소 너비!, 깊이 : 나사가 들어갈 수 있도록 ca. 15mm. b) 상단 및 하단 벽 바의 경우 : 길이 = 창틀 너비에서 2 * 위와 같이 바 깊이, 너비 및 깊이를 뺀 값. 위쪽 막대에는 Arduino 보드의 USB 및 전원 입력을 위한 두 개의 직사각형 구멍이 있습니다. - 발광 다이오드 장착 바아 (얇은 MDF 판) 작성 : B와 같은 크기)를 상술하지만, 낮은 깊이. o 16 개의 LED 클립을 위한 구멍을 같은 거리에 뚫습니다. o LED 마운팅 바의 한쪽 모서리에서 Arduino 바를 위한 공간을 잘라내면 바로 위에 배치됩니다. o LED 몽타주 클립을 LED 마운팅 바에 넣습니다. o LED를 클립에 넣습니다. 다음과 같은 색상 순서를 사용했습니다. b – r – b – r – y – w – y – w – w – y – w – y – r – b – r – b - 그림에서 볼 수 있듯이 MDF 또는 접착제를 통해 나사를 사용하여 상단 및 하단 바를 MDF 플레이트에 연결하십시오. 왼쪽 및 오른쪽 막대를 위한 공간을 남겨 둡니다. - 브레드 보드를 벽면 상단에 어떻게 든 장착하고 작은 나사 두 개를 사용했습니다. - 마운트 합니다 아두 이노 MDF 판에 작은 나사 보드 - 상단 벽 줄에 4 개의 나사와 연결은 LED 장착 바 - 옵션 : Arduino 전압을 전원 공급 장치 회로의 출력과 연결하고 접지합니다. 전원 공급 장치 회로를 어딘가에 장착하고 메인 케이블을 프레임에서 빼내십시오 (벽 막대 중 하나에 작은 추가 구멍). 당신은 이것을 할 필요가 없습니다. 당신은 단순히 의 전원 입력 소켓에 벽 사마귀를 연결하려는 경우 아두 이노 , 당신이 있는 거 벌금을 (더 나은 화장실에서!) 이제 사진에서 볼 수 있듯이 프레임이 거의 준비되었습니다. 더 이상 사진을 찍지 못해서 죄송합니다. DIY 튜토리얼을 쓸 생각도 없었습니다. 

 

이제 더 나은 조명 성능을 위해 전체 MDF 플레이트 표면에 알루미늄 랩을 붙입니다. 그런 다음 LED 마운팅 바의 느슨한 활에 디퓨저 호일 등을 넣어 LED 조명이 확산되도록 합니다. MDF 플레이트 뒷면에 벽걸이를 설치하는 것을 잊지 마십시오! 이제 전체 MDF / 회로 부품이 준비되었습니다. 이제 우리는 창틀 부분을 생산합니다. 가짜 창틀의 못생긴 사진을 유백색 플렉시 유리로 교체하고 장착하십시오. 플렉시 내가 사용하는 유리 두께 3mm이며, 볼 의 위의 링크를 클릭하십시오. 창틀 (나사 또는 접착제)에 왼쪽 및 오른쪽 벽 막대를 장착하고 선택적으로 전체를 칠합니다. 이제이 부분도 준비되었으며 "결혼"이 발생합니다. 창틀 부품을 MDF / 회로 부품 위에 놓고 장착합니다 (나사!). 준비된. 자, 이제 Arduino를 프로그래밍하고 미세 조정하십시오! 제발 저에게 연락 이 튜토리얼에 대한 질문과 팁 또는 수정 사항이 있습니다! 

 

매끄럽지 못하다. 번역기를 돌려도 속속들이 정확하게 전달하지 못한다.

 

창문 코드를 첨부한다. Arduino Badfenster Code = Arduino 욕실 창 코드

 

 

/*
Badfenster
 steuert 16 LEDs an, abhängig von der Tageszeit
 */
#include <Time.h>  

//Konstanten
const int ledweiss = 3;
const int ledgelb = 5;
const int ledrot = 6;
const int ledblau = 9;
const int del=5000;
const int hourindex_anzahl = 10;
const int ledmat[hourindex_anzahl][6]={
  //weiss,gelb,rot,blau,Gesamtpegel,Zeitpunkt(Stunden)
  {    
    -20,-20,-20,0,0,0} 
  ,   
  {    
    -20,-20,-20,0,0,6 }
  ,   
  {    
    -5,-2,-20,-10,0,7 }
  , 
  {    
    0,-8,-20,-20,0,10 }
  , 
  {    
    0,-20,-20,-20,0,12}
  ,
  {    
    0,-20,-20,-20,0,16}
  ,
  {    
    0,0,-20,-20,0,17}
  ,
  {    
    -10,0,0,-20,0,18}
  ,
  {    
    -20,-20,-10,0,0,20}
  ,
  {    
    -20,-20,-20,0,0,22}
};

//Variablen
float uhrzeit;
float t=0;
float fade;
int hour_aktuell;
int hour_next;
int hourindex;
int hourindex_next;
int ledmatschaltzeiten[hourindex_anzahl+1];

// the setup routine runs once when you press reset:
void setup() {        
  Serial.begin(9600);      // open the serial port at 9600 bps:      
  // initialize the digital pin as an output.
  pinMode(ledweiss, OUTPUT);     
  pinMode(ledgelb, OUTPUT);     
  pinMode(ledrot, OUTPUT);     
  pinMode(ledblau, OUTPUT);     

  setTime(8,45,0,1,1,2013);         //Hier wird die Startzeit gesetzt: setTime(hr,min,sec,day,month,yr);
  for (int i=0;i<hourindex_anzahl;i++){
    ledmatschaltzeiten[i]= ledmat[i][5];
  }
  ledmatschaltzeiten[hourindex_anzahl]=24;

  //Nach Einschalten zunächst eine oder mehrere Demoschleifen:
  for (int durchlauf=0;durchlauf<1;durchlauf++){
    for (float h=0;h<24;h=h+0.025){
      uhrzeit=h;
      get_stundenindices(&uhrzeit,&hour_aktuell,&hour_next,&hourindex,&hourindex_next,&fade);
      writeLEDs(&hourindex,&hourindex_next,&fade);
      //delay(1);
      Serial.print("DEMO-Modus: ");
      Serial.print(uhrzeit);
      Serial.print(", hourindex: ");    
      Serial.print(hourindex);
      Serial.print("--");    
      Serial.print(hourindex_next);
      Serial.print(", fade: ");    
      Serial.print(fade);
      Serial.print(", hour: ");    
      Serial.print(hour_aktuell);
      Serial.print("--");    
      Serial.print(hour_next);
      Serial.println();
    }
  }
}

// the loop routine runs over and over again forever:
void loop() {

  //Zeit
  //  uhrzeit=(float(hour())+float(minute())/60+float(second())/3600)*60*12;//Zeitraffer zum Testen
  uhrzeit=(float(hour())+float(minute())/60+float(second())/3600);

  get_stundenindices(&uhrzeit,&hour_aktuell,&hour_next,&hourindex,&hourindex_next,&fade);
  writeLEDs(&hourindex,&hourindex_next,&fade);

  //Test-Ausgabe
  Serial.print(hour());  
  Serial.print(":");  
  Serial.print(minute());  
  Serial.print(":");  
  Serial.print(second());  
  Serial.print(", uhrzeit: ");  
  Serial.print(uhrzeit);  
  Serial.print(", hourindex: ");  
  Serial.print(hourindex);  
  Serial.print("--");  
  Serial.print(hourindex_next);
  Serial.print(", fade: ");  
  Serial.print(fade);
  Serial.print(", hour: ");  
  Serial.print(hour_aktuell);  
  Serial.print("--");  
  Serial.print(hour_next);
  Serial.println();

  //Warten...
  delay(del);
}

int ledpegel(float pegel1,float pegel2) {
  float abspegel1=pow(10,pegel1/10);
  float abspegel2=pow(10,pegel2/10);
  float abspegel=abspegel1*abspegel2;
  if (abspegel<=0.011)  
  {
    abspegel=0;
  }  
  if (abspegel>1)  
  {
    abspegel=1;
  }  
  int pegel=int(255*abspegel);  

  //    Serial.print(abspegel);
  //    Serial.print("\t");
  //    Serial.print(pegel);
  //    Serial.print("\t");

  return pegel;
}

void get_stundenindices(float *uhrzeit, int *hour_aktuell, int *hour_next, int *hourindex, int *hourindex_next, float *fade) {
  //Stunden-Indices
  for (int i=0;i<hourindex_anzahl;i++) {
    if (*uhrzeit>=ledmatschaltzeiten[i] && *uhrzeit<ledmatschaltzeiten[i+1]) {
      *hour_aktuell=ledmatschaltzeiten[i];
      *hour_next=ledmatschaltzeiten[i+1];
      *hourindex=i;
      *hourindex_next=i+1;
      if (*hourindex_next>=hourindex_anzahl){
        *hourindex_next=0;
      }
    } 
  }
  *fade=(*uhrzeit-*hour_aktuell)/(*hour_next-*hour_aktuell);
}

void writeLEDs(int *hourindex,int *hourindex_next,float *fade)
{
  float pegel[5];
  int pegelweiss=0;
  int pegelgelb=0;
  int pegelrot=0;
  int pegelblau=0;

  //LEDPegel
  pegel[0]=ledmat[*hourindex][0]*(1-*fade)+ledmat[*hourindex_next][0]*(*fade);
  pegel[1]=ledmat[*hourindex][1]*(1-*fade)+ledmat[*hourindex_next][1]*(*fade);
  pegel[2]=ledmat[*hourindex][2]*(1-*fade)+ledmat[*hourindex_next][2]*(*fade);
  pegel[3]=ledmat[*hourindex][3]*(1-*fade)+ledmat[*hourindex_next][3]*(*fade);
  pegel[4]=ledmat[*hourindex][4]*(1-*fade)+ledmat[*hourindex_next][4]*(*fade);
  pegelweiss=ledpegel(pegel[0],pegel[4]);
  pegelgelb=ledpegel(pegel[1],pegel[4]);
  pegelrot=ledpegel(pegel[2],pegel[4]);
  pegelblau=ledpegel(pegel[3],pegel[4]);

  //write LEDs
  analogWrite(ledweiss, pegelweiss);   
  analogWrite(ledgelb, pegelgelb);   
  analogWrite(ledrot, pegelrot);   
  analogWrite(ledblau, pegelblau);

  Serial.print("Pegel: ");
  Serial.print(pegel[0]);  
  Serial.print(",");
  Serial.print(pegel[1]);  
  Serial.print(",");
  Serial.print(pegel[2]);  
  Serial.print(",");
  Serial.print(pegel[3]);  
  Serial.print(",");
  Serial.print(pegel[4]);  
  Serial.print(" - ");

}

 

 

일출 시간의 창문. 메이커 프로젝트 http://window.dasgehtnicht.com/ 

 

 

 

 

반응형