////////////////////////////////////////////////////////// // // // 2in1 Loetstation V2 // // // ////////////////////////////////////////////////////////// /* - Homepage Positionen korrigieren - Eingabe DE korrigieren - Selection Marks Page 2 - DrawIcon -Funktionen - prinMenuItem Value Position - Code ordnen - beim Verlassen der Einstellung Wert speichern */ #include #include #include #include #include /* Panel Pins */ Adafruit_PCD8544 display = Adafruit_PCD8544( 2, 3, 4, 5, 6); // Rotary Encoder int pinA = 7; int pinB = 8; int SW = A1; // Pot Input int cPotPin = A4; // contrast set-pot int hafPotPin = A5; // hot air fan // Buzzer int buzzerPin = 9; /* Tool Pins */ // Outputs int haHePin = 10; // hot air int hafPin = 11; // hot air fan int siHePin = 12; // iron // State Switches Inputs int haRsPin = 13; // hot air handle reed switch int siSsPin = A3; // soldering iron sleep-switch // Thermocouple Inputs int haThPin = A0; // Hot Air Handle int siThPin = A2; // Soldering Iron /* Input Values */ // Rotary Encoder ClickEncoder *encoder; int16_t last, value; boolean up = false; boolean down = false; boolean middle = false; /* Tool Values */ // Switches int haRsState = LOW; int siSsState = LOW; // Thermocouples int haTCVal = 0; int siTCVal = 0; /* Output Values */ int contrast = 65; // EEPROM // Set Temperatures int haSetVal = 0; // EEPROM int siSetVal = 0; // EEPROM int haSetStep = 10; // EEPROM int siSetStep = 10; // EEPROM int haPreSet1 = 100; // EEPROM int haPreSet2 = 200; // EEPROM int haPreSet3 = 300; // EEPROM int siPreSet1 = 180; // EEPROM int siPreSet2 = 240; // EEPROM int siPreSet3 = 300; // EEPROM int haHysMin = 5; // EEPROM int haHysMax = 10; // EEPROM int siHysMin = 5; // EEPROM int siHysMax = 10; // EEPROM // Set Hot Air Fan PWM int hafPWMVal = 0; // Hot Air Cool Down int haCDTemp = 80; // EEPROM // Soldering Iron Standby unsigned long prevMinutes = 0; long siStbyDly = 5; // EEPROM // Buzzer bool haIsEqlSet = false; bool siIsEqlSet = false; // Menu int mode; int menuitem = 1; int frame = 1; int page = 1; //int lastMenuItem = 1; // Menu Items Page 3 Hauptmenue String menuItem1 = "Heissluft"; String menuItem2 = "Loetkolben"; String menuItem3 = "System"; String menuItem4 = "Startseite"; // Menu Items Page 4 & 5 Werkzeug String menuItem11ha = "Aus C:"; // & haCDTemp [if(mode1||2)CD||SB] String menuItem11si = "Aus M:"; String menuItem12 = "+-Wert:"; // setStep String menuItem13 = "Hysterese"; String menuItem14 = "Zurueck"; // Menu Items Page 6 & 7 Hysterese String menuItem131 = "Min:"; // & int haHysMin [if(mode1||2)ha||si] String menuItem132 = "Max:"; // & int siHysMin String menuItem133 = "Zurueck"; // Menu Items Page 8 & 9 System String menuItem31 = "Kontrast"; // & int contrast String menuItem32 = "Zurueck"; /* FUNCTIONS */ void selectMenuItem(boolean selected) { if (selected) { display.setTextColor(WHITE, BLACK); } else { display.setTextColor(BLACK, WHITE); } } void printHeader(String menuItem, int left) { display.setTextSize(1); display.setTextColor(BLACK, WHITE); display.setCursor(left, 0); display.print(menuItem); display.drawFastHLine(0, 9, 83, BLACK); display.display(); } void printMenuItem (String item, int top) { display.setCursor(2, top); display.print(item); } void printIntMenuItem(String menuItem, int value, String unit, int top) { display.setTextSize(1); display.setTextColor(BLACK, WHITE); display.setCursor(2, top); display.print(menuItem); display.setCursor(52, top); if (value < 10) { display.print(" "); } else if (value < 100) { display.print(" "); } display.print(value); display.setCursor(71, top); display.print(unit); display.display(); } void printStringMenuItem(String menuItem, String value, String unit, int top) { display.setTextSize(1); display.setTextColor(BLACK, WHITE); display.setCursor(2, top); display.print(menuItem); display.setCursor(52, top); display.print(value); display.setCursor(71, top); display.print(unit); display.display(); } void drawMenu() { if (page == 1 || page == 2) { // Display display.clearDisplay(); display.setTextSize(1); if (mode == 1) { // Draw Hot-Air-Gun Icon display.fillCircle(13, 6, 4, BLACK); display.fillRect(15, 3, 8, 6, BLACK); display.drawRect(23, 2, 4, 8, BLACK); display.drawRect(27, 4, 4, 4, BLACK); // Draw Fan Icon display.fillTriangle(2, 13, 4, 11, 5, 14, BLACK); display.fillTriangle(5, 14, 6, 11, 8, 13, BLACK); display.fillTriangle(2, 15, 5, 14, 4, 17, BLACK); display.fillTriangle(5, 14, 8, 15, 6, 17, BLACK); // Draw Fan-Speed Bargraph int f; f = analogRead(hafPotPin); int bgWidth = map(f, 0, 1023, 0, 23); display.drawRect(9, 11, 27, 6, BLACK); display.fillRect(11, 13, bgWidth, 9, BLACK); // Display Is-Temperature display.setCursor(37, 2); if (haTCVal < 10) display.print(" "); else if (haTCVal < 100) display.print(" "); display.print(haTCVal); display.print(" C"); display.drawCircle(75, 4, 1, BLACK); // Display Presets display.setTextSize(1); display.setCursor(8, 20); display.print(haPreSet1); display.setCursor(32, 20); display.print(haPreSet2); display.setCursor(58, 20); display.print(haPreSet3); // Display Set-Temperature display.setCursor(24, 2); if (haSetVal < 10) display.print(" "); else if (haSetVal < 100) display.print(" "); display.print(haSetVal); display.print(" C"); display.drawCircle(66, 6, 3, BLACK); display.display(); } else if (mode == 2) { // Draw Soldering Iron Logo display.fillRect(5, 2, 6, 12, BLACK); display.fillRect(4, 14, 8, 2, BLACK); display.drawRect(6, 15, 4, 12, BLACK); display.drawTriangle(6, 26, 9, 26, 8, 31, BLACK); display.display(); } // Draw Settings-Logo display.fillCircle(25, 43, 4, BLACK); display.fillCircle(60, 43, 4, BLACK); display.fillRect(27, 40, 31, 6, BLACK); display.fillRect(21, 41, 5, 4, BLACK); display.fillRect(59, 41, 5, 4, WHITE); // Selection Marks ### if (menuitem == 1) { display.drawRect(0, 0, 83, 19, BLACK); } else if (menuitem == 2) { display.drawRect(0, 19, 32, 10, BLACK); } else if (menuitem == 3) { display.drawRect(33, 19, 32, 10, BLACK); } else if (menuitem == 4) { display.drawRect(66, 19, 32, 10, BLACK); } else if (menuitem == 5) { display.drawRect(40, 29, 37, 19, BLACK); } else if (menuitem == 6) { display.drawRect(0, 39, 83, 9, BLACK); } display.display(); } else if (page == 2) { // Selection Marks if (menuitem == 1) { display.fillTriangle(2, 6, 6, 4, 6, 8, BLACK); display.fillTriangle(32, 4, 36, 6, 32, 8, BLACK); } else if (menuitem == 2) { display.fillTriangle(2, 24, 7, 20, 7, 27, BLACK); display.fillTriangle(26, 20, 31, 24, 26, 27, BLACK); } else if (menuitem == 3) { display.fillTriangle(26, 24, 31, 20, 31, 27, BLACK); display.fillTriangle(51, 20, 56, 24, 51, 27, BLACK); } else if (menuitem == 4) { display.fillTriangle(52, 24, 57, 20, 57, 27, BLACK); display.fillTriangle(77, 20, 82, 24, 77, 27, BLACK); } else if (menuitem == 5) { display.fillTriangle(40, 34, 45, 30, 45, 37, BLACK); display.fillTriangle(77, 30, 82, 34, 77, 37, BLACK); } } else if (page == 3) { // Display display.clearDisplay(); display.setTextSize(1); // Highlight Selected Menu Item switch (menuitem) { case 1: selectMenuItem(true); break; case 2: selectMenuItem(true); break; case 3: selectMenuItem(true); break; case 4: selectMenuItem(true); break; } // Print Header printHeader("Hauptmenue", 12); // Print Menu Items printMenuItem(menuItem1, 11); printMenuItem(menuItem2, 20); printMenuItem(menuItem3, 29); printMenuItem(menuItem4, 38); display.display(); } else if (page == 4 || 5) { // Display display.clearDisplay(); display.setTextSize(1); // Highlight Selected Menu Item switch (menuitem) { case 1: selectMenuItem(true); break; case 2: selectMenuItem(true); break; case 3: selectMenuItem(true); break; case 4: selectMenuItem(true); break; } // Print Header if (mode == 1) { printHeader(menuItem1, 12); } else if (mode == 2) { printHeader(menuItem2, 12); } // Print Menu Items if (mode == 1) { printMenuItem(menuItem11ha, 11); printIntMenuItem(menuItem12, haSetStep, "*C", 20); } if (mode == 2) { printMenuItem(menuItem11si, 11); printIntMenuItem(menuItem12, siSetStep, "*C", 20); } printMenuItem(menuItem13, 29); printMenuItem(menuItem14, 38); display.display(); } else if (page == 6 || page == 7) { // Display display.clearDisplay(); display.setTextSize(1); // Highlight Selected Menu Item switch (menuitem) { case 1: selectMenuItem(true); break; case 2: selectMenuItem(true); break; case 3: selectMenuItem(true); break; } // Print Header printHeader(menuItem13, 12); // Print Menu Items if (mode == 1) { printIntMenuItem(menuItem131, haHysMin, "*C", 11); printIntMenuItem(menuItem132, haHysMax, "*C", 20); printMenuItem(menuItem133, 29); } else if (mode == 2) { printIntMenuItem(menuItem131, siHysMin, "*C", 11); printIntMenuItem(menuItem132, siHysMax, "*C", 20); printMenuItem(menuItem133, 29); } display.display(); } else if (page == 8 || page == 9) { // Display display.clearDisplay(); display.setTextSize(1); // Highlight Selected Menu Item switch (menuitem) { case 1: selectMenuItem(true); break; case 2: selectMenuItem(true); break; } // Print Header printHeader(menuItem3, 16); // Print Menu Items printIntMenuItem(menuItem31, contrast, "%", 11); printMenuItem(menuItem32, 20); display.display(); } } void toolControl() { // Read State Switches haRsState = digitalRead(haRsPin); siSsState = digitalRead(siSsPin); // Read and Map Thermocouples haTCVal = map(analogRead(haThPin), 0, 750, 0, 450); siTCVal = map(analogRead(siThPin), 0, 750, 0, 450); // Prevent Value Flickering if ((haSetVal + haHysMax) > haTCVal && (haSetVal - haHysMin) < haTCVal) { haTCVal = haSetVal; } if ((siSetVal + siHysMax) > siTCVal && (siSetVal - haHysMin) < siTCVal) { siTCVal = siSetVal; } // Hot Air Function if (haRsState == HIGH) { int a; a = haSetVal - haTCVal; a = a > 0 ? a : 0; int hG_out; if (a) hG_out = HIGH; else hG_out = LOW; digitalWrite(haHePin, hG_out); // Hot Air Fan Function int f; f = analogRead(hafPotPin); hafPWMVal = map(f, 0, 1023, 130, 255); analogWrite(hafPin, hafPWMVal); } else { // Cool Down if (haTCVal > haCDTemp) { analogWrite(hafPin, 180); } else { analogWrite(hafPin, 0); } } // Soldering Iron Function if (siSsState == HIGH) { int i; i = siSetVal - siTCVal; i = i > 0 ? i : 0; int sI_out; if (i) sI_out = HIGH; else sI_out = LOW; digitalWrite(siHePin, sI_out); } else { // Standby unsigned long currMinutes = millis() / 60000; if (currMinutes - prevMinutes >= siStbyDly) { prevMinutes = currMinutes; digitalWrite(siHePin, LOW); // EVTL TEMP DOWN } } } void timerIsr() { encoder->service(); } void readRotaryEncoder() { value += encoder->getValue(); if (value / 2 > last) { last = value / 2; down = true; delay(150); } else if (value / 2 < last) { last = value / 2; up = true; delay(150); } } void setContrast() { display.setContrast(contrast); display.display(); } void beep(unsigned char delayms) { analogWrite(buzzerPin, 20); // Any value except of 0 and 255 delay(delayms); // wait for a delayms ms analogWrite(9, 0); // 0 turns it off delay(delayms); // wait for a delayms ms } //############## void buzzer () { if (haTCVal >= haSetVal && haIsEqlSet == false) { beep(50); delay(600); haIsEqlSet = true; } else if (haTCVal < (haSetVal - 10) && haIsEqlSet == true) { haIsEqlSet = false; } if (siTCVal >= siSetVal && siIsEqlSet == false) { beep(50); delay(300); siIsEqlSet = true; } else if (siTCVal < (siSetVal - 10) && siIsEqlSet == true) { siIsEqlSet = false; } } void setup() { // LCD Setup display.begin(); display.setContrast(contrast); display.setTextColor(BLACK); display.setTextWrap(false); display.clearDisplay(); display.display(); // Obviously Encoder encoder = new ClickEncoder(pinA, pinB, SW); encoder->setAccelerationEnabled(false); Timer1.initialize(1000); // ### TEMPORAER AUSGEKL.!!! Timer1.attachInterrupt(timerIsr); last = encoder->getValue(); // Switches pinMode(haRsPin, INPUT_PULLUP); pinMode(siSsPin, INPUT_PULLUP); // Heating Elements pinMode(haHePin, OUTPUT); pinMode(siHePin, OUTPUT); // Welcome Screen // Buzzer pinMode(buzzerPin, OUTPUT); beep(50); beep(50); beep(80); delay(300); } void loop() { drawMenu(); readRotaryEncoder(); ClickEncoder::Button b = encoder->getButton(); if (b != ClickEncoder::Open) { switch (b) { case ClickEncoder::Clicked: middle = true; break; } } if (up) { // Encoder turn left, cCw up = false; if (page == 1) { menuitem --; if (menuitem < 1) { menuitem = 6; } } else if (page == 2) { if (menuitem == 2) { if (mode == 1) { haPreSet1 -= haSetStep; if (haPreSet1 < 80) haPreSet1 = 80; } else if (mode == 2) { siPreSet1 -= siSetStep; if (siPreSet1 < 80) siPreSet1 = 80; } } else if (menuitem == 3) { if (mode == 1) { haPreSet2 -= haSetStep; if (haPreSet2 < 80) haPreSet2 = 80; } else if (mode == 2) { siPreSet2 -= siSetStep; if (siPreSet2 < 80) siPreSet2 = 80; } } else if (menuitem == 4) { if (mode == 1) { haPreSet3 -= haSetStep; if (haPreSet3 < 80) haPreSet1 = 80; } else if (mode == 2) { siPreSet3 -= siSetStep; if (siPreSet3 < 80) siPreSet3 = 80; } } else if (menuitem == 5) { if (mode == 1) { haSetVal -= haSetStep; if (haSetVal < 80) haSetVal = 80; } else if (mode == 2) { siSetVal -= siSetStep; if (haSetVal < 80) haSetVal = 80; } } } else if (page == 3) { menuitem --; if (menuitem < 1) menuitem = 4; } else if (page == 4) { menuitem --; if (menuitem < 1)menuitem = 4; } else if (page == 5) { if (menuitem == 1) { if (mode == 1) { haCDTemp --; if (haCDTemp < 80) haCDTemp = 80; } else if (mode == 2) { siStbyDly --; if (siStbyDly < 0) siStbyDly = 0; } } if (menuitem == 2) { if (mode == 1) { haSetStep --; if (haSetStep < 1) haSetStep = 1; } if (mode == 2) { siSetStep --; if (siSetStep < 1) siSetStep = 1; } } } else if (page == 6) { menuitem --; if (menuitem < 1) menuitem = 3; } else if (page == 7) { if (menuitem == 1) { if (mode == 1) { haHysMin --; if (haHysMin < 0) haHysMin = 0; } else if (mode == 2) { siHysMin --; if (siHysMin < 0) siHysMin = 0; } } else if (menuitem == 2) { if (mode == 1) { haHysMax --; if (haHysMax < 0) haHysMax = 0; } else if (mode == 2) { siHysMax --; if (siHysMax < 0) siHysMax = 0; } } } if (page == 8) { menuitem --; if (menuitem < 1) menuitem = 2; } if (page == 9) { contrast --; if (contrast < 40) contrast = 40; } } if (down) { // Encoder turn left, cCw ### KOMPAKTIEREN ### down = false; if (page == 1) { menuitem ++; if (menuitem > 6) { menuitem = 1; } } else if (page == 2) { if (menuitem == 2) { if (mode == 1) { haPreSet1 += haSetStep; if (haPreSet1 > 450) haPreSet1 = 450; } else if (mode == 2) { siPreSet1 += siSetStep; if (siPreSet1 > 450) siPreSet1 = 450; } } else if (menuitem == 3) { if (mode == 1) { haPreSet2 += haSetStep; if (haPreSet2 > 450) haPreSet2 = 450; } else if (mode == 2) { siPreSet2 += siSetStep; if (siPreSet2 > 450) siPreSet2 = 450; } } else if (menuitem == 4) { if (mode == 1) { haPreSet3 += haSetStep; if (haPreSet3 > 450) haPreSet1 = 450; } else if (mode == 2) { siPreSet3 += siSetStep; if (siPreSet3 > 450) siPreSet3 = 450; } } else if (menuitem == 5) { if (mode == 1) { haSetVal += haSetStep; if (haSetVal > 450) haSetVal = 450; } else if (mode == 2) { siSetVal += siSetStep; if (haSetVal > 450) haSetVal = 450; } } } else if (page == 3) { menuitem ++; if (menuitem > 4) { menuitem = 1; } } else if (page == 4) { menuitem ++; if (menuitem > 4) { menuitem = 1; } } else if (page == 5) { if (menuitem == 1) { if (mode == 1) { haCDTemp ++; if (haCDTemp > 120) { haCDTemp = 120; } } else if (mode == 2) { siStbyDly ++; if (siStbyDly > 30) { siStbyDly = 30; } } } if (menuitem == 2) { if (mode == 1) { haSetStep ++; if (haSetStep > 25) { haSetStep = 25; } } if (mode == 2) { siSetStep ++; if (siSetStep > 25) { siSetStep = 25; } } } } else if (page == 6) { menuitem ++; if (menuitem > 3) { menuitem = 1; } } else if (page == 7) { if (menuitem == 1) { if (mode == 1) { haHysMin ++; if (haHysMin > 20) { haHysMin = 20; } } else if (mode == 2) { siHysMin ++; if (siHysMin > 20) { siHysMin = 20; } } } else if (menuitem == 2) { if (mode == 1) { haHysMax ++; if (haHysMax > 20) { haHysMax = 0; } } else if (mode == 2) { siHysMax ++; if (siHysMax > 20) { siHysMax = 20; } } } } if (page == 8) { menuitem ++; if (menuitem > 1) { menuitem = 1; } } if (page == 9) { contrast ++; if (contrast > 99) { contrast = 99; } } } if (middle) { // Button Was Pressed middle = false; if (page == 1) { if (menuitem == 1) { // Switch modes mode ++; if (mode > 2) { mode = 1; } } else if (menuitem == 2) { // Edit preset 1 page = 2; menuitem = 2; } else if (menuitem == 3) { // ... preset 2 page = 2; menuitem = 3; } else if (menuitem == 4) { // ... preset 3 page = 2; menuitem = 4; } else if (menuitem == 5) { // Switch to set manual page = 2; menuitem = 5; } else if (menuitem == 6) { // Enter setup menu page = 3; menuitem = 1; } } if (page == 2) { if (menuitem == 2) { // Select preset 1 if (mode == 1) { haSetVal = haPreSet1; page = 1; menuitem = 2; } else if (mode == 2) { siSetVal = siPreSet1; page = 1; menuitem = 2; } } else if (menuitem == 3) { // ... preset 2 if (mode == 1) { haSetVal = haPreSet2; page = 1; menuitem = 3; } else if (mode == 2) { siSetVal = siPreSet2; page = 1; menuitem = 3; } } else if (menuitem == 4) { // ... preset 3 if (mode == 1) { haSetVal = haPreSet3; page = 1; menuitem = 4; } else if (mode == 2) { siSetVal = siPreSet3; page = 1; menuitem = 4; } } else if (menuitem == 5) { page = 1; menuitem = 5; } } else if (page == 3) { if (menuitem == 1 || menuitem == 2) { page = 4; menuitem = 1; } if (menuitem == 3) { page = 8; menuitem = 1; } } else if (page == 4) { switch (menuitem) { case 1: page = 5; menuitem = 1; break; case 2: page = 5; menuitem = 2; break; case 3: page = 6; menuitem = 1; break; case 4: page = 3; menuitem = 4; } } else if (page == 5) { if (menuitem == 1) { page = 4; menuitem = 1; } if (menuitem == 2) { page = 4; menuitem = 2; } } else if (page == 6) { if (menuitem == 1) { page = 7; menuitem = 1; } else if (menuitem == 2) { page = 7; menuitem = 2; } } else if (page == 7) { if (menuitem == 1) { page = 6; menuitem = 3; } } else if (page == 8) { if (menuitem == 1) { page = 9; menuitem = 1; } else if (menuitem == 2) { page = 3; menuitem = 4; } } else if (page == 9 && menuitem == 1) { page = 8; } } }