// https://projecthub.arduino.cc/NoraTheDoggo/diy-soldering-iron-control-for-862d-af4052
// miniCore Pinout https://camo.githubusercontent.com/e24a74a43dc7253178498970cc157879f44ceafeddc920667deec9fb0733628a/68747470733a2f2f692e696d6775722e636f6d2f715849456368542e6a7067
#include <Wire.h>
//#define ADAFRUIT_
#ifdef ADAFRUIT_
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(-1);
#endif
#define U8G2_
#ifdef U8G2_
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_SW_I2C display(U8G2_R0, A5, A4, U8X8_PIN_NONE);
#endif
#define TM1650_ 1
#ifdef TM1650_
// https://github.com/arkhipenko/TM1650/blob/master/examples/TM1650_example01/TM1650_example01.ino
#include <TM1650.h>
#endif
#include <U8g2lib.h>
#define PIN_OUT 10
#define PIN_IN A0
//https://alexgyver.ru/tm1637_display/
#define CLK A6
#define DIO A7
#include <GyverTM1637.h>
GyverTM1637 disp(CLK, DIO);
int settemp = 590; //manual set variables
int output = 0;
int temp = 0;
String inputString = "";
boolean rap = false;
boolean stringComplete = false;
int t = 0;
int mappedpower = 0;
byte powermultiply = 0;
long counter = 0;
int temp2 = 0;
byte outputoffset = 0;
byte scaleread = 0;
void setup() {
Serial.begin(9600);
pinMode(PIN_OUT, OUTPUT);
digitalWrite(PIN_OUT, LOW);
#ifdef ADAFRUIT_
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.clearDisplay();
display.display();
#endif
#ifdef U8G2_
Wire.begin();//A4, A5
//display.setBusClock(800000);
display.begin();
display.setBusClock(800000);
display.enableUTF8Print();
display.clearDisplay();
//display.clearBuffer();
display.setFont(u8g2_font_ncenB08_tr);
////display.print("123");
display.drawStr(0,10,"Hello World!");
display.sendBuffer();
#endif
#ifdef DISP7SEG_
disp.clear();
disp.brightness(7); // яркость, 0 - 7 (минимум - максимум)
disp.clear();
disp.displayByte(_H, _E, _L, _L);
#endif
rapid();
}
void loop() {
pid();
/*
#ifdef ADAFRUIT_
display.clearDisplay();
#endif
#ifdef U8G2_
display.clearDisplay();
#endif
updatebar();
updatetext();
#ifdef ADAFRUIT_
display.display();
#endif
#ifdef U8G2_
display.sendBuffer();
#endif*/
}
void rapid() { //Controls the soldering iron by rapidly heating it up in the beginning.
if (rap == false) {
digitalWrite(PIN_OUT, HIGH);
output = 255;
do {
temp = analogRead(0);
Serial.print("rapid ");
Serial.println(temp);
/*
#ifdef ADAFRUIT_
display.clearDisplay();
#endif
updatebar();
updatetext();
#ifdef ADAFRUIT_
display.display();
#endif
*/
} while (temp - settemp > 1);
digitalWrite(PIN_OUT, LOW);
rap = true;
}
}
void pid() { //Controls the soldering with slow active power heating.
temp = analogRead(PIN_IN); //Temp averager
temp2 = temp;
delay(50);
temp = analogRead(PIN_IN);
temp = temp + temp2;
temp = temp / 2;
zeroscale(); //activate no soldering iron checker
temp = temp + outputoffset;
output = temp - settemp;
output = output + powermultiply;
output = output * 4;
if (output < 0) {
output = 0;
}
if (output > 255) {
output = 255;
}
counter = counter + 1;
if (counter > 10) {
counter = 0;
if (temp > settemp + 3) {
powermultiply = powermultiply + 1;
}
if (temp < settemp - 3 && powermultiply > 0) {
powermultiply = powermultiply - 1;
}
}
Serial.print(" pow:");
Serial.print(powermultiply);
Serial.print(", temp:");
Serial.print(temp);
Serial.print(", output:");
Serial.println(output);
analogWrite(PIN_OUT, output);
}
void updatebar() { //Updates Powerbar on OLED display
mappedpower = map(output, 0, 255, 0, 127) - 10;
//display.fillRect(0, 0, mappedpower, 8, WHITE);
//display.fillRoundRect(mappedpower - 5, 0, 20, 8, 3, WHITE);
}
void updatetext() {//Update text on Oled display
/*
#ifdef ADAFRUIT_
display.setCursor(0, 9);
display.setTextColor(WHITE);
display.setTextSize(1);
display.print("Set Temp: ");
display.print(settemp);
display.setCursor(0, 20);
display.print("Temp: ");
display.print(temp);
#endif
#ifdef U8G2_
display.setCursor(0, 9);
display.setTextColor(WHITE);
display.setTextSize(1);
display.print("Set Temp: ");
display.print(settemp);
display.setCursor(0, 20);
display.print("Temp: ");
display.print(temp);
#endif
*/
}
void zeroscale() { //If soldering iron is unplugged, adjust the input pin value to zero it out
if (temp < 200) {
/*
#ifdef ADAFRUIT_
display.clearDisplay();
display.setCursor(0, 20);
display.setTextColor(WHITE);
display.setTextSize(1);
display.print("No soldering iron.");
display.display();
#endif
*/
delay(10000);
/*
#ifdef ADAFRUIT_
display.setCursor(0, 0);
display.print("Testing in 5 seconds.");
display.display();
#endif
*/
delay(5000);
if (temp < 200) {
outputoffset = temp;
}
/*
#ifdef ADAFRUIT_
display.clearDisplay();
display.setCursor(0, 20);
display.setTextColor(WHITE);
display.setTextSize(1);
display.print("Output offset set.");
display.setCursor(0, 0);
display.print("Connect the iron.");
display.display();
#endif
*/
do {
scaleread = analogRead(PIN_IN);
} while (scaleread < 200);
}
}