int ledPin = 13; // using Pin 13 which is the internal LED, change this number to drive external load unsigned long startedTime = 0; unsigned long currentTime = 0; unsigned long elapsedTime = 0; unsigned long period = 1000; // milliseconds unsigned long switchTime = 500; float dutyCycle = 0.5; void setup() { Serial.begin(9600); selectLineOne(); Serial.println("start init."); delay(100); backlightOn(); delay(100); clearLCD(); delay(100); pinMode(ledPin, OUTPUT); delay(100); selectLineTwo(); Serial.println("end init."); delay(100); } void loop() { currentTime = millis(); elapsedTime = currentTime - startedTime; period = long(1000.0/readFrequency()); switchTime = long(readDutyCycle() * float(period) + 0.5); if( (0 <= elapsedTime) && (elapsedTime < switchTime) ) { turnLEDOnIfNotAlready(); } else if( (switchTime <= elapsedTime) && (elapsedTime < period) ) { turnLEDOffIfNotAlready(); } else { startedTime = currentTime; } showControlValues(); showTimeDifferencing(); } void showControlValues() { selectLineOne(); Serial.print("F: "); Serial.print(readFrequency()); Serial.print("D: "); Serial.print(readDutyCycle()); Serial.println(""); delay(100); } void showTimeDifferencing() { if(elapsedTime > period) { selectLineTwo(); Serial.print(elapsedTime); Serial.print("="); Serial.print(currentTime); Serial.print("-"); Serial.print(startedTime); } } boolean isLEDOn = false; void turnLEDOnIfNotAlready() { if(!isLEDOn) { digitalWrite(ledPin, HIGH); // turn the LED ON isLEDOn = true; // remember its on, so you don't tell it over and over. } } void turnLEDOffIfNotAlready() { if(isLEDOn) { digitalWrite(ledPin, LOW); // turn the LED ON isLEDOn = false; // remember its on, so you don't tell it over and over. } } float readFrequency() // stub for user control { // return(0.5); return(float(analogRead(0))/31.96875); // return a value between 0.0 and 32.0 Hz } float readDutyCycle() // stub for user control { // return(0.90); return(float(analogRead(2))/1023.0); // return a value between 0.0 and 1.0 from analog pin 2 } void selectLineOne() { //puts the cursor at line 0 char 0. Serial.print(0xFE, BYTE); //command flag Serial.print(128, BYTE); //position } void selectLineTwo() { //puts the cursor at line 0 char 0. Serial.print(0xFE, BYTE); //command flag Serial.print(192, BYTE); //position } void goTo(int position) { //position = line 1: 0-15, line 2: 16-31, 31+ defaults back to 0 if (position<16) { Serial.print(0xFE, BYTE); //command flag Serial.print((position+128), BYTE); //position } else if (position<32) { Serial.print(0xFE, BYTE); //command flag Serial.print((position+48+128), BYTE); //position } else { goTo(0); } } void clearLCD() { Serial.print(0xFE, BYTE); //command flag Serial.print(0x01, BYTE); //clear command. } void backlightOn() { //turns on the backlight Serial.print(0x7C, BYTE); //command flag for backlight stuff Serial.print(157, BYTE); //light level. } void backlightOff() { //turns off the backlight Serial.print(0x7C, BYTE); //command flag for backlight stuff Serial.print(128, BYTE); //light level for off. } void serCommand() { //a general function to call the command flag for issuing all other commands Serial.print(0xFE, BYTE); }