Stap 2: Schema's en programing...
U kan dit project op verschillende manieren volgens schema's bouwen.
Een breadboard kan worden gebruikt, maar u kunt ook het lijmen van alle onderdelen (planken) achter de ring geleid en haar gezicht in een sandwich graag mode gescheiden door dubbele kant plakband (foto's van dit komt hier binnenkort). Men kan ook bouwen zijn/haar eigen gedrukte bestuur als host voor alle onderdelen.
Ik heb besloten om het gebruik van een USB-ingesloten arduino nano voor het gemak van stroom wordt voorzien, aan de eenheid. Een kleinere en compactere versie kan worden gebouwd met behulp van een USB aan Convertor TTL zoals dit één hieronder van ebay, maar je vinden een alternatieve manier moeten zou voor de stroomvoorziening (5Volts) omdat na de programmering van de arduino, de TTL-converter heeft om te gaan:
- Pro USB2.0 TTL 6Pin CH340G Converter + Mini Module Atmega328 5v 16M F Arduino
Programing bestand bevat aantekeningen voor uw begrip.
Er zijn verschillende bibliotheken voor DS3231 die er zijn, dus ik ben hier het verstrekken van degene die ik gebruik. Opmerking omvat dat u een versie van DHT11 die al wellicht ook R1 (meestal zit op een klein board en is geen rauwe onderdeel). In een dergelijk geval weglaten R1.
Dus u samenbrengen van alle onderdelen zoals en je arduino program met uw computer. Als u besluit om de mini-module gebruiken zonder de USB-poort, kunt u daarna loskoppelt en verwijdert u de TTL-adapter. Daarmee bespaart u ruimte en macht.
Daadwerkelijke code:
<p>#include //I2C communication library<br>#include "ds3231.h" //Real Time Clock library #include //Fast Led library #include //DHT humidity-temperature sensor</p><p>#define LED_PIN 5 //Control pin for LEDs #define COLOR_ORDER GRB //Define color protocol #define CHIPSET WS2811 //Chipset set for WS2811 #define NUM_LEDS 12 //Declare number of leds #define BRIGHTNESS 35 //Declare led brightness</p><p>dht DHT; //Initialize DHT #define DHT11_PIN 2 //Data pin for DHT</p><p>CRGB leds[NUM_LEDS]; //Acknoledge number of leds to system</p><p>byte ora ; //Hour variable byte mindec ; //Ten minutes variable byte minmon ; //Unit minutes variable byte seconds = 0; //Seconds variable int counter1; //Counter variable for data show int idex = 0; //Variable for rainbow index int ihue = 0; //Variable for rainbow hue float temperature; //Temperature variable int humidity; //Humidity variable</p><p>void setup() { FastLED.addLeds(leds, NUM_LEDS); FastLED.setBrightness( BRIGHTNESS ); Serial.begin(9600); //Initialize serial port Wire.begin(); //Initialize I2C communication library DS3231_init(0x00); //Initialize Real Time Clock for 1Hz square wave output pinMode(8, INPUT); //Set pin for time/date mode button to input digitalWrite(8, HIGH); //Turn on pullup resistors pinMode(9, INPUT); //Set pin for time/date set button to input digitalWrite(9, HIGH); //Turn on pullup resistors //Initialize system with a rainbow for(int i=0; i<12; i++) {rainbow();} for(int j=0; j<12; j++) {leds[j]=CRGB::Black;FastLED.delay(100);} }</p><p>void loop(){ if((DS3231_get_addr(0x0E) & 0x20) == 0){DS3231_init(0x20);} //Init temperature sensor temperature = DS3231_get_treg(); //Get temperature from RTC struct ts t; //Structure for retrieving and storing time data from RTC DS3231_get(&t); //Get time to t structure int chk = DHT.read11(DHT11_PIN); //Obtain humidity variable from data line humidity = DHT.humidity; //Get humidity and store to variable mindec=0; //Initialize variable for ten minutes minmon=0; //Initialize variable for unit minutes</p><p> FastLED.clear(); //Clear all display //Displaying actual time if (t.hour>=12){leds[t.hour-12]= CRGB::Blue;ora=t.hour-12;} else { leds[t.hour]= CRGB::Blue; ora=t.hour; } if (t.min<10 && t.min!=0) {leds[t.min]=CRGB::Yellow;minmon=(t.min);} else { mindec=int((t.min/10)*2); minmon=(t.min-((mindec/2)*10)); if (mindec==minmon && minmon!=0){leds[mindec]= CRGB::Orange;} else { leds[mindec] = CRGB::Red ;leds[minmon] = CRGB::Yellow ; //if (minmon==0){leds[minmon] = CRGB::Black;} } } //Correcting overlapping colors/indications if (ora==minmon){leds[ora]=CRGB::Green;} if (ora==mindec){leds[ora]=CRGB::Purple;} if (ora==minmon && ora==mindec){leds[ora]=CRGB::White;} //Toggle seconds to make seconds effect if (seconds==0){ leds[int(t.sec/5)]=CRGB::DimGrey;leds[int(t.sec/5)].nscale8( 64);seconds++; } else { seconds--; } FastLED.show(); delay(800); counter1++; //Increase counter for displaying temp/hum if (counter1>70) { //Time up to display temperature and humidity counter1=0; //Initialize counter for next data show //Display temperature if (temperature<=0){for(int j = NUM_LEDS; j >=0 ; j-- ) {leds[j] = CRGB::White; leds[j].nscale8(64);delay(20);}}//Subzero tempratures appear in white background else {for(int j = NUM_LEDS; j >=0 ; j-- ) {leds[j] = CRGB::Green; leds[j].nscale8(64);delay(20);} } if (temperature<10) {leds[int(temperature)]=CRGB::Yellow;} else {mindec=int((temperature/10)); minmon=(temperature-(mindec*10)); if (mindec==minmon){leds[mindec]= CRGB::Orange;} else {leds[mindec] = CRGB::Red ;leds[minmon] = CRGB::Yellow ; } } FastLED.show(); //Show temperature in green background for 4 secs delay(4000); //Display humidity for(int j = NUM_LEDS; j >=0 ; j-- ) {leds[j] = CRGB::Teal; leds[j].nscale8(48);delay(20);} if (humidity<10) {leds[int(humidity)]=CRGB::Yellow;} else {mindec=int((humidity/10)); minmon=(humidity-(mindec*10)); if (mindec==minmon){leds[mindec]= CRGB::Orange;} else {leds[mindec] = CRGB::Red ;leds[minmon] = CRGB::Yellow ; } } FastLED.show(); //Show humidity in teal background for 4sec delay(4000); //Rainbow effect call for(int i=0; i<12; i++) {rainbow();} for(int j=0; j<12; j++) {leds[j]=CRGB::Black;FastLED.delay(100);} } // Set time using buttons</p><p> if(!digitalRead(8) && digitalRead(9)){ //Increment hour if button held dowm delay(100); //100ms delay to avoid accidental button triggering t.hour = t.hour + 1; //Increment the hour if (t.hour>23){t.hour=0;} Wire.beginTransmission(DS3231_I2C_ADDR); Wire.write(2); Wire.write((t.hour/10*16)+(t.hour%10)); Wire.endTransmission(); } </p><p> if(!digitalRead(9) && digitalRead(8)){ //Increment minutes if button held down delay(100); //100ms delay to avoid accidental button triggering t.min = t.min + 1; //Increment minutes if (t.min>59){t.min=0;} Wire.beginTransmission(DS3231_I2C_ADDR); Wire.write(1); Wire.write((t.min/10*16)+(t.min%10)); Wire.endTransmission(); }</p><p> if(!digitalRead(9) && !digitalRead(8)){ //Reset seconds if both buttons held down delay(100); //100ms delay to avoid accidental button triggering t.sec = 0; //Reset seconds Wire.beginTransmission(DS3231_I2C_ADDR); Wire.write(0); Wire.write((t.sec/10*16)+(t.sec%10)); Wire.endTransmission(); }</p><p>}</p><p>void rainbow() //Rainbow function { idex++; ihue=ihue+22; if(idex>=NUM_LEDS){idex=0;} if(ihue>=255){ihue=0;} leds[idex]=CHSV(ihue,255,255); FastLED.show(); FastLED.delay(100); }</p>