<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: jay jordan</title>
    <description>The latest articles on DEV Community by jay jordan (@jayjo87).</description>
    <link>https://dev.to/jayjo87</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1235358%2F7815549b-66a0-4eab-87af-5e518d0bf25e.png</url>
      <title>DEV Community: jay jordan</title>
      <link>https://dev.to/jayjo87</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jayjo87"/>
    <language>en</language>
    <item>
      <title>how to build portable television with hologram function</title>
      <dc:creator>jay jordan</dc:creator>
      <pubDate>Tue, 02 Jan 2024 13:00:03 +0000</pubDate>
      <link>https://dev.to/jayjo87/how-to-build-portable-television-with-hologram-function-202h</link>
      <guid>https://dev.to/jayjo87/how-to-build-portable-television-with-hologram-function-202h</guid>
      <description>&lt;ol&gt;
&lt;li&gt; 1. High-resolution liquid crystal display (LCD) that displays video content and holograms. 2. A graphics processor (GPU) for processing graphics and creating a holographic effect. 3. Central processing unit (CPU) for data processing, control of TV functions and holography. 4. Memory for storing the operating system, applications and video content. 5. Built-in wireless technology, such as Wi-Fi or Bluetooth, to connect to the Internet and control the TV using a smartphone or tablet.&lt;/li&gt;
&lt;li&gt; 6. Audio system for providing audio accompaniment of videos and holograms. 7. Battery to power the TV in portability mode. 8. Camera and depth sensors for capturing images and creating a real-time holographic effect. 9. Software for controlling the TV, displaying holograms and playing content. 10. Connectors such as HDMI or USB for connecting external devices such as game consoles or flash drives.&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>vape heater</title>
      <dc:creator>jay jordan</dc:creator>
      <pubDate>Mon, 25 Dec 2023 16:11:07 +0000</pubDate>
      <link>https://dev.to/jayjo87/vape-heater-4mpg</link>
      <guid>https://dev.to/jayjo87/vape-heater-4mpg</guid>
      <description>&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include “i2c.h”
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include “i2c_BMP280.h”
&lt;/h1&gt;

&lt;p&gt;BMP280 bmp280;&lt;br&gt;
LiquidCrystal_I2C lcd(0x3f,20,4);&lt;/p&gt;

&lt;p&gt;SimpleDHT22 dht22;&lt;/p&gt;

&lt;p&gt;//Define the pins&lt;br&gt;
const int ButtonPin = 2;&lt;br&gt;
const int pinDHT22 = 3;&lt;br&gt;
const int DownPowerPin = 4;&lt;br&gt;
const int UpPowerPin = 5;&lt;/p&gt;

&lt;p&gt;const int FiringPin = 10;&lt;br&gt;
const int BuzzerPin = 8;&lt;br&gt;
const int PowerBoost = 11;&lt;br&gt;
const int LedPin = 13;&lt;/p&gt;

&lt;p&gt;// Discrete Variable Declarations&lt;br&gt;
int ButtonState = 0;&lt;br&gt;
int PowerBoostState = 0;&lt;br&gt;
int BuzzerShutoffOK = 1;&lt;br&gt;
int PowerLevelRaw = 50;&lt;br&gt;
int PowerLevelScaled = 0;&lt;br&gt;
int PowerSetting = 10;&lt;br&gt;
int UpPowerValue = 1;&lt;br&gt;
int DownPowerValue = 1;&lt;/p&gt;

&lt;p&gt;// BMP280 Vars&lt;br&gt;
float BMPtemperature;&lt;br&gt;
float BMPpascal;&lt;br&gt;
static float BMPmeters, BMPmetersold;&lt;/p&gt;

&lt;p&gt;// Timers&lt;br&gt;
unsigned long ButtonMillisStart = 0;&lt;br&gt;
unsigned long ButtonMillisTimeout = 6000;&lt;/p&gt;

&lt;p&gt;unsigned long FlashMillisStart = 0;&lt;br&gt;
unsigned long FlashMillisTimeout = 100;&lt;/p&gt;

&lt;p&gt;unsigned long SleepMillisStart = 0;&lt;br&gt;
unsigned long SleepMillisTimeout = 300000;&lt;/p&gt;

&lt;p&gt;int ButtonTimeout = 0;&lt;br&gt;
int VapeTime = 0;&lt;br&gt;
int VapeTimeLast = 0;&lt;/p&gt;

&lt;p&gt;// Counters&lt;br&gt;
int MyCounter = 0;&lt;br&gt;
int LightCounter = 0;&lt;/p&gt;

&lt;p&gt;// One Shots&lt;br&gt;
int ButtonRising = 0;&lt;br&gt;
int ButtonFalling = 0;&lt;br&gt;
int UpPowerONS = 0;&lt;br&gt;
int DownPowerONS = 0;&lt;br&gt;
char LastSecond;&lt;/p&gt;

&lt;p&gt;// This is for the Real Time Clock&lt;/p&gt;

&lt;h1&gt;
  
  
  define DS3231_I2C_ADDRESS 0x68
&lt;/h1&gt;

&lt;p&gt;// Convert normal decimal numbers to binary coded decimal&lt;br&gt;
byte decToBcd(byte val){&lt;br&gt;
return( (val/10*16) + (val%10) );&lt;br&gt;
}&lt;br&gt;
// Convert binary coded decimal to normal decimal numbers&lt;br&gt;
byte bcdToDec(byte val){&lt;br&gt;
return( (val/16*10) + (val%16) );&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//—————————————-&lt;br&gt;
void wakeUp()&lt;br&gt;
{&lt;br&gt;
// Just a handler for the pin interrupt.&lt;br&gt;
}&lt;br&gt;
//—————————————-&lt;/p&gt;

&lt;p&gt;void setup() {&lt;br&gt;
Wire.begin();&lt;br&gt;
Serial.begin(9600);&lt;/p&gt;

&lt;p&gt;//Serial.print(“Probe BMP280: “);&lt;br&gt;
if (bmp280.initialize()){ //Serial.println(“BMP Sensor found”);&lt;br&gt;
}&lt;br&gt;
else&lt;br&gt;
{&lt;br&gt;
//Serial.println(“BMP Sensor missing”);&lt;br&gt;
while (1) {}&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// onetime-measure:&lt;br&gt;
bmp280.setEnabled(0);&lt;br&gt;
bmp280.triggerMeasurement();&lt;/p&gt;

&lt;p&gt;//LCD Setup&lt;br&gt;
lcd.init(); //initialize the lcd&lt;/p&gt;

&lt;p&gt;// RTC&lt;br&gt;
// set the initial time here:&lt;br&gt;
// DS3231 seconds, minutes, hours, day, date, month, year&lt;br&gt;
//setDS3231time(30,16,18,7,1,9,2017);&lt;/p&gt;

&lt;p&gt;// Setup Pin Modes&lt;br&gt;
pinMode(DownPowerPin, INPUT_PULLUP);&lt;br&gt;
pinMode(UpPowerPin, INPUT_PULLUP);&lt;br&gt;
pinMode(ButtonPin, INPUT_PULLUP);&lt;br&gt;
pinMode(BuzzerPin, OUTPUT);&lt;br&gt;
pinMode(PowerBoost, INPUT_PULLUP);&lt;br&gt;
pinMode(LedPin, OUTPUT);&lt;br&gt;
lcd.noBacklight();&lt;/p&gt;

&lt;p&gt;//Configure Wireless&lt;br&gt;
lcd.backlight();&lt;br&gt;
lcd.setCursor(0,1);&lt;br&gt;
lcd.print(“Setting Mode”);&lt;br&gt;
Serial.println(“AT+CWMODE=1”);&lt;br&gt;
delay(1000);&lt;/p&gt;

&lt;p&gt;lcd.setCursor(0,1);&lt;br&gt;
lcd.print(“Connecting Network”);&lt;br&gt;
Serial.println(“AT+CWJAP=\”yourSSID\”,\”yourPASSWORD\””);&lt;br&gt;
delay(3000);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;// —————————————&lt;br&gt;
// RTC Logic for Setting clock&lt;br&gt;
// —————————————&lt;br&gt;
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte&lt;br&gt;
dayOfMonth, byte month, byte year){&lt;br&gt;
// sets time and date data to DS3231&lt;br&gt;
Wire.beginTransmission(DS3231_I2C_ADDRESS);&lt;br&gt;
Wire.write(0); // set next input to start at the seconds register&lt;br&gt;
Wire.write(decToBcd(second)); // set seconds&lt;br&gt;
Wire.write(decToBcd(minute)); // set minutes&lt;br&gt;
Wire.write(decToBcd(hour)); // set hours&lt;br&gt;
Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)&lt;br&gt;
Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)&lt;br&gt;
Wire.write(decToBcd(month)); // set month&lt;br&gt;
Wire.write(decToBcd(year)); // set year (0 to 99)&lt;br&gt;
Wire.endTransmission();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void readDS3231time(byte *second,&lt;br&gt;
byte *minute,&lt;br&gt;
byte *hour,&lt;br&gt;
byte *dayOfWeek,&lt;br&gt;
byte *dayOfMonth,&lt;br&gt;
byte *month,&lt;br&gt;
byte *year)&lt;br&gt;
{&lt;br&gt;
Wire.beginTransmission(DS3231_I2C_ADDRESS);&lt;br&gt;
Wire.write(0); // set DS3231 register pointer to 00h&lt;br&gt;
Wire.endTransmission();&lt;br&gt;
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);&lt;br&gt;
// request seven bytes of data from DS3231 starting from register 00h&lt;br&gt;
*second = bcdToDec(Wire.read() &amp;amp; 0x7f);&lt;br&gt;
*minute = bcdToDec(Wire.read());&lt;br&gt;
*hour = bcdToDec(Wire.read() &amp;amp; 0x3f);&lt;br&gt;
*dayOfWeek = bcdToDec(Wire.read());&lt;br&gt;
*dayOfMonth = bcdToDec(Wire.read());&lt;br&gt;
*month = bcdToDec(Wire.read());&lt;br&gt;
*year = bcdToDec(Wire.read());&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// —————————————&lt;br&gt;
// End of RTC Code&lt;br&gt;
// —————————————&lt;/p&gt;

&lt;p&gt;//—————————————-&lt;br&gt;
void loop() {&lt;br&gt;
// read the state of the pushbuttons:&lt;br&gt;
ButtonState = digitalRead(ButtonPin);&lt;br&gt;
PowerBoostState = digitalRead(PowerBoost);&lt;br&gt;
DownPowerValue = digitalRead(DownPowerPin);&lt;br&gt;
UpPowerValue = digitalRead(UpPowerPin);&lt;/p&gt;

&lt;p&gt;// Get the BMP280 Data&lt;br&gt;
bmp280.awaitMeasurement();&lt;br&gt;
bmp280.getTemperature(BMPtemperature);&lt;br&gt;
bmp280.getPressure(BMPpascal);&lt;br&gt;
bmp280.getAltitude(BMPmeters);&lt;br&gt;
BMPmetersold = (BMPmetersold * 10 + BMPmeters)/11;&lt;/p&gt;

&lt;p&gt;bmp280.triggerMeasurement();&lt;/p&gt;

&lt;p&gt;// get the milliseconds for the timers.&lt;br&gt;
unsigned long CurrentMillis = millis();&lt;/p&gt;

&lt;p&gt;//Low Power Setup&lt;br&gt;
//attachInterrupt(0, wakeUp, LOW);&lt;br&gt;
if ((CurrentMillis-SleepMillisStart) &amp;gt; SleepMillisTimeout){&lt;br&gt;
LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// Power Level Control&lt;br&gt;
if (!DownPowerValue){&lt;br&gt;
if (DownPowerONS==0){&lt;br&gt;
PowerLevelRaw=PowerLevelRaw-5;&lt;br&gt;
}&lt;br&gt;
DownPowerONS = 1;&lt;br&gt;
if (PowerLevelRaw &amp;lt; 0){&lt;br&gt;
PowerLevelRaw = 0;&lt;br&gt;
}&lt;br&gt;
}else{&lt;br&gt;
DownPowerONS=0;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;if (!UpPowerValue){&lt;br&gt;
if (UpPowerONS==0){&lt;br&gt;
PowerLevelRaw=PowerLevelRaw+5;&lt;br&gt;
}&lt;br&gt;
UpPowerONS = 1;&lt;br&gt;
if (PowerLevelRaw &amp;gt; 255){&lt;br&gt;
PowerLevelRaw = 255;&lt;br&gt;
}&lt;br&gt;
}else{&lt;br&gt;
UpPowerONS=0;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;PowerLevelScaled = PowerLevelRaw/1;&lt;br&gt;
if (!PowerBoostState){&lt;br&gt;
PowerLevelScaled=PowerLevelScaled*1.3;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// ************************* Button is PRESSED *************************&lt;br&gt;
if (ButtonState == LOW) {&lt;br&gt;
SleepMillisStart=CurrentMillis;&lt;br&gt;
ButtonFalling = 0;&lt;/p&gt;

&lt;p&gt;// turn on the backlight on lcd&lt;/p&gt;

&lt;p&gt;if ((CurrentMillis -FlashMillisStart) &amp;lt; FlashMillisTimeout){&lt;br&gt;
lcd.backlight();&lt;br&gt;
}else if ((CurrentMillis -FlashMillisStart) &amp;lt; (FlashMillisTimeout *2)){&lt;br&gt;
lcd.noBacklight();&lt;br&gt;
} else {&lt;br&gt;
FlashMillisStart = CurrentMillis;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;VapeTime = ((CurrentMillis-ButtonMillisStart) / 1000);&lt;br&gt;
if (VapeTime!=VapeTimeLast){&lt;br&gt;
lcd.clear();&lt;br&gt;
lcd.setCursor(0,0);&lt;br&gt;
lcd.print(“*** Running ***”);&lt;br&gt;
lcd.setCursor(0,1);&lt;br&gt;
if (PowerBoostState==1){&lt;br&gt;
lcd.print (“High Power: “);&lt;br&gt;
}else{&lt;br&gt;
lcd.print (“Low Power: “);&lt;br&gt;
}&lt;br&gt;
lcd.print(VapeTime);&lt;br&gt;
VapeTimeLast=VapeTime;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;if ((CurrentMillis – ButtonMillisStart) &amp;lt; ButtonMillisTimeout){&lt;br&gt;
digitalWrite(LedPin,HIGH);&lt;br&gt;
analogWrite(FiringPin, PowerLevelScaled);&lt;br&gt;
}else{&lt;br&gt;
ButtonTimeout = 1;&lt;br&gt;
digitalWrite(LedPin,LOW);&lt;br&gt;
digitalWrite(BuzzerPin,HIGH);&lt;br&gt;
analogWrite(FiringPin, 0);&lt;/p&gt;

&lt;p&gt;// Clear One Shot&lt;/p&gt;

&lt;p&gt;}&lt;br&gt;
ButtonRising = 1;&lt;br&gt;
}else{&lt;br&gt;
// ************************* Button is RELEASED ************************&lt;br&gt;
ButtonRising = 0;&lt;br&gt;
if (LightCounter &amp;gt; 10000){LightCounter = 0;}&lt;br&gt;
if (ButtonFalling == 0){LightCounter = 0;}&lt;br&gt;
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;&lt;br&gt;
readDS3231time(&amp;amp;second, &amp;amp;minute, &amp;amp;hour, &amp;amp;dayOfWeek, &amp;amp;dayOfMonth, &amp;amp;month,&lt;br&gt;
&amp;amp;year);&lt;br&gt;
if (second!=LastSecond){&lt;br&gt;
LightCounter++;&lt;br&gt;
float temperature = 0;&lt;br&gt;
float humidity = 0;&lt;br&gt;
int err = SimpleDHTErrSuccess;&lt;br&gt;
if ((err = dht22.read2(pinDHT22, &amp;amp;temperature, &amp;amp;humidity, NULL)) != SimpleDHTErrSuccess) {&lt;br&gt;
//Serial.print(“Read DHT22 failed, err=”); Serial.println(err);delay(200);&lt;br&gt;
return;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//lcd.backlight();&lt;br&gt;
if (LightCounter &amp;gt; 300){&lt;br&gt;
lcd.noBacklight();&lt;br&gt;
}else{&lt;br&gt;
lcd.backlight();&lt;br&gt;
}&lt;br&gt;
//lcd.clear();&lt;br&gt;
lcd.setCursor(0,0);&lt;br&gt;
lcd.print(hour);&lt;br&gt;
lcd.print(“:”);&lt;br&gt;
if (minute &amp;lt; 10){lcd.print(“0”);}&lt;br&gt;
lcd.print(minute);&lt;br&gt;
lcd.print(“:”);&lt;br&gt;
if (second &amp;lt; 10){lcd.print(“0″);}&lt;br&gt;
lcd.print(second);&lt;br&gt;
lcd.print (” “);&lt;br&gt;
temperature=temperature*1.8+32;&lt;br&gt;
lcd.print(temperature);&lt;br&gt;
lcd.print((char)223);&lt;br&gt;
lcd.print (“F “);&lt;br&gt;
LastSecond = second;&lt;/p&gt;

&lt;p&gt;lcd.setCursor(0,1);&lt;br&gt;
lcd.print(“Humidity: “);&lt;br&gt;
lcd.print(humidity);&lt;br&gt;
lcd.print(“% “);&lt;/p&gt;

&lt;p&gt;lcd.setCursor(0,2);&lt;br&gt;
lcd.print(“PSR: “);&lt;br&gt;
lcd.print(BMPpascal/3386.38867);&lt;br&gt;
lcd.print(” In Hg “);&lt;/p&gt;

&lt;p&gt;lcd.setCursor(0,3);&lt;br&gt;
lcd.print(“Raw Power: “);&lt;br&gt;
lcd.print(PowerLevelScaled);&lt;br&gt;
lcd.print(” “);&lt;br&gt;
}&lt;br&gt;
ButtonTimeout = 0;&lt;br&gt;
ButtonMillisStart = CurrentMillis;&lt;br&gt;
if (BuzzerShutoffOK == 1) {&lt;br&gt;
digitalWrite(BuzzerPin,LOW);&lt;br&gt;
}&lt;br&gt;
digitalWrite(LedPin,LOW);&lt;br&gt;
analogWrite(FiringPin, 0);&lt;/p&gt;

&lt;p&gt;ButtonFalling = 1;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// Alarm Logic&lt;br&gt;
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;&lt;br&gt;
readDS3231time(&amp;amp;second, &amp;amp;minute, &amp;amp;hour, &amp;amp;dayOfWeek, &amp;amp;dayOfMonth, &amp;amp;month,&lt;br&gt;
&amp;amp;year);&lt;/p&gt;

&lt;p&gt;if ((hour==5) and (minute==0)){&lt;br&gt;
//Serial.println(“Alarm”);&lt;br&gt;
BuzzerShutoffOK=0;&lt;br&gt;
digitalWrite(BuzzerPin,HIGH);&lt;br&gt;
}else{&lt;br&gt;
BuzzerShutoffOK=1;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;if (!UpPowerValue and !DownPowerValue and !PowerBoostState){&lt;br&gt;
analogWrite(FiringPin, 0);&lt;/p&gt;

&lt;p&gt;lcd.clear();&lt;br&gt;
lcd.setCursor(0,0);&lt;br&gt;
lcd.print(“Opening Garage Door”);&lt;br&gt;
lcd.setCursor(0,1);&lt;/p&gt;

&lt;p&gt;lcd.setCursor(0,1);&lt;br&gt;
lcd.print(“Connecting Door… “);&lt;br&gt;
Serial.println(“AT+CIPSTART=\”TCP\”,\”192.168.1.178\”,80″);&lt;br&gt;
delay(2000);&lt;/p&gt;

&lt;p&gt;lcd.setCursor(0,1);&lt;br&gt;
lcd.print(“Setting Length… “);&lt;br&gt;
Serial.println(“AT+CIPSEND=20”);&lt;br&gt;
delay(1000);&lt;/p&gt;

&lt;p&gt;lcd.setCursor(0,1);&lt;br&gt;
lcd.print(“Sending Command… “);&lt;br&gt;
Serial.println(“GET /?DoorCMD=DC”);&lt;br&gt;
Serial.println(“”);&lt;br&gt;
delay(3000);&lt;/p&gt;

&lt;p&gt;lcd.setCursor(0,1);&lt;br&gt;
lcd.print(“Closing Connection “);&lt;br&gt;
Serial.println(“AT+CIPCLOSE”);&lt;br&gt;
delay(1000);&lt;/p&gt;

&lt;p&gt;lcd.clear();&lt;/p&gt;

&lt;p&gt;}&lt;br&gt;
/*&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Created by ArduinoGetStarted.com
*&lt;/li&gt;
&lt;li&gt;This example code is in the public domain
*&lt;/li&gt;
&lt;li&gt;Tutorial page: &lt;a href="https://arduinogetstarted.com/tutorials/arduino-heating-system"&gt;https://arduinogetstarted.com/tutorials/arduino-heating-system&lt;/a&gt;
*/&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define SENSOR_PIN  2   // Arduino pin connected to DS18B20 sensor's DQ pin
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define RELAY_PIN   A5  // Arduino pin connected to relay which connected to heating element
&lt;/h1&gt;

&lt;p&gt;const int TEMP_THRESHOLD_UPPER = 20; // upper threshold of temperature, change to your desire value&lt;br&gt;
const int TEMP_THRESHOLD_LOWER = 15; // lower threshold of temperature, change to your desire value&lt;/p&gt;

&lt;p&gt;OneWire oneWire(SENSOR_PIN);         // setup a oneWire instance&lt;br&gt;
DallasTemperature sensors(&amp;amp;oneWire); // pass oneWire to DallasTemperature library&lt;/p&gt;

&lt;p&gt;float temperature;    // temperature in Celsius&lt;/p&gt;

&lt;p&gt;void setup() {&lt;br&gt;
  Serial.begin(9600); // initialize serial&lt;br&gt;
  sensors.begin();    // initialize the sensor&lt;br&gt;
  pinMode(RELAY_PIN, OUTPUT); // initialize digital pin as an output&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void loop() {&lt;br&gt;
  sensors.requestTemperatures();             // send the command to get temperatures&lt;br&gt;
  temperature = sensors.getTempCByIndex(0);  // read temperature in Celsius&lt;/p&gt;

&lt;p&gt;if(temperature &amp;gt; TEMP_THRESHOLD_UPPER) {&lt;br&gt;
    Serial.println("The heating element is turned off");&lt;br&gt;
    digitalWrite(RELAY_PIN, LOW); // turn off&lt;br&gt;
  } else if(temperature &amp;lt; TEMP_THRESHOLD_LOWER){&lt;br&gt;
    Serial.println("The heating element is turned on");&lt;br&gt;
    digitalWrite(RELAY_PIN, HIGH); // turn on&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;delay(500);&lt;br&gt;
}&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>html</category>
      <category>cloud</category>
      <category>github</category>
    </item>
    <item>
      <title>gaming portable console heater</title>
      <dc:creator>jay jordan</dc:creator>
      <pubDate>Mon, 25 Dec 2023 16:09:48 +0000</pubDate>
      <link>https://dev.to/jayjo87/gaming-portable-console-heater-jeh</link>
      <guid>https://dev.to/jayjo87/gaming-portable-console-heater-jeh</guid>
      <description>&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;p&gt;int uinput;&lt;/p&gt;

&lt;p&gt;extern "C"&lt;br&gt;
JNIEXPORT void JNICALL&lt;br&gt;
Java_com_monobogdan_inputservicebridge_InputNative_init(JNIEnv *env, jclass clazz) {&lt;br&gt;
    uinput = open("/dev/input/event2", O_WRONLY);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;__android_log_print(ANDROID_LOG_DEBUG  , "Test", uinput &amp;gt;= 0 ? "Open event OK" : "Failed to open event");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;void emit(int fd, int type, int code, int val)&lt;br&gt;
{&lt;br&gt;
    struct input_event ie;&lt;br&gt;
    ie.type = type;&lt;br&gt;
    ie.code = code;&lt;br&gt;
    ie.value = val;&lt;br&gt;
    /* timestamp values below are ignored */&lt;br&gt;
    ie.time.tv_sec = 0;&lt;br&gt;
    ie.time.tv_usec = 0;&lt;br&gt;
    write(fd, &amp;amp;ie, sizeof(ie));&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;extern "C"&lt;br&gt;
JNIEXPORT void JNICALL&lt;br&gt;
Java_com_monobogdan_inputservicebridge_InputNative_sendKeyEvent(JNIEnv *env, jclass clazz,&lt;br&gt;
                                                                jint key_code, jboolean pressed) {&lt;br&gt;
    __android_log_print(ANDROID_LOG_DEBUG  , "Test", "Send");&lt;br&gt;
    emit(uinput, EV_KEY, key_code, (bool)pressed  ? 1 : 0);&lt;br&gt;
    emit(uinput, EV_SYN, SYN_REPORT, 0);&lt;br&gt;
}&lt;br&gt;
package com.monobogdan.inputservicebridge;&lt;/p&gt;

&lt;p&gt;public class InputListener extends Service {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private static final int tty = 3;

private InputManager iManager;
private Map&amp;lt;Character, Integer&amp;gt; keyMap;
private Method injectMethod;

private Process runAsRoot(String cmd)
{
    try {
        return Runtime.getRuntime().exec(new String[] { "su", "-c", cmd });
    }
    catch (IOException e)
    {
        e.printStackTrace();

        return null;
    }
}

@Override
public void onCreate() {
    super.onCreate();

    // According to linux key map (input-event-codes.h)
    keyMap = new HashMap&amp;lt;&amp;gt;();
    keyMap.put('U', 103);
    keyMap.put('D', 108);
    keyMap.put('L', 105);
    keyMap.put('R', 106);
    keyMap.put('E', 115);
    keyMap.put('B', 158);
    keyMap.put('A', 232);
    keyMap.put('C', 212);

    InputNative.init();

    try {
        runAsRoot("chmod 777 /dev/input/event2").waitFor();
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }

    Executors.newSingleThreadExecutor().execute(new Runnable() {
        @Override
        public void run() {
            Process proc = runAsRoot("cat /dev/ttyMT" + tty);
            BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));

            while(true)
            {
                try {
                    String line = reader.readLine();

                    if(line != null &amp;amp;&amp;amp; line.length() &amp;gt; 0) {
                        Log.i("Hi", "run: " + line);

                        boolean pressing = line.charAt(0) == 'D';
                        int keyCode = keyMap.get(line.charAt(2));

                        Log.i("TAG", "run: " + keyCode);
                        InputNative.sendKeyEvent(keyCode, pressing);
                    }
                }
                catch(IOException e)
                {
                    e.printStackTrace();
                }

                /*try {
                    Thread.sleep(1000 / 30);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }*/
            }
        }
    });
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}#include &lt;/p&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include "pico/stdlib.h"
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include "pico/time.h"
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include "hardware/uart.h"
&lt;/h1&gt;

&lt;p&gt;struct keyMap&lt;br&gt;
{&lt;br&gt;
    int gpio;&lt;br&gt;
    char key;&lt;br&gt;
    bool pressed;&lt;br&gt;
    int lastTick;&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;keyMap keys[] = {&lt;br&gt;
    {&lt;br&gt;
        15,&lt;br&gt;
        'L',&lt;br&gt;
        false,&lt;br&gt;
        0&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
        14,&lt;br&gt;
        'U',&lt;br&gt;
        false,&lt;br&gt;
        0&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
        13,&lt;br&gt;
        'D',&lt;br&gt;
        false,&lt;br&gt;
        0&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
        12,&lt;br&gt;
        'R',&lt;br&gt;
        false,&lt;br&gt;
        0&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
        11,&lt;br&gt;
        'E',&lt;br&gt;
        false,&lt;br&gt;
        0&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
        10,&lt;br&gt;
        'B',&lt;br&gt;
        false,&lt;br&gt;
        0&lt;br&gt;
    },&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    20,
    'A',
    false,
    0
},
{
    21,
    'C',
    false,
    0
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;};&lt;/p&gt;

&lt;h1&gt;
  
  
  define KEY_NUM 8
&lt;/h1&gt;

&lt;p&gt;int main() {&lt;br&gt;
    stdio_init_all();&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;uart_init(uart0, 921600);
gpio_set_function(PICO_DEFAULT_UART_TX_PIN, GPIO_FUNC_UART);
gpio_set_function(PICO_DEFAULT_UART_RX_PIN, GPIO_FUNC_UART);
sleep_ms(1000); // Allow serial monitor to settle

for(int i = 0; i &amp;lt;  KEY_NUM; i++)
{
    gpio_init(keys[i].gpio);
    gpio_set_dir(keys[i].gpio, false);
    gpio_pull_up(keys[i].gpio);
}

while(true)
{
    int now = time_us_32();

    for(int i = 0; i &amp;lt; KEY_NUM; i++)
    {
        char buf[5];
        buf[1] = ' ';
        buf[3] = '\n';
        buf[4] = 0;

        if(!gpio_get(keys[i].gpio) &amp;amp;&amp;amp; !keys[i].pressed &amp;amp;&amp;amp; now - keys[i].lastTick &amp;gt; 15500)
        {
            buf[0] = 'D';
            buf[2] = keys[i].key;
            puts(buf);

            keys[i].lastTick = now;
            keys[i].pressed = true;
            continue;
        }

        if(gpio_get(keys[i].gpio) &amp;amp;&amp;amp; keys[i].pressed &amp;amp;&amp;amp; now - keys[i].lastTick &amp;gt; 15500)
        {
            buf[0] = 'U';
            buf[2] = keys[i].key;
            puts(buf);

            keys[i].pressed = false;
            keys[i].lastTick = now;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;h1&gt;
  
  
  include "DHT.h"
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include "LiquidCrystal.h"
&lt;/h1&gt;

&lt;p&gt;LiquidCrystal lcd(7, 8, 9, 10, 11 ,12);&lt;/p&gt;

&lt;h1&gt;
  
  
  define DHTPIN 6
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define DHTTYPE DHT22
&lt;/h1&gt;

&lt;p&gt;DHT sensor(DHTPIN, DHTTYPE); &lt;br&gt;
int relay_pin = 9;&lt;/p&gt;

&lt;p&gt;void setup() { &lt;br&gt;
lcd.begin(16,2); &lt;br&gt;
sensor.begin(); &lt;br&gt;
pinMode(relay_pin, OUTPUT);&lt;br&gt;
digitalWrite(relay_pin, HIGH);&lt;br&gt;
}&lt;br&gt;
void loop() { &lt;br&gt;
lcd.clear();&lt;br&gt;
float t = sensor.readTemperature(); //считывание температуры с датчика&lt;br&gt;
// Проверка, посылает ли датчик значения или нет&lt;br&gt;
if (isnan(t)) {&lt;br&gt;
lcd.print("Failed");&lt;br&gt;
delay(1000);&lt;br&gt;
return;&lt;br&gt;
}&lt;br&gt;
lcd.setCursor(0,0); &lt;br&gt;
lcd.print("Temp: ");&lt;br&gt;
lcd.print(t);&lt;br&gt;
lcd.print(" C");&lt;br&gt;
if (t &amp;gt; 35){&lt;br&gt;
  digitalWrite(relay_pin, LOW);&lt;br&gt;
  lcd.setCursor(0,1); &lt;br&gt;
  lcd.print("Fan is ON "); &lt;br&gt;
  delay(10);&lt;br&gt;
}&lt;br&gt;
else{&lt;br&gt;
  digitalWrite(relay_pin, HIGH);&lt;br&gt;
  lcd.setCursor(0,1); &lt;br&gt;
  lcd.print("Fan is OFF "); &lt;br&gt;
}&lt;br&gt;
delay(2000);&lt;br&gt;
}&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>typescript</category>
      <category>github</category>
    </item>
    <item>
      <title>portable television 3d printer</title>
      <dc:creator>jay jordan</dc:creator>
      <pubDate>Mon, 25 Dec 2023 16:08:27 +0000</pubDate>
      <link>https://dev.to/jayjo87/portable-television-3d-printer-4k49</link>
      <guid>https://dev.to/jayjo87/portable-television-3d-printer-4k49</guid>
      <description>&lt;h1&gt;
  
  
  define X_STEP_PIN      54
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_DIR_PIN       55
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_ENABLE_PIN       38
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_MIN_PIN           3
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_MAX_PIN           2
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_STEP_PIN         60
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_DIR_PIN          61
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_ENABLE_PIN       56
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_MIN_PIN          14
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_MAX_PIN          15
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_STEP_PIN         46
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_DIR_PIN          48
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_ENABLE_PIN       62
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_MIN_PIN          18
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_MAX_PIN          19
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_STEP_PIN         26
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_DIR_PIN          28
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_ENABLE_PIN       24
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_STEP_PIN     36
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_DIR_PIN          34
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_ENABLE_PIN       30
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define SDPOWER            -1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define SDSS               53
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define LED_PIN            13
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define FAN_PIN         9
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define PS_ON_PIN          12
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define KILL_PIN           -1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define HEATER_0_PIN       10
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define HEATER_1_PIN    8
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TEMP_0_PIN          13   // ANALOG NUMBERING
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TEMP_1_PIN          14   // ANALOG NUMBERING
&lt;/h1&gt;

&lt;p&gt;void setup() {&lt;/p&gt;

&lt;p&gt;pinMode(FAN_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(HEATER_0_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(HEATER_1_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(LED_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_DIR_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_ENABLE_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_DIR_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_ENABLE_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_DIR_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_ENABLE_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_DIR_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_ENABLE_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_DIR_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_ENABLE_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;digitalWrite(X_ENABLE_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_ENABLE_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_ENABLE_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_ENABLE_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_ENABLE_PIN , LOW);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;void loop () {&lt;/p&gt;

&lt;p&gt;if (millis() %1000 &amp;lt;500)&lt;/p&gt;

&lt;p&gt;digitalWrite(LED_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;else&lt;/p&gt;

&lt;p&gt;digitalWrite(LED_PIN, LOW);&lt;/p&gt;

&lt;p&gt;if (millis() %1000 &amp;lt;300) {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, LOW);&lt;/p&gt;

&lt;p&gt;} else if (millis() %1000 &amp;lt;600) {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, LOW);&lt;/p&gt;

&lt;p&gt;} else  {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;if (millis() %10000 &amp;lt;5000) {&lt;/p&gt;

&lt;p&gt;digitalWrite(X_DIR_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_DIR_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_DIR_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_DIR_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_DIR_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;else {&lt;/p&gt;

&lt;p&gt;digitalWrite(X_DIR_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_DIR_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_DIR_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_DIR_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_DIR_PIN , LOW);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;digitalWrite(X_STEP_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_STEP_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_STEP_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_STEP_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_STEP_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;delay(1);&lt;/p&gt;

&lt;p&gt;digitalWrite(X_STEP_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_STEP_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_STEP_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_STEP_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_STEP_PIN , LOW);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;This code should activate all the steppers, fans, and heaters. The only problem with this code is that it does not activate both z-axis steppers; it only activates one. If you encounter any problems with any of the components, try isolating them and only running them in the code. If you would like to test the z-axis and thermistor, download the following codes:&lt;/p&gt;



&lt;h1&gt;
  
  
  ifndef THERMISTORTABLES_H_
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define THERMISTORTABLES_H_
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define OVERSAMPLENR 16
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 1) || (THERMISTORHEATER_1 == 1)  || (THERMISTORHEATER_2 == 1) || (THERMISTORBED == 1) //100k bed thermistor
&lt;/h1&gt;

&lt;p&gt;const short temptable_1[][2] PROGMEM = {&lt;br&gt;
{       23*OVERSAMPLENR ,       300     },&lt;br&gt;
{       25*OVERSAMPLENR ,       295     },&lt;br&gt;
{       27*OVERSAMPLENR ,       290     },&lt;br&gt;
{       28*OVERSAMPLENR ,       285     },&lt;br&gt;
{       31*OVERSAMPLENR ,       280     },&lt;br&gt;
{       33*OVERSAMPLENR ,       275     },&lt;br&gt;
{       35*OVERSAMPLENR ,       270     },&lt;br&gt;
{       38*OVERSAMPLENR ,       265     },&lt;br&gt;
{       41*OVERSAMPLENR ,       260     },&lt;br&gt;
{       44*OVERSAMPLENR ,       255     },&lt;br&gt;
{       48*OVERSAMPLENR ,       250     },&lt;br&gt;
{       52*OVERSAMPLENR ,       245     },&lt;br&gt;
{       56*OVERSAMPLENR ,       240     },&lt;br&gt;
{       61*OVERSAMPLENR ,       235     },&lt;br&gt;
{       66*OVERSAMPLENR ,       230     },&lt;br&gt;
{       71*OVERSAMPLENR ,       225     },&lt;br&gt;
{       78*OVERSAMPLENR ,       220     },&lt;br&gt;
{       84*OVERSAMPLENR ,       215     },&lt;br&gt;
{       92*OVERSAMPLENR ,       210     },&lt;br&gt;
{       100*OVERSAMPLENR        ,       205     },&lt;br&gt;
{       109*OVERSAMPLENR        ,       200     },&lt;br&gt;
{       120*OVERSAMPLENR        ,       195     },&lt;br&gt;
{       131*OVERSAMPLENR        ,       190     },&lt;br&gt;
{       143*OVERSAMPLENR        ,       185     },&lt;br&gt;
{       156*OVERSAMPLENR        ,       180     },&lt;br&gt;
{       171*OVERSAMPLENR        ,       175     },&lt;br&gt;
{       187*OVERSAMPLENR        ,       170     },&lt;br&gt;
{       205*OVERSAMPLENR        ,       165     },&lt;br&gt;
{       224*OVERSAMPLENR        ,       160     },&lt;br&gt;
{       245*OVERSAMPLENR        ,       155     },&lt;br&gt;
{       268*OVERSAMPLENR        ,       150     },&lt;br&gt;
{       293*OVERSAMPLENR        ,       145     },&lt;br&gt;
{       320*OVERSAMPLENR        ,       140     },&lt;br&gt;
{       348*OVERSAMPLENR        ,       135     },&lt;br&gt;
{       379*OVERSAMPLENR        ,       130     },&lt;br&gt;
{       411*OVERSAMPLENR        ,       125     },&lt;br&gt;
{       445*OVERSAMPLENR        ,       120     },&lt;br&gt;
{       480*OVERSAMPLENR        ,       115     },&lt;br&gt;
{       516*OVERSAMPLENR        ,       110     },&lt;br&gt;
{       553*OVERSAMPLENR        ,       105     },&lt;br&gt;
{       591*OVERSAMPLENR        ,       100     },&lt;br&gt;
{       628*OVERSAMPLENR        ,       95      },&lt;br&gt;
{       665*OVERSAMPLENR        ,       90      },&lt;br&gt;
{       702*OVERSAMPLENR        ,       85      },&lt;br&gt;
{       737*OVERSAMPLENR        ,       80      },&lt;br&gt;
{       770*OVERSAMPLENR        ,       75      },&lt;br&gt;
{       801*OVERSAMPLENR        ,       70      },&lt;br&gt;
{       830*OVERSAMPLENR        ,       65      },&lt;br&gt;
{       857*OVERSAMPLENR        ,       60      },&lt;br&gt;
{       881*OVERSAMPLENR        ,       55      },&lt;br&gt;
{       903*OVERSAMPLENR        ,       50      },&lt;br&gt;
{       922*OVERSAMPLENR        ,       45      },&lt;br&gt;
{       939*OVERSAMPLENR        ,       40      },&lt;br&gt;
{       954*OVERSAMPLENR        ,       35      },&lt;br&gt;
{       966*OVERSAMPLENR        ,       30      },&lt;br&gt;
{       977*OVERSAMPLENR        ,       25      },&lt;br&gt;
{       985*OVERSAMPLENR        ,       20      },&lt;br&gt;
{       993*OVERSAMPLENR        ,       15      },&lt;br&gt;
{       999*OVERSAMPLENR        ,       10      },&lt;br&gt;
{       1004*OVERSAMPLENR       ,       5       },&lt;br&gt;
{       1008*OVERSAMPLENR       ,       0       } //safety&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 2) || (THERMISTORHEATER_1 == 2) || (THERMISTORHEATER_2 == 2) || (THERMISTORBED == 2) //200k bed thermistor
&lt;/h1&gt;

&lt;p&gt;const short temptable_2[][2] PROGMEM = {&lt;br&gt;
  {1*OVERSAMPLENR, 848},&lt;br&gt;
  {54*OVERSAMPLENR, 275},&lt;br&gt;
  {107*OVERSAMPLENR, 228},&lt;br&gt;
  {160*OVERSAMPLENR, 202},&lt;br&gt;
  {213*OVERSAMPLENR, 185},&lt;br&gt;
  {266*OVERSAMPLENR, 171},&lt;br&gt;
  {319*OVERSAMPLENR, 160},&lt;br&gt;
  {372*OVERSAMPLENR, 150},&lt;br&gt;
  {425*OVERSAMPLENR, 141},&lt;br&gt;
  {478*OVERSAMPLENR, 133},&lt;br&gt;
  {531*OVERSAMPLENR, 125},&lt;br&gt;
  {584*OVERSAMPLENR, 118},&lt;br&gt;
  {637*OVERSAMPLENR, 110},&lt;br&gt;
  {690*OVERSAMPLENR, 103},&lt;br&gt;
  {743*OVERSAMPLENR, 95},&lt;br&gt;
  {796*OVERSAMPLENR, 86},&lt;br&gt;
  {849*OVERSAMPLENR, 77},&lt;br&gt;
  {902*OVERSAMPLENR, 65},&lt;br&gt;
  {955*OVERSAMPLENR, 49},&lt;br&gt;
  {1008*OVERSAMPLENR, 17},&lt;br&gt;
  {1020*OVERSAMPLENR, 0} //safety&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 3) || (THERMISTORHEATER_1 == 3) || (THERMISTORHEATER_2 == 3) || (THERMISTORBED == 3) //mendel-parts
&lt;/h1&gt;

&lt;p&gt;const short temptable_3[][2] PROGMEM = {&lt;br&gt;
               {1*OVERSAMPLENR,864},&lt;br&gt;
               {21*OVERSAMPLENR,300},&lt;br&gt;
               {25*OVERSAMPLENR,290},&lt;br&gt;
               {29*OVERSAMPLENR,280},&lt;br&gt;
               {33*OVERSAMPLENR,270},&lt;br&gt;
               {39*OVERSAMPLENR,260},&lt;br&gt;
               {46*OVERSAMPLENR,250},&lt;br&gt;
               {54*OVERSAMPLENR,240},&lt;br&gt;
               {64*OVERSAMPLENR,230},&lt;br&gt;
               {75*OVERSAMPLENR,220},&lt;br&gt;
               {90*OVERSAMPLENR,210},&lt;br&gt;
               {107*OVERSAMPLENR,200},&lt;br&gt;
               {128*OVERSAMPLENR,190},&lt;br&gt;
               {154*OVERSAMPLENR,180},&lt;br&gt;
               {184*OVERSAMPLENR,170},&lt;br&gt;
               {221*OVERSAMPLENR,160},&lt;br&gt;
               {265*OVERSAMPLENR,150},&lt;br&gt;
               {316*OVERSAMPLENR,140},&lt;br&gt;
               {375*OVERSAMPLENR,130},&lt;br&gt;
               {441*OVERSAMPLENR,120},&lt;br&gt;
               {513*OVERSAMPLENR,110},&lt;br&gt;
               {588*OVERSAMPLENR,100},&lt;br&gt;
               {734*OVERSAMPLENR,80},&lt;br&gt;
               {856*OVERSAMPLENR,60},&lt;br&gt;
               {938*OVERSAMPLENR,40},&lt;br&gt;
               {986*OVERSAMPLENR,20},&lt;br&gt;
               {1008*OVERSAMPLENR,0},&lt;br&gt;
               {1018*OVERSAMPLENR,-20}&lt;br&gt;
       };&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 4) || (THERMISTORHEATER_1 == 4) || (THERMISTORHEATER_2 == 4) || (THERMISTORBED == 4) //10k thermistor
&lt;/h1&gt;

&lt;p&gt;const short temptable_4[][2] PROGMEM = {&lt;br&gt;
  {1*OVERSAMPLENR, 430},&lt;br&gt;
  {54*OVERSAMPLENR, 137},&lt;br&gt;
  {107*OVERSAMPLENR, 107},&lt;br&gt;
  {160*OVERSAMPLENR, 91},&lt;br&gt;
  {213*OVERSAMPLENR, 80},&lt;br&gt;
  {266*OVERSAMPLENR, 71},&lt;br&gt;
  {319*OVERSAMPLENR, 64},&lt;br&gt;
  {372*OVERSAMPLENR, 57},&lt;br&gt;
  {425*OVERSAMPLENR, 51},&lt;br&gt;
  {478*OVERSAMPLENR, 46},&lt;br&gt;
  {531*OVERSAMPLENR, 41},&lt;br&gt;
  {584*OVERSAMPLENR, 35},&lt;br&gt;
  {637*OVERSAMPLENR, 30},&lt;br&gt;
  {690*OVERSAMPLENR, 25},&lt;br&gt;
  {743*OVERSAMPLENR, 20},&lt;br&gt;
  {796*OVERSAMPLENR, 14},&lt;br&gt;
  {849*OVERSAMPLENR, 7},&lt;br&gt;
  {902*OVERSAMPLENR, 0},&lt;br&gt;
  {955*OVERSAMPLENR, -11},&lt;br&gt;
  {1008*OVERSAMPLENR, -35}&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 5) || (THERMISTORHEATER_1 == 5) || (THERMISTORHEATER_2 == 5) || (THERMISTORBED == 5) //100k ParCan thermistor (104GT-2)
&lt;/h1&gt;

&lt;p&gt;const short temptable_5[][2] PROGMEM = {&lt;br&gt;
{1*OVERSAMPLENR, 713},&lt;br&gt;
{18*OVERSAMPLENR, 316},&lt;br&gt;
{35*OVERSAMPLENR, 266},&lt;br&gt;
{52*OVERSAMPLENR, 239},&lt;br&gt;
{69*OVERSAMPLENR, 221},&lt;br&gt;
{86*OVERSAMPLENR, 208},&lt;br&gt;
{103*OVERSAMPLENR, 197},&lt;br&gt;
{120*OVERSAMPLENR, 188},&lt;br&gt;
{137*OVERSAMPLENR, 181},&lt;br&gt;
{154*OVERSAMPLENR, 174},&lt;br&gt;
{171*OVERSAMPLENR, 169},&lt;br&gt;
{188*OVERSAMPLENR, 163},&lt;br&gt;
{205*OVERSAMPLENR, 159},&lt;br&gt;
{222*OVERSAMPLENR, 154},&lt;br&gt;
{239*OVERSAMPLENR, 150},&lt;br&gt;
{256*OVERSAMPLENR, 147},&lt;br&gt;
{273*OVERSAMPLENR, 143},&lt;br&gt;
{290*OVERSAMPLENR, 140},&lt;br&gt;
{307*OVERSAMPLENR, 136},&lt;br&gt;
{324*OVERSAMPLENR, 133},&lt;br&gt;
{341*OVERSAMPLENR, 130},&lt;br&gt;
{358*OVERSAMPLENR, 128},&lt;br&gt;
{375*OVERSAMPLENR, 125},&lt;br&gt;
{392*OVERSAMPLENR, 122},&lt;br&gt;
{409*OVERSAMPLENR, 120},&lt;br&gt;
{426*OVERSAMPLENR, 117},&lt;br&gt;
{443*OVERSAMPLENR, 115},&lt;br&gt;
{460*OVERSAMPLENR, 112},&lt;br&gt;
{477*OVERSAMPLENR, 110},&lt;br&gt;
{494*OVERSAMPLENR, 108},&lt;br&gt;
{511*OVERSAMPLENR, 106},&lt;br&gt;
{528*OVERSAMPLENR, 103},&lt;br&gt;
{545*OVERSAMPLENR, 101},&lt;br&gt;
{562*OVERSAMPLENR, 99},&lt;br&gt;
{579*OVERSAMPLENR, 97},&lt;br&gt;
{596*OVERSAMPLENR, 95},&lt;br&gt;
{613*OVERSAMPLENR, 92},&lt;br&gt;
{630*OVERSAMPLENR, 90},&lt;br&gt;
{647*OVERSAMPLENR, 88},&lt;br&gt;
{664*OVERSAMPLENR, 86},&lt;br&gt;
{681*OVERSAMPLENR, 84},&lt;br&gt;
{698*OVERSAMPLENR, 81},&lt;br&gt;
{715*OVERSAMPLENR, 79},&lt;br&gt;
{732*OVERSAMPLENR, 77},&lt;br&gt;
{749*OVERSAMPLENR, 75},&lt;br&gt;
{766*OVERSAMPLENR, 72},&lt;br&gt;
{783*OVERSAMPLENR, 70},&lt;br&gt;
{800*OVERSAMPLENR, 67},&lt;br&gt;
{817*OVERSAMPLENR, 64},&lt;br&gt;
{834*OVERSAMPLENR, 61},&lt;br&gt;
{851*OVERSAMPLENR, 58},&lt;br&gt;
{868*OVERSAMPLENR, 55},&lt;br&gt;
{885*OVERSAMPLENR, 52},&lt;br&gt;
{902*OVERSAMPLENR, 48},&lt;br&gt;
{919*OVERSAMPLENR, 44},&lt;br&gt;
{936*OVERSAMPLENR, 40},&lt;br&gt;
{953*OVERSAMPLENR, 34},&lt;br&gt;
{970*OVERSAMPLENR, 28},&lt;br&gt;
{987*OVERSAMPLENR, 20},&lt;br&gt;
{1004*OVERSAMPLENR, 8},&lt;br&gt;
{1021*OVERSAMPLENR, 0}&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 6) || (THERMISTORHEATER_1 == 6) || (THERMISTORHEATER_2 == 6) || (THERMISTORBED == 6) // 100k Epcos thermistor
&lt;/h1&gt;

&lt;p&gt;const short temptable_6[][2] PROGMEM = {&lt;br&gt;
  {28*OVERSAMPLENR, 250},&lt;br&gt;
  {31*OVERSAMPLENR, 245},&lt;br&gt;
  {35*OVERSAMPLENR, 240},&lt;br&gt;
  {39*OVERSAMPLENR, 235},&lt;br&gt;
  {42*OVERSAMPLENR, 230},&lt;br&gt;
  {44*OVERSAMPLENR, 225},&lt;br&gt;
  {49*OVERSAMPLENR, 220},&lt;br&gt;
  {53*OVERSAMPLENR, 215},&lt;br&gt;
  {62*OVERSAMPLENR, 210},&lt;br&gt;
  {73*OVERSAMPLENR, 205},&lt;br&gt;
  {72*OVERSAMPLENR, 200},&lt;br&gt;
  {94*OVERSAMPLENR, 190},&lt;br&gt;
  {102*OVERSAMPLENR, 185},&lt;br&gt;
  {116*OVERSAMPLENR, 170},&lt;br&gt;
  {143*OVERSAMPLENR, 160},&lt;br&gt;
  {183*OVERSAMPLENR, 150},&lt;br&gt;
  {223*OVERSAMPLENR, 140},&lt;br&gt;
  {270*OVERSAMPLENR, 130},&lt;br&gt;
  {318*OVERSAMPLENR, 120},&lt;br&gt;
  {383*OVERSAMPLENR, 110},&lt;br&gt;
  {413*OVERSAMPLENR, 105},&lt;br&gt;
  {439*OVERSAMPLENR, 100},&lt;br&gt;
  {484*OVERSAMPLENR, 95},&lt;br&gt;
  {513*OVERSAMPLENR, 90},&lt;br&gt;
  {607*OVERSAMPLENR, 80},&lt;br&gt;
  {664*OVERSAMPLENR, 70},&lt;br&gt;
  {781*OVERSAMPLENR, 60},&lt;br&gt;
  {810*OVERSAMPLENR, 55},&lt;br&gt;
  {849*OVERSAMPLENR, 50},&lt;br&gt;
  {914*OVERSAMPLENR, 45},&lt;br&gt;
  {914*OVERSAMPLENR, 40},&lt;br&gt;
  {935*OVERSAMPLENR, 35},&lt;br&gt;
  {954*OVERSAMPLENR, 30},&lt;br&gt;
  {970*OVERSAMPLENR, 25},&lt;br&gt;
  {978*OVERSAMPLENR, 22},&lt;br&gt;
  {1008*OVERSAMPLENR, 3}&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 7) || (THERMISTORHEATER_1 == 7) || (THERMISTORHEATER_2 == 7) || (THERMISTORBED == 7) // 100k Honeywell 135-104LAG-J01
&lt;/h1&gt;

&lt;p&gt;const short temptable_7[][2] PROGMEM = {&lt;br&gt;
  {46*OVERSAMPLENR, 270},&lt;br&gt;
  {50*OVERSAMPLENR, 265},&lt;br&gt;
  {54*OVERSAMPLENR, 260},&lt;br&gt;
  {58*OVERSAMPLENR, 255},&lt;br&gt;
  {62*OVERSAMPLENR, 250},&lt;br&gt;
  {67*OVERSAMPLENR, 245},&lt;br&gt;
  {72*OVERSAMPLENR, 240},&lt;br&gt;
  {79*OVERSAMPLENR, 235},&lt;br&gt;
  {85*OVERSAMPLENR, 230},&lt;br&gt;
  {91*OVERSAMPLENR, 225},&lt;br&gt;
  {99*OVERSAMPLENR, 220},&lt;br&gt;
  {107*OVERSAMPLENR, 215},&lt;br&gt;
  {116*OVERSAMPLENR, 210},&lt;br&gt;
  {126*OVERSAMPLENR, 205},&lt;br&gt;
  {136*OVERSAMPLENR, 200},&lt;br&gt;
  {149*OVERSAMPLENR, 195},&lt;br&gt;
  {160*OVERSAMPLENR, 190},&lt;br&gt;
  {175*OVERSAMPLENR, 185},&lt;br&gt;
  {191*OVERSAMPLENR, 180},&lt;br&gt;
  {209*OVERSAMPLENR, 175},&lt;br&gt;
  {224*OVERSAMPLENR, 170},&lt;br&gt;
  {246*OVERSAMPLENR, 165},&lt;br&gt;
  {267*OVERSAMPLENR, 160},&lt;br&gt;
  {293*OVERSAMPLENR, 155},&lt;br&gt;
  {316*OVERSAMPLENR, 150},&lt;br&gt;
  {340*OVERSAMPLENR, 145},&lt;br&gt;
  {364*OVERSAMPLENR, 140},&lt;br&gt;
  {396*OVERSAMPLENR, 135},&lt;br&gt;
  {425*OVERSAMPLENR, 130},&lt;br&gt;
  {460*OVERSAMPLENR, 125},&lt;br&gt;
  {489*OVERSAMPLENR, 120},&lt;br&gt;
  {526*OVERSAMPLENR, 115},&lt;br&gt;
  {558*OVERSAMPLENR, 110},&lt;br&gt;
  {591*OVERSAMPLENR, 105},&lt;br&gt;
  {628*OVERSAMPLENR, 100},&lt;br&gt;
  {660*OVERSAMPLENR, 95},&lt;br&gt;
  {696*OVERSAMPLENR, 90},&lt;br&gt;
  {733*OVERSAMPLENR, 85},&lt;br&gt;
  {761*OVERSAMPLENR, 80},&lt;br&gt;
  {794*OVERSAMPLENR, 75},&lt;br&gt;
  {819*OVERSAMPLENR, 70},&lt;br&gt;
  {847*OVERSAMPLENR, 65},&lt;br&gt;
  {870*OVERSAMPLENR, 60},&lt;br&gt;
  {892*OVERSAMPLENR, 55},&lt;br&gt;
  {911*OVERSAMPLENR, 50},&lt;br&gt;
  {929*OVERSAMPLENR, 45},&lt;br&gt;
  {944*OVERSAMPLENR, 40},&lt;br&gt;
  {959*OVERSAMPLENR, 35},&lt;br&gt;
  {971*OVERSAMPLENR, 30},&lt;br&gt;
  {981*OVERSAMPLENR, 25},&lt;br&gt;
  {989*OVERSAMPLENR, 20},&lt;br&gt;
  {994*OVERSAMPLENR, 15},&lt;br&gt;
  {1001*OVERSAMPLENR, 10},&lt;br&gt;
  {1005*OVERSAMPLENR, 5}&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define &lt;em&gt;TT_NAME(_N) temptable&lt;/em&gt; ## _N
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TT_NAME(_N) _TT_NAME(_N)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef THERMISTORHEATER_0
&lt;/h1&gt;

&lt;p&gt;#define heater_0_temptable TT_NAME(THERMISTORHEATER_0)&lt;br&gt;
 #define heater_0_temptable_len (sizeof(heater_0_temptable)/sizeof(*heater_0_temptable))&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef HEATER_0_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#error No heater 0 thermistor table specified&lt;/p&gt;

&lt;h1&gt;
  
  
  else  // HEATER_0_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#define heater_0_temptable 0&lt;br&gt;
 #define heater_0_temptable_len 0&lt;/p&gt;

&lt;h1&gt;
  
  
  endif // HEATER_0_USES_THERMISTOR
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef THERMISTORHEATER_1
&lt;/h1&gt;

&lt;p&gt;#define heater_1_temptable TT_NAME(THERMISTORHEATER_1)&lt;br&gt;
 #define heater_1_temptable_len (sizeof(heater_1_temptable)/sizeof(*heater_1_temptable))&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef HEATER_1_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#error No heater 1 thermistor table specified&lt;/p&gt;

&lt;h1&gt;
  
  
  else  // HEATER_1_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#define heater_1_temptable 0&lt;br&gt;
 #define heater_1_temptable_len 0&lt;/p&gt;

&lt;h1&gt;
  
  
  endif // HEATER_1_USES_THERMISTOR
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef THERMISTORHEATER_2
&lt;/h1&gt;

&lt;p&gt;#define heater_2_temptable TT_NAME(THERMISTORHEATER_2)&lt;br&gt;
 #define heater_2_temptable_len (sizeof(heater_2_temptable)/sizeof(*heater_2_temptable))&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef HEATER_2_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#error No heater 2 thermistor table specified&lt;/p&gt;

&lt;h1&gt;
  
  
  else  // HEATER_2_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#define heater_2_temptable 0&lt;br&gt;
 #define heater_2_temptable_len 0&lt;/p&gt;

&lt;h1&gt;
  
  
  endif // HEATER_2_USES_THERMISTOR
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef THERMISTORBED
&lt;/h1&gt;

&lt;p&gt;#define bedtemptable TT_NAME(THERMISTORBED)&lt;br&gt;
 #define bedtemptable_len (sizeof(bedtemptable)/sizeof(*bedtemptable))&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef BED_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#error No bed thermistor table specified&lt;/p&gt;

&lt;h1&gt;
  
  
  endif // BED_USES_THERMISTOR
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif //THERMISTORTABLES_H_
&lt;/h1&gt;



&lt;h1&gt;
  
  
  include "thermistortables.h"
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_STEP_PIN         54
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_DIR_PIN          55
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_ENABLE_PIN       38
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_MIN_PIN           3
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_MAX_PIN           2
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_STEP_PIN         60
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_DIR_PIN          61
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_ENABLE_PIN       56
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_MIN_PIN          14
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_MAX_PIN          15
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_STEP_PIN         46
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_DIR_PIN          48
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_ENABLE_PIN       62
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_MIN_PIN          18
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_MAX_PIN          19
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_STEP_PIN         26
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_DIR_PIN          28
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_ENABLE_PIN       24
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_STEP_PIN         36
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_DIR_PIN          34
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_ENABLE_PIN       30
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define SDPOWER            -1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define EXTRUDERS 3
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TEMP_SENSOR_AD595_OFFSET 0.0
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TEMP_SENSOR_AD595_GAIN   1.0
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define THERMISTORHEATER_0 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define THERMISTORHEATER_1 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define THERMISTORHEATER_2 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define HEATER_0_USES_THERMISTOR 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define HEATER_1_USES_THERMISTOR 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define HEATER_2_USES_THERMISTOR 1
&lt;/h1&gt;

&lt;p&gt;static void *heater_ttbl_map[EXTRUDERS] = { (void *)heater_0_temptable&lt;/p&gt;

&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 1
&lt;/h1&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                       , (void *)heater_1_temptable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;
&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 2
&lt;/h1&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                       , (void *)heater_2_temptable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;
&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 3
&lt;/h1&gt;

&lt;p&gt;#error Unsupported number of extruders&lt;/p&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;};&lt;/p&gt;

&lt;p&gt;static int heater_ttbllen_map[EXTRUDERS] = { heater_0_temptable_len&lt;/p&gt;
&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 1
&lt;/h1&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                        , heater_1_temptable_len
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;
&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 2
&lt;/h1&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                        , heater_2_temptable_len
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;
&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 3
&lt;/h1&gt;

&lt;p&gt;#error Unsupported number of extruders&lt;/p&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;};&lt;/p&gt;

&lt;p&gt;#define PGM_RD_W(x)   (short)pgm_read_word(&amp;amp;x)&lt;/p&gt;
&lt;h1&gt;
  
  
  define SDSS               53
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LED_PIN            13
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define FAN_PIN            9
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define PS_ON_PIN          12
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define KILL_PIN           -1
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define HEATER_0_PIN       10
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define HEATER_1_PIN       8
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define TEMP_0_PIN         15   // ANALOG NUMBERING
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define TEMP_1_PIN         14   // ANALOG NUMBERING
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define TEMP_2_PIN         13   // ANALOG NUMBERING
&lt;/h1&gt;

&lt;p&gt;void setup() {&lt;/p&gt;

&lt;p&gt;pinMode(TEMP_0_PIN  , INPUT);&lt;/p&gt;

&lt;p&gt;pinMode(TEMP_1_PIN  , INPUT);&lt;/p&gt;

&lt;p&gt;pinMode(TEMP_2_PIN  , INPUT);&lt;/p&gt;

&lt;p&gt;pinMode(FAN_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(HEATER_0_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(HEATER_1_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(LED_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_DIR_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_ENABLE_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_DIR_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_ENABLE_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_DIR_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_ENABLE_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_DIR_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_ENABLE_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_DIR_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_ENABLE_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;digitalWrite(X_ENABLE_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_ENABLE_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_ENABLE_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_ENABLE_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_ENABLE_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;Serial.begin(115200);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;float analog2temp(int raw, uint8_t e) {&lt;/p&gt;

&lt;p&gt;#ifdef HEATER_0_USES_MAX6675&lt;/p&gt;

&lt;p&gt;if (e == 0)&lt;/p&gt;

&lt;p&gt;{&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; return 0.25 * raw;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;#endif&lt;/p&gt;

&lt;p&gt;if(heater_ttbl_map[e] != 0)&lt;/p&gt;

&lt;p&gt;{&lt;/p&gt;

&lt;p&gt;float celsius = 0;&lt;/p&gt;

&lt;p&gt;byte i;  &lt;/p&gt;

&lt;p&gt;short (&lt;em&gt;tt)[][2] = (short (&lt;/em&gt;)[][2])(heater_ttbl_map[e]);&lt;/p&gt;

&lt;p&gt;raw = (1023 * OVERSAMPLENR) - raw;&lt;/p&gt;

&lt;p&gt;for (i=1; i&amp;lt;heater_ttbllen_map[e]; i++)&lt;/p&gt;

&lt;p&gt;{&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; if ((PGM_RD_W((*tt)[i][0]) &amp;gt; raw) &amp;amp;&amp;amp; ((float)(PGM_RD_W((*tt)[i][0]) - PGM_RD_W((*tt)[i-1][0])) &amp;gt;0))

 {

   celsius = PGM_RD_W((*tt)[i-1][1]) +

     (raw - PGM_RD_W((*tt)[i-1][0])) *

     (float)(PGM_RD_W((*tt)[i][1]) - PGM_RD_W((*tt)[i-1][1])) /

     (float)(PGM_RD_W((*tt)[i][0]) - PGM_RD_W((*tt)[i-1][0]));

   break;

 }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;// Overflow: Set to last value in the table&lt;/p&gt;

&lt;p&gt;if (i == heater_ttbllen_map[e]) celsius = PGM_RD_W((*tt)[i-1][1]);&lt;/p&gt;

&lt;p&gt;return celsius;&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;return ((raw * ((5.0 * 100.0) / 1024.0) / OVERSAMPLENR) * TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET;&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;unsigned long prevMillis;&lt;/p&gt;

&lt;p&gt;void loop () {&lt;/p&gt;

&lt;p&gt;if (millis() %1000 &amp;lt;500)&lt;/p&gt;

&lt;p&gt;digitalWrite(LED_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;else&lt;/p&gt;

&lt;p&gt;digitalWrite(LED_PIN, LOW);&lt;/p&gt;

&lt;p&gt;if (millis() %1000 &amp;lt;300) {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, LOW);&lt;/p&gt;

&lt;p&gt;} else if (millis() %1000 &amp;lt;600) {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, LOW);&lt;/p&gt;

&lt;p&gt;} else  {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;if (millis() %2000 &amp;lt;1000) {&lt;/p&gt;

&lt;p&gt;digitalWrite(X_DIR_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_DIR_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_DIR_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_DIR_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_DIR_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;else {&lt;/p&gt;

&lt;p&gt;digitalWrite(X_DIR_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_DIR_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_DIR_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_DIR_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_DIR_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;digitalWrite(X_STEP_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_STEP_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_STEP_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_STEP_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_STEP_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;delay(1);&lt;/p&gt;

&lt;p&gt;digitalWrite(X_STEP_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_STEP_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_STEP_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_STEP_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_STEP_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;if (millis() -prevMillis &amp;gt;500){&lt;/p&gt;

&lt;p&gt;prevMillis=millis();&lt;/p&gt;

&lt;p&gt;int t = analogRead( TEMP_0_PIN);&lt;/p&gt;

&lt;p&gt;Serial.print("T0 ");&lt;/p&gt;

&lt;p&gt;Serial.print(t);&lt;/p&gt;

&lt;p&gt;Serial.print("/");&lt;/p&gt;

&lt;p&gt;Serial.print(analog2temp(1024 - t,0),0);&lt;/p&gt;

&lt;p&gt;Serial.print(" T1 ");&lt;/p&gt;

&lt;p&gt;t = analogRead( TEMP_1_PIN);&lt;/p&gt;

&lt;p&gt;Serial.print(t);&lt;/p&gt;

&lt;p&gt;Serial.print("/");&lt;/p&gt;

&lt;p&gt;Serial.print(analog2temp(1024 - t,1),0);&lt;/p&gt;

&lt;p&gt;Serial.print(" T2 ");&lt;/p&gt;

&lt;p&gt;t = analogRead( TEMP_2_PIN);&lt;/p&gt;

&lt;p&gt;Serial.print(t);&lt;/p&gt;

&lt;p&gt;Serial.print("/");&lt;/p&gt;

&lt;p&gt;Serial.println(analog2temp(1024 - t,2),0);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;}&lt;br&gt;
/***&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Required libraries:&lt;/li&gt;
&lt;li&gt;Arduino_GFX: &lt;a href="https://github.com/moononournation/Arduino_GFX.git"&gt;https://github.com/moononournation/Arduino_GFX.git&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;libhelix: &lt;a href="https://github.com/pschatzmann/arduino-libhelix.git"&gt;https://github.com/pschatzmann/arduino-libhelix.git&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;JPEGDEC: &lt;a href="https://github.com/bitbank2/JPEGDEC.git"&gt;https://github.com/bitbank2/JPEGDEC.git&lt;/a&gt;
*/&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;// auto fall back to MP3 if AAC file not available&lt;/p&gt;

&lt;h1&gt;
  
  
  define AAC_FILENAME "/44100.aac"
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define MP3_FILENAME "/44100.mp3"
&lt;/h1&gt;

&lt;p&gt;// #define MJPEG_FILENAME "/288_30fps.mjpeg"&lt;br&gt;
// #define MJPEG_FILENAME "/320_30fps.mjpeg"&lt;/p&gt;

&lt;h1&gt;
  
  
  define MJPEG_FILENAME "/480_15fps.mjpeg"
&lt;/h1&gt;

&lt;p&gt;// #define MJPEG_FILENAME "/480_30fps.mjpeg"&lt;/p&gt;

&lt;h1&gt;
  
  
  define FPS 15
&lt;/h1&gt;

&lt;p&gt;// #define FPS 30&lt;br&gt;
// #define MJPEG_BUFFER_SIZE (288 * 240 * 2 / 8)&lt;br&gt;
// #define MJPEG_BUFFER_SIZE (320 * 240 * 2 / 8)&lt;/p&gt;

&lt;h1&gt;
  
  
  define MJPEG_BUFFER_SIZE (480 * 270 * 2 / 8)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define AUDIOASSIGNCORE 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define DECODEASSIGNCORE 0
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define DRAWASSIGNCORE 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define SDMMC_D3 10  // SDMMC Data3 / SPI CS
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define SDMMC_CMD 11 // SDMMC CMD   / SPI MOSI
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define SDMMC_CLK 12 // SDMMC CLK   / SPI SCK
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define SDMMC_D0 13  // SDMMC Data0 / SPI MISO
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;p&gt;/*******************************************************************************&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start of Arduino_GFX setting
***************************************************************************&lt;strong&gt;&lt;em&gt;/
#include 
#define GFX_BL 2
Arduino_DataBus *bus = new Arduino_ESP32LCD16(
48 /&lt;/em&gt; DC &lt;em&gt;/, 45 /&lt;/em&gt; CS &lt;em&gt;/, 47 /&lt;/em&gt; WR &lt;em&gt;/, 21 /&lt;/em&gt; RD &lt;em&gt;/,
5 /&lt;/em&gt; D0 &lt;em&gt;/, 6 /&lt;/em&gt; D1 &lt;em&gt;/, 7 /&lt;/em&gt; D2 &lt;em&gt;/, 15 /&lt;/em&gt; D3 &lt;em&gt;/, 16 /&lt;/em&gt; D4 &lt;em&gt;/, 4 /&lt;/em&gt; D5 &lt;em&gt;/, 8 /&lt;/em&gt; D6 &lt;em&gt;/, 3 /&lt;/em&gt; D7 &lt;em&gt;/,
46 /&lt;/em&gt; D8 &lt;em&gt;/, 9 /&lt;/em&gt; D9 &lt;em&gt;/, 1 /&lt;/em&gt; D10 &lt;em&gt;/, 42 /&lt;/em&gt; D11 &lt;em&gt;/, 39 /&lt;/em&gt; D12 &lt;em&gt;/, 41 /&lt;/em&gt; D13 &lt;em&gt;/, 40 /&lt;/em&gt; D14 &lt;em&gt;/, 14 /&lt;/em&gt; D15 &lt;em&gt;/);
Arduino_GFX *gfx = new Arduino_NV3041A(bus, 17 /&lt;/em&gt; RST &lt;em&gt;/, 0 /&lt;/em&gt; rotation &lt;em&gt;/, true /&lt;/em&gt; IPS */);
/&lt;/strong&gt;*****************************************************************************&lt;/li&gt;
&lt;li&gt;End of Arduino_GFX setting
******************************************************************************/&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;/* variables */&lt;br&gt;
static int next_frame = 0;&lt;br&gt;
static int skipped_frames = 0;&lt;br&gt;
static unsigned long start_ms, curr_ms, next_frame_ms;&lt;/p&gt;

&lt;p&gt;/* audio */&lt;/p&gt;

&lt;h1&gt;
  
  
  include "esp32_audio_task.h"
&lt;/h1&gt;

&lt;p&gt;/* MJPEG Video */&lt;/p&gt;

&lt;h1&gt;
  
  
  include "mjpeg_decode_draw_task.h"
&lt;/h1&gt;

&lt;p&gt;// pixel drawing callback&lt;br&gt;
static int drawMCU(JPEGDRAW &lt;em&gt;pDraw)&lt;br&gt;
{&lt;br&gt;
  // Serial.printf("Draw pos = (%d, %d), size = %d x %d\n", pDraw-&amp;gt;x, pDraw-&amp;gt;y, pDraw-&amp;gt;iWidth, pDraw-&amp;gt;iHeight);&lt;br&gt;
  unsigned long s = millis();&lt;br&gt;
  gfx-&amp;gt;draw16bitRGBBitmap(pDraw-&amp;gt;x, pDraw-&amp;gt;y, pDraw-&amp;gt;pPixels, pDraw-&amp;gt;iWidth, pDraw-&amp;gt;iHeight);&lt;br&gt;
  total_show_video_ms += millis() - s;&lt;br&gt;
  return 1;&lt;br&gt;
} /&lt;/em&gt; drawMCU() */&lt;/p&gt;

&lt;p&gt;void setup()&lt;br&gt;
{&lt;br&gt;
  WiFi.mode(WIFI_OFF);&lt;/p&gt;

&lt;p&gt;Serial.begin(115200);&lt;br&gt;
  // Serial.setDebugOutput(true);&lt;br&gt;
  // while(!Serial);&lt;br&gt;
  Serial.println("ESP32_4827A043");&lt;/p&gt;

&lt;h1&gt;
  
  
  ifdef GFX_EXTRA_PRE_INIT
&lt;/h1&gt;

&lt;p&gt;GFX_EXTRA_PRE_INIT();&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;Serial.println("Init display");&lt;br&gt;
  if (!gfx-&amp;gt;begin())&lt;br&gt;
  {&lt;br&gt;
    Serial.println("Init display failed!");&lt;br&gt;
  }&lt;br&gt;
  gfx-&amp;gt;fillScreen(BLACK);&lt;/p&gt;

&lt;h1&gt;
  
  
  ifdef GFX_BL
&lt;/h1&gt;

&lt;p&gt;pinMode(GFX_BL, OUTPUT);&lt;br&gt;
  digitalWrite(GFX_BL, HIGH);&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;Serial.println("Init I2S");&lt;br&gt;
  gfx-&amp;gt;println("Init I2S");&lt;br&gt;
  esp_err_t ret_val = i2s_init(I2S_NUM_0, 44100, -1 /* MCLK &lt;em&gt;/, 19 /&lt;/em&gt; SCLK &lt;em&gt;/, 18 /&lt;/em&gt; LRCK &lt;em&gt;/, 17 /&lt;/em&gt; DOUT &lt;em&gt;/, -1 /&lt;/em&gt; DIN */);&lt;br&gt;
  if (ret_val != ESP_OK)&lt;br&gt;
  {&lt;br&gt;
    Serial.printf("i2s_init failed: %d\n", ret_val);&lt;br&gt;
  }&lt;br&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;/p&gt;

&lt;p&gt;Serial.println("Init FS");&lt;br&gt;
  gfx-&amp;gt;println("Init FS");&lt;br&gt;
  // if (!LittleFS.begin(false, "/root"))&lt;br&gt;
  // if (!SPIFFS.begin(false, "/root"))&lt;br&gt;
  if (!FFat.begin(false, "/root"))&lt;/p&gt;

&lt;p&gt;// SPIClass spi = SPIClass(HSPI);&lt;br&gt;
  // spi.begin(SDMMC_CLK, SDMMC_D0 /* MISO &lt;em&gt;/, SDMMC_CMD /&lt;/em&gt; MOSI &lt;em&gt;/, SDMMC_D3 /&lt;/em&gt; SS &lt;em&gt;/);&lt;br&gt;
  // if (!SD.begin(SDMMC_D3 /&lt;/em&gt; SS */, spi, 80000000))&lt;/p&gt;

&lt;p&gt;// pinMode(SDMMC_D3 /* CS &lt;em&gt;/, OUTPUT);&lt;br&gt;
  // digitalWrite(SDMMC_D3 /&lt;/em&gt; CS &lt;em&gt;/, HIGH);&lt;br&gt;
  // SD_MMC.setPins(SDMMC_CLK, SDMMC_CMD, SDMMC_D0);&lt;br&gt;
  // if (!SD_MMC.begin("/root", true)) /&lt;/em&gt; 1-bit SD bus mode */&lt;br&gt;
  {&lt;br&gt;
    Serial.println("ERROR: File system mount failed!");&lt;br&gt;
    gfx-&amp;gt;println("ERROR: File system mount failed!");&lt;br&gt;
  }&lt;br&gt;
  else&lt;br&gt;
  {&lt;br&gt;
    bool aac_file_available = false;&lt;br&gt;
    Serial.println("Open AAC file: " AAC_FILENAME);&lt;br&gt;
    gfx-&amp;gt;println("Open AAC file: " AAC_FILENAME);&lt;br&gt;
    // File aFile = LittleFS.open(AAC_FILENAME);&lt;br&gt;
    // File aFile = SPIFFS.open(AAC_FILENAME);&lt;br&gt;
    File aFile = FFat.open(AAC_FILENAME);&lt;br&gt;
    // File aFile = SD.open(AAC_FILENAME);&lt;br&gt;
    // File aFile = SD_MMC.open(AAC_FILENAME);&lt;br&gt;
    if (aFile)&lt;br&gt;
    {&lt;br&gt;
      aac_file_available = true;&lt;br&gt;
    }&lt;br&gt;
    else&lt;br&gt;
    {&lt;br&gt;
      Serial.println("Open MP3 file: " MP3_FILENAME);&lt;br&gt;
      gfx-&amp;gt;println("Open MP3 file: " MP3_FILENAME);&lt;br&gt;
      // aFile = LittleFS.open(MP3_FILENAME);&lt;br&gt;
      // aFile = SPIFFS.open(MP3_FILENAME);&lt;br&gt;
      aFile = FFat.open(MP3_FILENAME);&lt;br&gt;
      // aFile = SD.open(MP3_FILENAME);&lt;br&gt;
      // aFile = SD_MMC.open(MP3_FILENAME);&lt;br&gt;
    }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (!aFile || aFile.isDirectory())
{
  Serial.println("ERROR: Failed to open " AAC_FILENAME " or " MP3_FILENAME " file for reading");
  gfx-&amp;gt;println("ERROR: Failed to open " AAC_FILENAME " or " MP3_FILENAME " file for reading");
}
else
{
  Serial.println("Open MJPEG file: " MJPEG_FILENAME);
  gfx-&amp;gt;println("Open MJPEG file: " MJPEG_FILENAME);
  // File vFile = LittleFS.open(MJPEG_FILENAME);
  // File vFile = SPIFFS.open(MJPEG_FILENAME);
  File vFile = FFat.open(MJPEG_FILENAME);
  // File vFile = SD.open(MJPEG_FILENAME);
  // File vFile = SD_MMC.open(MJPEG_FILENAME);
  if (!vFile || vFile.isDirectory())
  {
    Serial.println("ERROR: Failed to open " MJPEG_FILENAME " file for reading");
    gfx-&amp;gt;println("ERROR: Failed to open " MJPEG_FILENAME " file for reading");
  }
  else
  {
    Serial.println("Init video");
    gfx-&amp;gt;println("Init video");
    mjpeg_setup(&amp;amp;vFile, MJPEG_BUFFER_SIZE, drawMCU,
                false /* useBigEndian */, DECODEASSIGNCORE, DRAWASSIGNCORE);

    Serial.println("Start play audio task");
    gfx-&amp;gt;println("Start play audio task");
    BaseType_t ret_val;
    if (aac_file_available)
    {
      ret_val = aac_player_task_start(&amp;amp;aFile, AUDIOASSIGNCORE);
    }
    else
    {
      ret_val = mp3_player_task_start(&amp;amp;aFile, AUDIOASSIGNCORE);
    }
    if (ret_val != pdPASS)
    {
      Serial.printf("Audio player task start failed: %d\n", ret_val);
      gfx-&amp;gt;printf("Audio player task start failed: %d\n", ret_val);
    }

    Serial.println("Start play video");
    gfx-&amp;gt;println("Start play video");
    start_ms = millis();
    curr_ms = millis();
    next_frame_ms = start_ms + (++next_frame * 1000 / FPS / 2);
    while (vFile.available() &amp;amp;&amp;amp; mjpeg_read_frame()) // Read video
    {
      total_read_video_ms += millis() - curr_ms;
      curr_ms = millis();

      if (millis() &amp;lt; next_frame_ms) // check show frame or skip frame
      {
        // Play video
        mjpeg_draw_frame();
        total_decode_video_ms += millis() - curr_ms;
        curr_ms = millis();
      }
      else
      {
        ++skipped_frames;
        Serial.println("Skip frame");
      }

      while (millis() &amp;lt; next_frame_ms)
      {
        vTaskDelay(pdMS_TO_TICKS(1));
      }

      curr_ms = millis();
      next_frame_ms = start_ms + (++next_frame * 1000 / FPS);
    }
    int time_used = millis() - start_ms;
    int total_frames = next_frame - 1;
    Serial.println("AV end");
    vFile.close();
    aFile.close();

    delay(200);

    int played_frames = total_frames - skipped_frames;
    float fps = 1000.0 * played_frames / time_used;
    total_decode_audio_ms -= total_play_audio_ms;
    // total_decode_video_ms -= total_show_video_ms;
    Serial.printf("Played frames: %d\n", played_frames);
    Serial.printf("Skipped frames: %d (%0.1f %%)\n", skipped_frames, 100.0 * skipped_frames / total_frames);
    Serial.printf("Time used: %d ms\n", time_used);
    Serial.printf("Expected FPS: %d\n", FPS);
    Serial.printf("Actual FPS: %0.1f\n", fps);
    Serial.printf("Read audio: %lu ms (%0.1f %%)\n", total_read_audio_ms, 100.0 * total_read_audio_ms / time_used);
    Serial.printf("Decode audio: %lu ms (%0.1f %%)\n", total_decode_audio_ms, 100.0 * total_decode_audio_ms / time_used);
    Serial.printf("Play audio: %lu ms (%0.1f %%)\n", total_play_audio_ms, 100.0 * total_play_audio_ms / time_used);
    Serial.printf("Read video: %lu ms (%0.1f %%)\n", total_read_video_ms, 100.0 * total_read_video_ms / time_used);
    Serial.printf("Decode video: %lu ms (%0.1f %%)\n", total_decode_video_ms, 100.0 * total_decode_video_ms / time_used);
    Serial.printf("Show video: %lu ms (%0.1f %%)\n", total_show_video_ms, 100.0 * total_show_video_ms / time_used);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  define CHART_MARGIN 64
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LEGEND_A_COLOR 0x1BB6
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LEGEND_B_COLOR 0xFBE1
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LEGEND_C_COLOR 0x2D05
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LEGEND_D_COLOR 0xD125
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LEGEND_E_COLOR 0x9337
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LEGEND_F_COLOR 0x8AA9
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LEGEND_G_COLOR 0xE3B8
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LEGEND_H_COLOR 0x7BEF
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LEGEND_I_COLOR 0xBDE4
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LEGEND_J_COLOR 0x15F9
&lt;/h1&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    // gfx-&amp;gt;setCursor(0, 0);
    gfx-&amp;gt;setTextColor(WHITE);
    gfx-&amp;gt;printf("Played frames: %d\n", played_frames);
    gfx-&amp;gt;printf("Skipped frames: %d (%0.1f %%)\n", skipped_frames, 100.0 * skipped_frames / total_frames);
    gfx-&amp;gt;printf("Time used: %d ms\n", time_used);
    gfx-&amp;gt;printf("Expected FPS: %d\n", FPS);
    gfx-&amp;gt;printf("Actual FPS: %0.1f\n\n", fps);

    int16_t r1 = ((gfx-&amp;gt;height() - CHART_MARGIN - CHART_MARGIN) / 2);
    int16_t r2 = r1 / 2;
    int16_t cx = gfx-&amp;gt;width() - r1 - 10;
    int16_t cy = r1 + CHART_MARGIN;

    float arc_start1 = 0;
    float arc_end1 = arc_start1 + max(2.0, 360.0 * total_read_audio_ms / time_used);
    for (int i = arc_start1 + 1; i &amp;lt; arc_end1; i += 2)
    {
      gfx-&amp;gt;fillArc(cx, cy, r1, r2, arc_start1 - 90.0, i - 90.0, LEGEND_A_COLOR);
    }
    gfx-&amp;gt;fillArc(cx, cy, r1, r2, arc_start1 - 90.0, arc_end1 - 90.0, LEGEND_A_COLOR);
    gfx-&amp;gt;setTextColor(LEGEND_A_COLOR);
    gfx-&amp;gt;printf("Read audio: %lu ms (%0.1f %%)\n", total_read_audio_ms, 100.0 * total_read_audio_ms / time_used);

    float arc_start2 = arc_end1;
    float arc_end2 = arc_start2 + max(2.0, 360.0 * total_decode_audio_ms / time_used);
    for (int i = arc_start2 + 1; i &amp;lt; arc_end2; i += 2)
    {
      gfx-&amp;gt;fillArc(cx, cy, r1, r2, arc_start2 - 90.0, i - 90.0, LEGEND_B_COLOR);
    }
    gfx-&amp;gt;fillArc(cx, cy, r1, r2, arc_start2 - 90.0, arc_end2 - 90.0, LEGEND_B_COLOR);
    gfx-&amp;gt;setTextColor(LEGEND_B_COLOR);
    gfx-&amp;gt;printf("Decode audio: %lu ms (%0.1f %%)\n", total_decode_audio_ms, 100.0 * total_decode_audio_ms / time_used);
    gfx-&amp;gt;setTextColor(LEGEND_J_COLOR);
    gfx-&amp;gt;printf("Play audio: %lu ms (%0.1f %%)\n", total_play_audio_ms, 100.0 * total_play_audio_ms / time_used);

    float arc_start3 = arc_end2;
    float arc_end3 = arc_start3 + max(2.0, 360.0 * total_read_video_ms / time_used);
    for (int i = arc_start3 + 1; i &amp;lt; arc_end3; i += 2)
    {
      gfx-&amp;gt;fillArc(cx, cy, r1, r2, arc_start3 - 90.0, i - 90.0, LEGEND_C_COLOR);
    }
    gfx-&amp;gt;fillArc(cx, cy, r1, r2, arc_start3 - 90.0, arc_end3 - 90.0, LEGEND_C_COLOR);
    gfx-&amp;gt;setTextColor(LEGEND_C_COLOR);
    gfx-&amp;gt;printf("Read video: %lu ms (%0.1f %%)\n", total_read_video_ms, 100.0 * total_read_video_ms / time_used);

    float arc_start4 = arc_end3;
    float arc_end4 = arc_start4 + max(2.0, 360.0 * total_show_video_ms / time_used);
    for (int i = arc_start4 + 1; i &amp;lt; arc_end4; i += 2)
    {
      gfx-&amp;gt;fillArc(cx, cy, r1, r2, arc_start4 - 90.0, i - 90.0, LEGEND_D_COLOR);
    }
    gfx-&amp;gt;fillArc(cx, cy, r1, r2, arc_start4 - 90.0, arc_end4 - 90.0, LEGEND_D_COLOR);
    gfx-&amp;gt;setTextColor(LEGEND_D_COLOR);
    gfx-&amp;gt;printf("Show video: %lu ms (%0.1f %%)\n", total_show_video_ms, 100.0 * total_show_video_ms / time_used);

    float arc_start5 = 0;
    float arc_end5 = arc_start5 + max(2.0, 360.0 * total_decode_video_ms / time_used);
    for (int i = arc_start5 + 1; i &amp;lt; arc_end5; i += 2)
    {
      gfx-&amp;gt;fillArc(cx, cy, r2, 0, arc_start5 - 90.0, i - 90.0, LEGEND_E_COLOR);
    }
    gfx-&amp;gt;fillArc(cx, cy, r2, 0, arc_start5 - 90.0, arc_end5 - 90.0, LEGEND_E_COLOR);
    gfx-&amp;gt;setTextColor(LEGEND_E_COLOR);
    gfx-&amp;gt;printf("Decode video: %lu ms (%0.1f %%)\n", total_decode_video_ms, 100.0 * total_decode_video_ms / time_used);
  }

  // delay(60000);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  ifdef GFX_BL
&lt;/h1&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  // digitalWrite(GFX_BL, LOW);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  // gfx-&amp;gt;displayOff();
  // esp_deep_sleep_start();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void loop()&lt;br&gt;
{&lt;br&gt;
}&lt;/p&gt;

&lt;h1&gt;
  
  
  include "driver/i2s.h"
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include "AACDecoderHelix.h"
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include "MP3DecoderHelix.h"
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define GAIN_LEVEL 0.8
&lt;/h1&gt;

&lt;p&gt;static unsigned long total_read_audio_ms = 0;&lt;br&gt;
static unsigned long total_decode_audio_ms = 0;&lt;br&gt;
static unsigned long total_play_audio_ms = 0;&lt;/p&gt;

&lt;p&gt;static i2s_port_t _i2s_num;&lt;br&gt;
static esp_err_t i2s_init(i2s_port_t i2s_num, uint32_t sample_rate,&lt;br&gt;
                          int mck_io_num,   /&lt;em&gt;!&amp;lt; MCK in out pin. Note that ESP32 supports setting MCK on GPIO0/GPIO1/GPIO3 only&lt;/em&gt;/&lt;br&gt;
                          int bck_io_num,   /&lt;em&gt;!&amp;lt; BCK in out pin&lt;/em&gt;/&lt;br&gt;
                          int ws_io_num,    /&lt;em&gt;!&amp;lt; WS in out pin&lt;/em&gt;/&lt;br&gt;
                          int data_out_num, /&lt;em&gt;!&amp;lt; DATA out pin&lt;/em&gt;/&lt;br&gt;
                          int data_in_num   /&lt;em&gt;!&amp;lt; DATA in pin&lt;/em&gt;/&lt;br&gt;
)&lt;br&gt;
{&lt;br&gt;
  _i2s_num = i2s_num;&lt;/p&gt;

&lt;p&gt;esp_err_t ret_val = ESP_OK;&lt;/p&gt;

&lt;p&gt;i2s_config_t i2s_config;&lt;br&gt;
  i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX);&lt;br&gt;
  i2s_config.sample_rate = sample_rate;&lt;br&gt;
  i2s_config.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT;&lt;br&gt;
  i2s_config.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT;&lt;br&gt;
  i2s_config.communication_format = I2S_COMM_FORMAT_STAND_I2S;&lt;br&gt;
  i2s_config.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1;&lt;br&gt;
  i2s_config.dma_buf_count = 8;&lt;br&gt;
  i2s_config.dma_buf_len = 160;&lt;br&gt;
  i2s_config.use_apll = false;&lt;br&gt;
  i2s_config.tx_desc_auto_clear = true;&lt;br&gt;
  i2s_config.fixed_mclk = 0;&lt;br&gt;
  i2s_config.mclk_multiple = I2S_MCLK_MULTIPLE_DEFAULT;&lt;br&gt;
  i2s_config.bits_per_chan = I2S_BITS_PER_CHAN_16BIT;&lt;/p&gt;

&lt;p&gt;i2s_pin_config_t pin_config;&lt;br&gt;
  pin_config.mck_io_num = mck_io_num;&lt;br&gt;
  pin_config.bck_io_num = bck_io_num;&lt;br&gt;
  pin_config.ws_io_num = ws_io_num;&lt;br&gt;
  pin_config.data_out_num = data_out_num;&lt;br&gt;
  pin_config.data_in_num = data_in_num;&lt;/p&gt;

&lt;p&gt;ret_val |= i2s_driver_install(i2s_num, &amp;amp;i2s_config, 0, NULL);&lt;br&gt;
  ret_val |= i2s_set_pin(i2s_num, &amp;amp;pin_config);&lt;/p&gt;

&lt;p&gt;return ret_val;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;static int _samprate = 0;&lt;br&gt;
static void aacAudioDataCallback(AACFrameInfo &amp;amp;info, int16_t &lt;em&gt;pwm_buffer, size_t len, void&lt;/em&gt;)&lt;br&gt;
{&lt;br&gt;
  unsigned long s = millis();&lt;br&gt;
  if (_samprate != info.sampRateOut)&lt;br&gt;
  {&lt;br&gt;
    // log_i("bitRate: %d, nChans: %d, sampRateCore: %d, sampRateOut: %d, bitsPerSample: %d, outputSamps: %d, profile: %d, tnsUsed: %d, pnsUsed: %d",&lt;br&gt;
    //       info.bitRate, info.nChans, info.sampRateCore, info.sampRateOut, info.bitsPerSample, info.outputSamps, info.profile, info.tnsUsed, info.pnsUsed);&lt;br&gt;
    i2s_set_clk(_i2s_num, info.sampRateOut /* sample_rate &lt;em&gt;/, info.bitsPerSample /&lt;/em&gt; bits_cfg &lt;em&gt;/, (info.nChans == 2) ? I2S_CHANNEL_STEREO : I2S_CHANNEL_MONO /&lt;/em&gt; channel &lt;em&gt;/);&lt;br&gt;
    _samprate = info.sampRateOut;&lt;br&gt;
  }&lt;br&gt;
  size_t i2s_bytes_written = 0;&lt;br&gt;
  for (int i = 0; i &amp;lt; len; i++)&lt;br&gt;
  {&lt;br&gt;
    pwm_buffer[i] = pwm_buffer[i] * GAIN_LEVEL;&lt;br&gt;
  }&lt;br&gt;
  i2s_write(_i2s_num, pwm_buffer, len * 2, &amp;amp;i2s_bytes_written, portMAX_DELAY);&lt;br&gt;
  // log_i("len: %d, i2s_bytes_written: %d", len, i2s_bytes_written);&lt;br&gt;
  total_play_audio_ms += millis() - s;&lt;br&gt;
}&lt;br&gt;
static void mp3AudioDataCallback(MP3FrameInfo &amp;amp;info, int16_t *pwm_buffer, size_t len, void&lt;/em&gt;)&lt;br&gt;
{&lt;br&gt;
  unsigned long s = millis();&lt;br&gt;
  if (_samprate != info.samprate)&lt;br&gt;
  {&lt;br&gt;
    log_i("bitrate: %d, nChans: %d, samprate: %d, bitsPerSample: %d, outputSamps: %d, layer: %d, version: %d",&lt;br&gt;
          info.bitrate, info.nChans, info.samprate, info.bitsPerSample, info.outputSamps, info.layer, info.version);&lt;br&gt;
    i2s_set_clk(_i2s_num, info.samprate /* sample_rate &lt;em&gt;/, info.bitsPerSample /&lt;/em&gt; bits_cfg &lt;em&gt;/, (info.nChans == 2) ? I2S_CHANNEL_STEREO : I2S_CHANNEL_MONO /&lt;/em&gt; channel */);&lt;br&gt;
    _samprate = info.samprate;&lt;br&gt;
  }&lt;br&gt;
  size_t i2s_bytes_written = 0;&lt;br&gt;
  for (int i = 0; i &amp;lt; len; i++)&lt;br&gt;
  {&lt;br&gt;
    pwm_buffer[i] = pwm_buffer[i] * GAIN_LEVEL;&lt;br&gt;
  }&lt;br&gt;
  i2s_write(_i2s_num, pwm_buffer, len * 2, &amp;amp;i2s_bytes_written, portMAX_DELAY);&lt;br&gt;
  // log_i("len: %d, i2s_bytes_written: %d", len, i2s_bytes_written);&lt;br&gt;
  total_play_audio_ms += millis() - s;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;static uint8_t _frame[MP3_MAX_FRAME_SIZE]; // MP3_MAX_FRAME_SIZE is smaller, so always use MP3_MAX_FRAME_SIZE&lt;/p&gt;

&lt;p&gt;static libhelix::AACDecoderHelix _aac(aacAudioDataCallback);&lt;br&gt;
static void aac_player_task(void *pvParam)&lt;br&gt;
{&lt;br&gt;
  Stream *input = (Stream *)pvParam;&lt;/p&gt;

&lt;p&gt;int r, w;&lt;br&gt;
  unsigned long ms = millis();&lt;br&gt;
  while (r = input-&amp;gt;readBytes(_frame, MP3_MAX_FRAME_SIZE))&lt;br&gt;
  {&lt;br&gt;
    total_read_audio_ms += millis() - ms;&lt;br&gt;
    ms = millis();&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;while (r &amp;gt; 0)
{
  w = _aac.write(_frame, r);
  // log_i("r: %d, w: %d\n", r, w);
  r -= w;
}
total_decode_audio_ms += millis() - ms;
ms = millis();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  log_i("AAC stop.");&lt;/p&gt;

&lt;p&gt;vTaskDelete(NULL);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;static libhelix::MP3DecoderHelix _mp3(mp3AudioDataCallback);&lt;br&gt;
static void mp3_player_task(void *pvParam)&lt;br&gt;
{&lt;br&gt;
  Stream *input = (Stream *)pvParam;&lt;/p&gt;

&lt;p&gt;int r, w;&lt;br&gt;
  unsigned long ms = millis();&lt;br&gt;
  while (r = input-&amp;gt;readBytes(_frame, MP3_MAX_FRAME_SIZE))&lt;br&gt;
  {&lt;br&gt;
    total_read_audio_ms += millis() - ms;&lt;br&gt;
    ms = millis();&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;while (r &amp;gt; 0)
{
  w = _mp3.write(_frame, r);
  // log_i("r: %d, w: %d\n", r, w);
  r -= w;
}
total_decode_audio_ms += millis() - ms;
ms = millis();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  log_i("MP3 stop.");&lt;/p&gt;

&lt;p&gt;vTaskDelete(NULL);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;static BaseType_t aac_player_task_start(Stream *input, BaseType_t audioAssignCore)&lt;br&gt;
{&lt;br&gt;
  _aac.begin();&lt;/p&gt;

&lt;p&gt;return xTaskCreatePinnedToCore(&lt;br&gt;
      (TaskFunction_t)aac_player_task,&lt;br&gt;
      (const char *const)"AAC Player Task",&lt;br&gt;
      (const uint32_t)2000,&lt;br&gt;
      (void *const)input,&lt;br&gt;
      (UBaseType_t)configMAX_PRIORITIES - 1,&lt;br&gt;
      (TaskHandle_t *const)NULL,&lt;br&gt;
      (const BaseType_t)audioAssignCore);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;static BaseType_t mp3_player_task_start(Stream *input, BaseType_t audioAssignCore)&lt;br&gt;
{&lt;br&gt;
  _mp3.begin();&lt;/p&gt;

&lt;p&gt;return xTaskCreatePinnedToCore(&lt;br&gt;
      (TaskFunction_t)mp3_player_task,&lt;br&gt;
      (const char *const)"MP3 Player Task",&lt;br&gt;
      (const uint32_t)2000,&lt;br&gt;
      (void *const)input,&lt;br&gt;
      (UBaseType_t)configMAX_PRIORITIES - 1,&lt;br&gt;
      (TaskHandle_t *const)NULL,&lt;br&gt;
      (const BaseType_t)audioAssignCore);&lt;br&gt;
}&lt;/p&gt;

&lt;h1&gt;
  
  
  define READ_BUFFER_SIZE 1024
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define MAXOUTPUTSIZE (MAX_BUFFERED_PIXELS / 16 / 16)
&lt;/h1&gt;

&lt;p&gt;// #define MAXOUTPUTSIZE (480 / 4 / 16)&lt;/p&gt;

&lt;h1&gt;
  
  
  define NUMBER_OF_DECODE_BUFFER 3
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define NUMBER_OF_DRAW_BUFFER 9
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;p&gt;typedef struct&lt;br&gt;
{&lt;br&gt;
  int32_t size;&lt;br&gt;
  uint8_t *buf;&lt;br&gt;
} mjpegBuf;&lt;/p&gt;

&lt;p&gt;typedef struct&lt;br&gt;
{&lt;br&gt;
  xQueueHandle xqh;&lt;br&gt;
  JPEG_DRAW_CALLBACK *drawFunc;&lt;br&gt;
} paramDrawTask;&lt;/p&gt;

&lt;p&gt;typedef struct&lt;br&gt;
{&lt;br&gt;
  xQueueHandle xqh;&lt;br&gt;
  mjpegBuf *mBuf;&lt;br&gt;
  JPEG_DRAW_CALLBACK *drawFunc;&lt;br&gt;
} paramDecodeTask;&lt;/p&gt;

&lt;p&gt;static JPEGDRAW jpegdraws[NUMBER_OF_DRAW_BUFFER];&lt;br&gt;
static int _draw_queue_cnt = 0;&lt;br&gt;
static JPEGDEC _jpegDec;&lt;br&gt;
static xQueueHandle _xqh;&lt;br&gt;
static bool _useBigEndian;&lt;/p&gt;

&lt;p&gt;static unsigned long total_read_video_ms = 0;&lt;br&gt;
static unsigned long total_decode_video_ms = 0;&lt;br&gt;
static unsigned long total_show_video_ms = 0;&lt;/p&gt;

&lt;p&gt;Stream *_input;&lt;/p&gt;

&lt;p&gt;int32_t _mjpegBufSize;&lt;/p&gt;

&lt;p&gt;uint8_t *_read_buf;&lt;br&gt;
int32_t _mjpeg_buf_offset = 0;&lt;/p&gt;

&lt;p&gt;TaskHandle_t _decodeTask;&lt;br&gt;
TaskHandle_t _draw_task;&lt;br&gt;
paramDecodeTask _pDecodeTask;&lt;br&gt;
paramDrawTask _pDrawTask;&lt;br&gt;
uint8_t *_mjpeg_buf;&lt;br&gt;
uint8_t _mBufIdx = 0;&lt;/p&gt;

&lt;p&gt;int32_t _inputindex = 0;&lt;br&gt;
int32_t _buf_read;&lt;br&gt;
int32_t _remain = 0;&lt;br&gt;
mjpegBuf _mjpegBufs[NUMBER_OF_DECODE_BUFFER];&lt;/p&gt;

&lt;p&gt;static int queueDrawMCU(JPEGDRAW *pDraw)&lt;br&gt;
{&lt;br&gt;
  int len = pDraw-&amp;gt;iWidth * pDraw-&amp;gt;iHeight * 2;&lt;br&gt;
  JPEGDRAW *j = &amp;amp;jpegdraws[_draw_queue_cnt % NUMBER_OF_DRAW_BUFFER];&lt;br&gt;
  j-&amp;gt;x = pDraw-&amp;gt;x;&lt;br&gt;
  j-&amp;gt;y = pDraw-&amp;gt;y;&lt;br&gt;
  j-&amp;gt;iWidth = pDraw-&amp;gt;iWidth;&lt;br&gt;
  j-&amp;gt;iHeight = pDraw-&amp;gt;iHeight;&lt;br&gt;
  memcpy(j-&amp;gt;pPixels, pDraw-&amp;gt;pPixels, len);&lt;/p&gt;

&lt;p&gt;// log_i("queueDrawMCU start.");&lt;br&gt;
  ++_draw_queue_cnt;&lt;br&gt;
  xQueueSend(_xqh, &amp;amp;j, portMAX_DELAY);&lt;br&gt;
  // log_i("queueDrawMCU end.");&lt;/p&gt;

&lt;p&gt;return 1;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;static void decode_task(void *arg)&lt;br&gt;
{&lt;br&gt;
  paramDecodeTask *p = (paramDecodeTask *)arg;&lt;br&gt;
  mjpegBuf *mBuf;&lt;br&gt;
  log_i("decode_task start.");&lt;br&gt;
  while (xQueueReceive(p-&amp;gt;xqh, &amp;amp;mBuf, portMAX_DELAY))&lt;br&gt;
  {&lt;br&gt;
    // log_i("mBuf-&amp;gt;size: %d", mBuf-&amp;gt;size);&lt;br&gt;
    // log_i("mBuf-&amp;gt;buf start: %X %X, end: %X, %X.", mBuf-&amp;gt;buf[0], mBuf-&amp;gt;buf[1], mBuf-&amp;gt;buf[mBuf-&amp;gt;size - 2], mBuf-&amp;gt;buf[mBuf-&amp;gt;size - 1]);&lt;br&gt;
    unsigned long s = millis();&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_jpegDec.openRAM(mBuf-&amp;gt;buf, mBuf-&amp;gt;size, p-&amp;gt;drawFunc);

// _jpegDec.setMaxOutputSize(MAXOUTPUTSIZE);
if (_useBigEndian)
{
  _jpegDec.setPixelType(RGB565_BIG_ENDIAN);
}
_jpegDec.setMaxOutputSize(MAXOUTPUTSIZE);
_jpegDec.decode(0, 0, 0);
_jpegDec.close();

total_decode_video_ms += millis() - s;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  vQueueDelete(p-&amp;gt;xqh);&lt;br&gt;
  log_i("decode_task end.");&lt;br&gt;
  vTaskDelete(NULL);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;static void draw_task(void *arg)&lt;br&gt;
{&lt;br&gt;
  paramDrawTask *p = (paramDrawTask *)arg;&lt;br&gt;
  JPEGDRAW *pDraw;&lt;br&gt;
  log_i("draw_task start.");&lt;br&gt;
  while (xQueueReceive(p-&amp;gt;xqh, &amp;amp;pDraw, portMAX_DELAY))&lt;br&gt;
  {&lt;br&gt;
    // log_i("draw_task work start: x: %d, y: %d, iWidth: %d, iHeight: %d.", pDraw-&amp;gt;x, pDraw-&amp;gt;y, pDraw-&amp;gt;iWidth, pDraw-&amp;gt;iHeight);&lt;br&gt;
    p-&amp;gt;drawFunc(pDraw);&lt;br&gt;
    // log_i("draw_task work end.");&lt;br&gt;
  }&lt;br&gt;
  vQueueDelete(p-&amp;gt;xqh);&lt;br&gt;
  log_i("draw_task end.");&lt;br&gt;
  vTaskDelete(NULL);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;bool mjpeg_setup(Stream *input, int32_t mjpegBufSize, JPEG_DRAW_CALLBACK *pfnDraw,&lt;br&gt;
                 bool useBigEndian, BaseType_t decodeAssignCore, BaseType_t drawAssignCore)&lt;br&gt;
{&lt;br&gt;
  _input = input;&lt;br&gt;
  _mjpegBufSize = mjpegBufSize;&lt;br&gt;
  _useBigEndian = useBigEndian;&lt;/p&gt;

&lt;p&gt;for (int i = 0; i &amp;lt; NUMBER_OF_DECODE_BUFFER; ++i)&lt;br&gt;
  {&lt;br&gt;
    _mjpegBufs[i].buf = (uint8_t *)malloc(mjpegBufSize);&lt;br&gt;
    if (_mjpegBufs[i].buf)&lt;br&gt;
    {&lt;br&gt;
      log_i("#%d decode buffer allocated.", i);&lt;br&gt;
    }&lt;br&gt;
    else&lt;br&gt;
    {&lt;br&gt;
      log_e("#%d decode buffer allocat failed.", i);&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
  _mjpeg_buf = _mjpegBufs[_mBufIdx].buf;&lt;/p&gt;

&lt;p&gt;if (!_read_buf)&lt;br&gt;
  {&lt;br&gt;
    _read_buf = (uint8_t *)malloc(READ_BUFFER_SIZE);&lt;br&gt;
  }&lt;br&gt;
  if (_read_buf)&lt;br&gt;
  {&lt;br&gt;
    log_i("Read buffer allocated.");&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;_xqh = xQueueCreate(NUMBER_OF_DRAW_BUFFER, sizeof(JPEGDRAW));&lt;br&gt;
  _pDrawTask.xqh = _xqh;&lt;br&gt;
  _pDrawTask.drawFunc = pfnDraw;&lt;br&gt;
  _pDecodeTask.xqh = xQueueCreate(NUMBER_OF_DECODE_BUFFER, sizeof(mjpegBuf));&lt;br&gt;
  _pDecodeTask.drawFunc = queueDrawMCU;&lt;/p&gt;

&lt;p&gt;xTaskCreatePinnedToCore(&lt;br&gt;
      (TaskFunction_t)decode_task,&lt;br&gt;
      (const char *const)"MJPEG decode Task",&lt;br&gt;
      (const uint32_t)2000,&lt;br&gt;
      (void *const)&amp;amp;_pDecodeTask,&lt;br&gt;
      (UBaseType_t)configMAX_PRIORITIES - 1,&lt;br&gt;
      (TaskHandle_t *const)&amp;amp;_decodeTask,&lt;br&gt;
      (const BaseType_t)decodeAssignCore);&lt;br&gt;
  xTaskCreatePinnedToCore(&lt;br&gt;
      (TaskFunction_t)draw_task,&lt;br&gt;
      (const char *const)"MJPEG Draw Task",&lt;br&gt;
      (const uint32_t)2000,&lt;br&gt;
      (void *const)&amp;amp;_pDrawTask,&lt;br&gt;
      (UBaseType_t)configMAX_PRIORITIES - 1,&lt;br&gt;
      (TaskHandle_t *const)&amp;amp;_draw_task,&lt;br&gt;
      (const BaseType_t)drawAssignCore);&lt;/p&gt;

&lt;p&gt;for (int i = 0; i &amp;lt; NUMBER_OF_DRAW_BUFFER; i++)&lt;br&gt;
  {&lt;br&gt;
    if (!jpegdraws[i].pPixels)&lt;br&gt;
    {&lt;br&gt;
      jpegdraws[i].pPixels = (uint16_t *)heap_caps_malloc(MAXOUTPUTSIZE * 16 * 16 * 2, MALLOC_CAP_DMA);&lt;br&gt;
    }&lt;br&gt;
    if (jpegdraws[i].pPixels)&lt;br&gt;
    {&lt;br&gt;
      log_i("#%d draw buffer allocated.", i);&lt;br&gt;
    }&lt;br&gt;
    else&lt;br&gt;
    {&lt;br&gt;
      log_e("#%d draw buffer allocat failed.", i);&lt;br&gt;
    }&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;return true;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;bool mjpeg_read_frame()&lt;br&gt;
{&lt;br&gt;
  if (_inputindex == 0)&lt;br&gt;
  {&lt;br&gt;
    _buf_read = _input-&amp;gt;readBytes(_read_buf, READ_BUFFER_SIZE);&lt;br&gt;
    _inputindex += _buf_read;&lt;br&gt;
  }&lt;br&gt;
  _mjpeg_buf_offset = 0;&lt;br&gt;
  int i = 0;&lt;br&gt;
  bool found_FFD8 = false;&lt;br&gt;
  while ((_buf_read &amp;gt; 0) &amp;amp;&amp;amp; (!found_FFD8))&lt;br&gt;
  {&lt;br&gt;
    i = 0;&lt;br&gt;
    while ((i &amp;lt; _buf_read) &amp;amp;&amp;amp; (!found_FFD8))&lt;br&gt;
    {&lt;br&gt;
      if ((_read_buf[i] == 0xFF) &amp;amp;&amp;amp; (_read_buf[i + 1] == 0xD8)) // JPEG header&lt;br&gt;
      {&lt;br&gt;
        // log_i("Found FFD8 at: %d.", i);&lt;br&gt;
        found_FFD8 = true;&lt;br&gt;
      }&lt;br&gt;
      ++i;&lt;br&gt;
    }&lt;br&gt;
    if (found_FFD8)&lt;br&gt;
    {&lt;br&gt;
      --i;&lt;br&gt;
    }&lt;br&gt;
    else&lt;br&gt;
    {&lt;br&gt;
      _buf_read = _input-&amp;gt;readBytes(_read_buf, READ_BUFFER_SIZE);&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
  uint8_t *_p = _read_buf + i;&lt;br&gt;
  _buf_read -= i;&lt;br&gt;
  bool found_FFD9 = false;&lt;br&gt;
  if (_buf_read &amp;gt; 0)&lt;br&gt;
  {&lt;br&gt;
    i = 3;&lt;br&gt;
    while ((_buf_read &amp;gt; 0) &amp;amp;&amp;amp; (!found_FFD9))&lt;br&gt;
    {&lt;br&gt;
      if ((_mjpeg_buf_offset &amp;gt; 0) &amp;amp;&amp;amp; (_mjpeg_buf[_mjpeg_buf_offset - 1] == 0xFF) &amp;amp;&amp;amp; (_p[0] == 0xD9)) // JPEG trailer&lt;br&gt;
      {&lt;br&gt;
        found_FFD9 = true;&lt;br&gt;
      }&lt;br&gt;
      else&lt;br&gt;
      {&lt;br&gt;
        while ((i &amp;lt; _buf_read) &amp;amp;&amp;amp; (!found_FFD9))&lt;br&gt;
        {&lt;br&gt;
          if ((_p[i] == 0xFF) &amp;amp;&amp;amp; (_p[i + 1] == 0xD9)) // JPEG trailer&lt;br&gt;
          {&lt;br&gt;
            found_FFD9 = true;&lt;br&gt;
            ++i;&lt;br&gt;
          }&lt;br&gt;
          ++i;&lt;br&gt;
        }&lt;br&gt;
      }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  // log_i("i: %d", i);
  memcpy(_mjpeg_buf + _mjpeg_buf_offset, _p, i);
  _mjpeg_buf_offset += i;
  int32_t o = _buf_read - i;
  if (o &amp;gt; 0)
  {
    // log_i("o: %d", o);
    memcpy(_read_buf, _p + i, o);
    _buf_read = _input-&amp;gt;readBytes(_read_buf + o, READ_BUFFER_SIZE - o);
    _p = _read_buf;
    _inputindex += _buf_read;
    _buf_read += o;
    // log_i("_buf_read: %d", _buf_read);
  }
  else
  {
    _buf_read = _input-&amp;gt;readBytes(_read_buf, READ_BUFFER_SIZE);
    _p = _read_buf;
    _inputindex += _buf_read;
  }
  i = 0;
}
if (found_FFD9)
{
  // log_i("Found FFD9 at: %d.", _mjpeg_buf_offset);
  if (_mjpeg_buf_offset &amp;gt; _mjpegBufSize)
  {
    log_e("_mjpeg_buf_offset(%d) &amp;gt; _mjpegBufSize (%d)", _mjpeg_buf_offset, _mjpegBufSize);
  }
  return true;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;return false;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;bool mjpeg_draw_frame()&lt;br&gt;
{&lt;br&gt;
  mjpegBuf *mBuf = &amp;amp;_mjpegBufs[_mBufIdx];&lt;br&gt;
  mBuf-&amp;gt;size = _mjpeg_buf_offset;&lt;br&gt;
  // log_i("_mjpegBufs[%d].size: %d.", _mBufIdx, _mjpegBufs[_mBufIdx].size);&lt;br&gt;
  // log_i("_mjpegBufs[%d].buf start: %X %X, end: %X, %X.", _mjpegBufs, _mjpegBufs[_mBufId].buf[0], _mjpegBufs[_mBufIdx].buf[1], _mjpegBufs[_mBufIdx].buf[_mjpeg_buf_offset - 2], _mjpegBufs[_mBufIdx].buf[_mjpeg_buf_offset - 1]);&lt;br&gt;
  xQueueSend(_pDecodeTask.xqh, &amp;amp;mBuf, portMAX_DELAY);&lt;br&gt;
  ++_mBufIdx;&lt;br&gt;
  if (_mBufIdx &amp;gt;= NUMBER_OF_DECODE_BUFFER)&lt;br&gt;
  {&lt;br&gt;
    _mBufIdx = 0;&lt;br&gt;
  }&lt;br&gt;
  _mjpeg_buf = _mjpegBufs[_mBufIdx].buf;&lt;br&gt;
  // log_i("queue decode_task end");&lt;/p&gt;

&lt;p&gt;return true;&lt;br&gt;
}&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>career</category>
      <category>html</category>
      <category>java</category>
    </item>
    <item>
      <title>portable console 3d printer</title>
      <dc:creator>jay jordan</dc:creator>
      <pubDate>Mon, 25 Dec 2023 16:06:06 +0000</pubDate>
      <link>https://dev.to/jayjo87/portable-console-3d-printer-47o9</link>
      <guid>https://dev.to/jayjo87/portable-console-3d-printer-47o9</guid>
      <description>&lt;h1&gt;
  
  
  define X_STEP_PIN      54
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_DIR_PIN       55
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_ENABLE_PIN       38
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_MIN_PIN           3
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_MAX_PIN           2
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_STEP_PIN         60
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_DIR_PIN          61
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_ENABLE_PIN       56
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_MIN_PIN          14
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_MAX_PIN          15
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_STEP_PIN         46
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_DIR_PIN          48
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_ENABLE_PIN       62
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_MIN_PIN          18
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_MAX_PIN          19
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_STEP_PIN         26
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_DIR_PIN          28
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_ENABLE_PIN       24
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_STEP_PIN     36
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_DIR_PIN          34
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_ENABLE_PIN       30
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define SDPOWER            -1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define SDSS               53
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define LED_PIN            13
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define FAN_PIN         9
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define PS_ON_PIN          12
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define KILL_PIN           -1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define HEATER_0_PIN       10
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define HEATER_1_PIN    8
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TEMP_0_PIN          13   // ANALOG NUMBERING
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TEMP_1_PIN          14   // ANALOG NUMBERING
&lt;/h1&gt;

&lt;p&gt;void setup() {&lt;/p&gt;

&lt;p&gt;pinMode(FAN_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(HEATER_0_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(HEATER_1_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(LED_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_DIR_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_ENABLE_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_DIR_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_ENABLE_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_DIR_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_ENABLE_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_DIR_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_ENABLE_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_DIR_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_ENABLE_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;digitalWrite(X_ENABLE_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_ENABLE_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_ENABLE_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_ENABLE_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_ENABLE_PIN , LOW);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;void loop () {&lt;/p&gt;

&lt;p&gt;if (millis() %1000 &amp;lt;500)&lt;/p&gt;

&lt;p&gt;digitalWrite(LED_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;else&lt;/p&gt;

&lt;p&gt;digitalWrite(LED_PIN, LOW);&lt;/p&gt;

&lt;p&gt;if (millis() %1000 &amp;lt;300) {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, LOW);&lt;/p&gt;

&lt;p&gt;} else if (millis() %1000 &amp;lt;600) {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, LOW);&lt;/p&gt;

&lt;p&gt;} else  {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;if (millis() %10000 &amp;lt;5000) {&lt;/p&gt;

&lt;p&gt;digitalWrite(X_DIR_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_DIR_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_DIR_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_DIR_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_DIR_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;else {&lt;/p&gt;

&lt;p&gt;digitalWrite(X_DIR_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_DIR_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_DIR_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_DIR_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_DIR_PIN , LOW);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;digitalWrite(X_STEP_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_STEP_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_STEP_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_STEP_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_STEP_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;delay(1);&lt;/p&gt;

&lt;p&gt;digitalWrite(X_STEP_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_STEP_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_STEP_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_STEP_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_STEP_PIN , LOW);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;This code should activate all the steppers, fans, and heaters. The only problem with this code is that it does not activate both z-axis steppers; it only activates one. If you encounter any problems with any of the components, try isolating them and only running them in the code. If you would like to test the z-axis and thermistor, download the following codes:&lt;/p&gt;



&lt;h1&gt;
  
  
  ifndef THERMISTORTABLES_H_
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define THERMISTORTABLES_H_
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define OVERSAMPLENR 16
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 1) || (THERMISTORHEATER_1 == 1)  || (THERMISTORHEATER_2 == 1) || (THERMISTORBED == 1) //100k bed thermistor
&lt;/h1&gt;

&lt;p&gt;const short temptable_1[][2] PROGMEM = {&lt;br&gt;
{       23*OVERSAMPLENR ,       300     },&lt;br&gt;
{       25*OVERSAMPLENR ,       295     },&lt;br&gt;
{       27*OVERSAMPLENR ,       290     },&lt;br&gt;
{       28*OVERSAMPLENR ,       285     },&lt;br&gt;
{       31*OVERSAMPLENR ,       280     },&lt;br&gt;
{       33*OVERSAMPLENR ,       275     },&lt;br&gt;
{       35*OVERSAMPLENR ,       270     },&lt;br&gt;
{       38*OVERSAMPLENR ,       265     },&lt;br&gt;
{       41*OVERSAMPLENR ,       260     },&lt;br&gt;
{       44*OVERSAMPLENR ,       255     },&lt;br&gt;
{       48*OVERSAMPLENR ,       250     },&lt;br&gt;
{       52*OVERSAMPLENR ,       245     },&lt;br&gt;
{       56*OVERSAMPLENR ,       240     },&lt;br&gt;
{       61*OVERSAMPLENR ,       235     },&lt;br&gt;
{       66*OVERSAMPLENR ,       230     },&lt;br&gt;
{       71*OVERSAMPLENR ,       225     },&lt;br&gt;
{       78*OVERSAMPLENR ,       220     },&lt;br&gt;
{       84*OVERSAMPLENR ,       215     },&lt;br&gt;
{       92*OVERSAMPLENR ,       210     },&lt;br&gt;
{       100*OVERSAMPLENR        ,       205     },&lt;br&gt;
{       109*OVERSAMPLENR        ,       200     },&lt;br&gt;
{       120*OVERSAMPLENR        ,       195     },&lt;br&gt;
{       131*OVERSAMPLENR        ,       190     },&lt;br&gt;
{       143*OVERSAMPLENR        ,       185     },&lt;br&gt;
{       156*OVERSAMPLENR        ,       180     },&lt;br&gt;
{       171*OVERSAMPLENR        ,       175     },&lt;br&gt;
{       187*OVERSAMPLENR        ,       170     },&lt;br&gt;
{       205*OVERSAMPLENR        ,       165     },&lt;br&gt;
{       224*OVERSAMPLENR        ,       160     },&lt;br&gt;
{       245*OVERSAMPLENR        ,       155     },&lt;br&gt;
{       268*OVERSAMPLENR        ,       150     },&lt;br&gt;
{       293*OVERSAMPLENR        ,       145     },&lt;br&gt;
{       320*OVERSAMPLENR        ,       140     },&lt;br&gt;
{       348*OVERSAMPLENR        ,       135     },&lt;br&gt;
{       379*OVERSAMPLENR        ,       130     },&lt;br&gt;
{       411*OVERSAMPLENR        ,       125     },&lt;br&gt;
{       445*OVERSAMPLENR        ,       120     },&lt;br&gt;
{       480*OVERSAMPLENR        ,       115     },&lt;br&gt;
{       516*OVERSAMPLENR        ,       110     },&lt;br&gt;
{       553*OVERSAMPLENR        ,       105     },&lt;br&gt;
{       591*OVERSAMPLENR        ,       100     },&lt;br&gt;
{       628*OVERSAMPLENR        ,       95      },&lt;br&gt;
{       665*OVERSAMPLENR        ,       90      },&lt;br&gt;
{       702*OVERSAMPLENR        ,       85      },&lt;br&gt;
{       737*OVERSAMPLENR        ,       80      },&lt;br&gt;
{       770*OVERSAMPLENR        ,       75      },&lt;br&gt;
{       801*OVERSAMPLENR        ,       70      },&lt;br&gt;
{       830*OVERSAMPLENR        ,       65      },&lt;br&gt;
{       857*OVERSAMPLENR        ,       60      },&lt;br&gt;
{       881*OVERSAMPLENR        ,       55      },&lt;br&gt;
{       903*OVERSAMPLENR        ,       50      },&lt;br&gt;
{       922*OVERSAMPLENR        ,       45      },&lt;br&gt;
{       939*OVERSAMPLENR        ,       40      },&lt;br&gt;
{       954*OVERSAMPLENR        ,       35      },&lt;br&gt;
{       966*OVERSAMPLENR        ,       30      },&lt;br&gt;
{       977*OVERSAMPLENR        ,       25      },&lt;br&gt;
{       985*OVERSAMPLENR        ,       20      },&lt;br&gt;
{       993*OVERSAMPLENR        ,       15      },&lt;br&gt;
{       999*OVERSAMPLENR        ,       10      },&lt;br&gt;
{       1004*OVERSAMPLENR       ,       5       },&lt;br&gt;
{       1008*OVERSAMPLENR       ,       0       } //safety&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 2) || (THERMISTORHEATER_1 == 2) || (THERMISTORHEATER_2 == 2) || (THERMISTORBED == 2) //200k bed thermistor
&lt;/h1&gt;

&lt;p&gt;const short temptable_2[][2] PROGMEM = {&lt;br&gt;
  {1*OVERSAMPLENR, 848},&lt;br&gt;
  {54*OVERSAMPLENR, 275},&lt;br&gt;
  {107*OVERSAMPLENR, 228},&lt;br&gt;
  {160*OVERSAMPLENR, 202},&lt;br&gt;
  {213*OVERSAMPLENR, 185},&lt;br&gt;
  {266*OVERSAMPLENR, 171},&lt;br&gt;
  {319*OVERSAMPLENR, 160},&lt;br&gt;
  {372*OVERSAMPLENR, 150},&lt;br&gt;
  {425*OVERSAMPLENR, 141},&lt;br&gt;
  {478*OVERSAMPLENR, 133},&lt;br&gt;
  {531*OVERSAMPLENR, 125},&lt;br&gt;
  {584*OVERSAMPLENR, 118},&lt;br&gt;
  {637*OVERSAMPLENR, 110},&lt;br&gt;
  {690*OVERSAMPLENR, 103},&lt;br&gt;
  {743*OVERSAMPLENR, 95},&lt;br&gt;
  {796*OVERSAMPLENR, 86},&lt;br&gt;
  {849*OVERSAMPLENR, 77},&lt;br&gt;
  {902*OVERSAMPLENR, 65},&lt;br&gt;
  {955*OVERSAMPLENR, 49},&lt;br&gt;
  {1008*OVERSAMPLENR, 17},&lt;br&gt;
  {1020*OVERSAMPLENR, 0} //safety&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 3) || (THERMISTORHEATER_1 == 3) || (THERMISTORHEATER_2 == 3) || (THERMISTORBED == 3) //mendel-parts
&lt;/h1&gt;

&lt;p&gt;const short temptable_3[][2] PROGMEM = {&lt;br&gt;
               {1*OVERSAMPLENR,864},&lt;br&gt;
               {21*OVERSAMPLENR,300},&lt;br&gt;
               {25*OVERSAMPLENR,290},&lt;br&gt;
               {29*OVERSAMPLENR,280},&lt;br&gt;
               {33*OVERSAMPLENR,270},&lt;br&gt;
               {39*OVERSAMPLENR,260},&lt;br&gt;
               {46*OVERSAMPLENR,250},&lt;br&gt;
               {54*OVERSAMPLENR,240},&lt;br&gt;
               {64*OVERSAMPLENR,230},&lt;br&gt;
               {75*OVERSAMPLENR,220},&lt;br&gt;
               {90*OVERSAMPLENR,210},&lt;br&gt;
               {107*OVERSAMPLENR,200},&lt;br&gt;
               {128*OVERSAMPLENR,190},&lt;br&gt;
               {154*OVERSAMPLENR,180},&lt;br&gt;
               {184*OVERSAMPLENR,170},&lt;br&gt;
               {221*OVERSAMPLENR,160},&lt;br&gt;
               {265*OVERSAMPLENR,150},&lt;br&gt;
               {316*OVERSAMPLENR,140},&lt;br&gt;
               {375*OVERSAMPLENR,130},&lt;br&gt;
               {441*OVERSAMPLENR,120},&lt;br&gt;
               {513*OVERSAMPLENR,110},&lt;br&gt;
               {588*OVERSAMPLENR,100},&lt;br&gt;
               {734*OVERSAMPLENR,80},&lt;br&gt;
               {856*OVERSAMPLENR,60},&lt;br&gt;
               {938*OVERSAMPLENR,40},&lt;br&gt;
               {986*OVERSAMPLENR,20},&lt;br&gt;
               {1008*OVERSAMPLENR,0},&lt;br&gt;
               {1018*OVERSAMPLENR,-20}&lt;br&gt;
       };&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 4) || (THERMISTORHEATER_1 == 4) || (THERMISTORHEATER_2 == 4) || (THERMISTORBED == 4) //10k thermistor
&lt;/h1&gt;

&lt;p&gt;const short temptable_4[][2] PROGMEM = {&lt;br&gt;
  {1*OVERSAMPLENR, 430},&lt;br&gt;
  {54*OVERSAMPLENR, 137},&lt;br&gt;
  {107*OVERSAMPLENR, 107},&lt;br&gt;
  {160*OVERSAMPLENR, 91},&lt;br&gt;
  {213*OVERSAMPLENR, 80},&lt;br&gt;
  {266*OVERSAMPLENR, 71},&lt;br&gt;
  {319*OVERSAMPLENR, 64},&lt;br&gt;
  {372*OVERSAMPLENR, 57},&lt;br&gt;
  {425*OVERSAMPLENR, 51},&lt;br&gt;
  {478*OVERSAMPLENR, 46},&lt;br&gt;
  {531*OVERSAMPLENR, 41},&lt;br&gt;
  {584*OVERSAMPLENR, 35},&lt;br&gt;
  {637*OVERSAMPLENR, 30},&lt;br&gt;
  {690*OVERSAMPLENR, 25},&lt;br&gt;
  {743*OVERSAMPLENR, 20},&lt;br&gt;
  {796*OVERSAMPLENR, 14},&lt;br&gt;
  {849*OVERSAMPLENR, 7},&lt;br&gt;
  {902*OVERSAMPLENR, 0},&lt;br&gt;
  {955*OVERSAMPLENR, -11},&lt;br&gt;
  {1008*OVERSAMPLENR, -35}&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 5) || (THERMISTORHEATER_1 == 5) || (THERMISTORHEATER_2 == 5) || (THERMISTORBED == 5) //100k ParCan thermistor (104GT-2)
&lt;/h1&gt;

&lt;p&gt;const short temptable_5[][2] PROGMEM = {&lt;br&gt;
{1*OVERSAMPLENR, 713},&lt;br&gt;
{18*OVERSAMPLENR, 316},&lt;br&gt;
{35*OVERSAMPLENR, 266},&lt;br&gt;
{52*OVERSAMPLENR, 239},&lt;br&gt;
{69*OVERSAMPLENR, 221},&lt;br&gt;
{86*OVERSAMPLENR, 208},&lt;br&gt;
{103*OVERSAMPLENR, 197},&lt;br&gt;
{120*OVERSAMPLENR, 188},&lt;br&gt;
{137*OVERSAMPLENR, 181},&lt;br&gt;
{154*OVERSAMPLENR, 174},&lt;br&gt;
{171*OVERSAMPLENR, 169},&lt;br&gt;
{188*OVERSAMPLENR, 163},&lt;br&gt;
{205*OVERSAMPLENR, 159},&lt;br&gt;
{222*OVERSAMPLENR, 154},&lt;br&gt;
{239*OVERSAMPLENR, 150},&lt;br&gt;
{256*OVERSAMPLENR, 147},&lt;br&gt;
{273*OVERSAMPLENR, 143},&lt;br&gt;
{290*OVERSAMPLENR, 140},&lt;br&gt;
{307*OVERSAMPLENR, 136},&lt;br&gt;
{324*OVERSAMPLENR, 133},&lt;br&gt;
{341*OVERSAMPLENR, 130},&lt;br&gt;
{358*OVERSAMPLENR, 128},&lt;br&gt;
{375*OVERSAMPLENR, 125},&lt;br&gt;
{392*OVERSAMPLENR, 122},&lt;br&gt;
{409*OVERSAMPLENR, 120},&lt;br&gt;
{426*OVERSAMPLENR, 117},&lt;br&gt;
{443*OVERSAMPLENR, 115},&lt;br&gt;
{460*OVERSAMPLENR, 112},&lt;br&gt;
{477*OVERSAMPLENR, 110},&lt;br&gt;
{494*OVERSAMPLENR, 108},&lt;br&gt;
{511*OVERSAMPLENR, 106},&lt;br&gt;
{528*OVERSAMPLENR, 103},&lt;br&gt;
{545*OVERSAMPLENR, 101},&lt;br&gt;
{562*OVERSAMPLENR, 99},&lt;br&gt;
{579*OVERSAMPLENR, 97},&lt;br&gt;
{596*OVERSAMPLENR, 95},&lt;br&gt;
{613*OVERSAMPLENR, 92},&lt;br&gt;
{630*OVERSAMPLENR, 90},&lt;br&gt;
{647*OVERSAMPLENR, 88},&lt;br&gt;
{664*OVERSAMPLENR, 86},&lt;br&gt;
{681*OVERSAMPLENR, 84},&lt;br&gt;
{698*OVERSAMPLENR, 81},&lt;br&gt;
{715*OVERSAMPLENR, 79},&lt;br&gt;
{732*OVERSAMPLENR, 77},&lt;br&gt;
{749*OVERSAMPLENR, 75},&lt;br&gt;
{766*OVERSAMPLENR, 72},&lt;br&gt;
{783*OVERSAMPLENR, 70},&lt;br&gt;
{800*OVERSAMPLENR, 67},&lt;br&gt;
{817*OVERSAMPLENR, 64},&lt;br&gt;
{834*OVERSAMPLENR, 61},&lt;br&gt;
{851*OVERSAMPLENR, 58},&lt;br&gt;
{868*OVERSAMPLENR, 55},&lt;br&gt;
{885*OVERSAMPLENR, 52},&lt;br&gt;
{902*OVERSAMPLENR, 48},&lt;br&gt;
{919*OVERSAMPLENR, 44},&lt;br&gt;
{936*OVERSAMPLENR, 40},&lt;br&gt;
{953*OVERSAMPLENR, 34},&lt;br&gt;
{970*OVERSAMPLENR, 28},&lt;br&gt;
{987*OVERSAMPLENR, 20},&lt;br&gt;
{1004*OVERSAMPLENR, 8},&lt;br&gt;
{1021*OVERSAMPLENR, 0}&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 6) || (THERMISTORHEATER_1 == 6) || (THERMISTORHEATER_2 == 6) || (THERMISTORBED == 6) // 100k Epcos thermistor
&lt;/h1&gt;

&lt;p&gt;const short temptable_6[][2] PROGMEM = {&lt;br&gt;
  {28*OVERSAMPLENR, 250},&lt;br&gt;
  {31*OVERSAMPLENR, 245},&lt;br&gt;
  {35*OVERSAMPLENR, 240},&lt;br&gt;
  {39*OVERSAMPLENR, 235},&lt;br&gt;
  {42*OVERSAMPLENR, 230},&lt;br&gt;
  {44*OVERSAMPLENR, 225},&lt;br&gt;
  {49*OVERSAMPLENR, 220},&lt;br&gt;
  {53*OVERSAMPLENR, 215},&lt;br&gt;
  {62*OVERSAMPLENR, 210},&lt;br&gt;
  {73*OVERSAMPLENR, 205},&lt;br&gt;
  {72*OVERSAMPLENR, 200},&lt;br&gt;
  {94*OVERSAMPLENR, 190},&lt;br&gt;
  {102*OVERSAMPLENR, 185},&lt;br&gt;
  {116*OVERSAMPLENR, 170},&lt;br&gt;
  {143*OVERSAMPLENR, 160},&lt;br&gt;
  {183*OVERSAMPLENR, 150},&lt;br&gt;
  {223*OVERSAMPLENR, 140},&lt;br&gt;
  {270*OVERSAMPLENR, 130},&lt;br&gt;
  {318*OVERSAMPLENR, 120},&lt;br&gt;
  {383*OVERSAMPLENR, 110},&lt;br&gt;
  {413*OVERSAMPLENR, 105},&lt;br&gt;
  {439*OVERSAMPLENR, 100},&lt;br&gt;
  {484*OVERSAMPLENR, 95},&lt;br&gt;
  {513*OVERSAMPLENR, 90},&lt;br&gt;
  {607*OVERSAMPLENR, 80},&lt;br&gt;
  {664*OVERSAMPLENR, 70},&lt;br&gt;
  {781*OVERSAMPLENR, 60},&lt;br&gt;
  {810*OVERSAMPLENR, 55},&lt;br&gt;
  {849*OVERSAMPLENR, 50},&lt;br&gt;
  {914*OVERSAMPLENR, 45},&lt;br&gt;
  {914*OVERSAMPLENR, 40},&lt;br&gt;
  {935*OVERSAMPLENR, 35},&lt;br&gt;
  {954*OVERSAMPLENR, 30},&lt;br&gt;
  {970*OVERSAMPLENR, 25},&lt;br&gt;
  {978*OVERSAMPLENR, 22},&lt;br&gt;
  {1008*OVERSAMPLENR, 3}&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 7) || (THERMISTORHEATER_1 == 7) || (THERMISTORHEATER_2 == 7) || (THERMISTORBED == 7) // 100k Honeywell 135-104LAG-J01
&lt;/h1&gt;

&lt;p&gt;const short temptable_7[][2] PROGMEM = {&lt;br&gt;
  {46*OVERSAMPLENR, 270},&lt;br&gt;
  {50*OVERSAMPLENR, 265},&lt;br&gt;
  {54*OVERSAMPLENR, 260},&lt;br&gt;
  {58*OVERSAMPLENR, 255},&lt;br&gt;
  {62*OVERSAMPLENR, 250},&lt;br&gt;
  {67*OVERSAMPLENR, 245},&lt;br&gt;
  {72*OVERSAMPLENR, 240},&lt;br&gt;
  {79*OVERSAMPLENR, 235},&lt;br&gt;
  {85*OVERSAMPLENR, 230},&lt;br&gt;
  {91*OVERSAMPLENR, 225},&lt;br&gt;
  {99*OVERSAMPLENR, 220},&lt;br&gt;
  {107*OVERSAMPLENR, 215},&lt;br&gt;
  {116*OVERSAMPLENR, 210},&lt;br&gt;
  {126*OVERSAMPLENR, 205},&lt;br&gt;
  {136*OVERSAMPLENR, 200},&lt;br&gt;
  {149*OVERSAMPLENR, 195},&lt;br&gt;
  {160*OVERSAMPLENR, 190},&lt;br&gt;
  {175*OVERSAMPLENR, 185},&lt;br&gt;
  {191*OVERSAMPLENR, 180},&lt;br&gt;
  {209*OVERSAMPLENR, 175},&lt;br&gt;
  {224*OVERSAMPLENR, 170},&lt;br&gt;
  {246*OVERSAMPLENR, 165},&lt;br&gt;
  {267*OVERSAMPLENR, 160},&lt;br&gt;
  {293*OVERSAMPLENR, 155},&lt;br&gt;
  {316*OVERSAMPLENR, 150},&lt;br&gt;
  {340*OVERSAMPLENR, 145},&lt;br&gt;
  {364*OVERSAMPLENR, 140},&lt;br&gt;
  {396*OVERSAMPLENR, 135},&lt;br&gt;
  {425*OVERSAMPLENR, 130},&lt;br&gt;
  {460*OVERSAMPLENR, 125},&lt;br&gt;
  {489*OVERSAMPLENR, 120},&lt;br&gt;
  {526*OVERSAMPLENR, 115},&lt;br&gt;
  {558*OVERSAMPLENR, 110},&lt;br&gt;
  {591*OVERSAMPLENR, 105},&lt;br&gt;
  {628*OVERSAMPLENR, 100},&lt;br&gt;
  {660*OVERSAMPLENR, 95},&lt;br&gt;
  {696*OVERSAMPLENR, 90},&lt;br&gt;
  {733*OVERSAMPLENR, 85},&lt;br&gt;
  {761*OVERSAMPLENR, 80},&lt;br&gt;
  {794*OVERSAMPLENR, 75},&lt;br&gt;
  {819*OVERSAMPLENR, 70},&lt;br&gt;
  {847*OVERSAMPLENR, 65},&lt;br&gt;
  {870*OVERSAMPLENR, 60},&lt;br&gt;
  {892*OVERSAMPLENR, 55},&lt;br&gt;
  {911*OVERSAMPLENR, 50},&lt;br&gt;
  {929*OVERSAMPLENR, 45},&lt;br&gt;
  {944*OVERSAMPLENR, 40},&lt;br&gt;
  {959*OVERSAMPLENR, 35},&lt;br&gt;
  {971*OVERSAMPLENR, 30},&lt;br&gt;
  {981*OVERSAMPLENR, 25},&lt;br&gt;
  {989*OVERSAMPLENR, 20},&lt;br&gt;
  {994*OVERSAMPLENR, 15},&lt;br&gt;
  {1001*OVERSAMPLENR, 10},&lt;br&gt;
  {1005*OVERSAMPLENR, 5}&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define &lt;em&gt;TT_NAME(_N) temptable&lt;/em&gt; ## _N
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TT_NAME(_N) _TT_NAME(_N)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef THERMISTORHEATER_0
&lt;/h1&gt;

&lt;p&gt;#define heater_0_temptable TT_NAME(THERMISTORHEATER_0)&lt;br&gt;
 #define heater_0_temptable_len (sizeof(heater_0_temptable)/sizeof(*heater_0_temptable))&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef HEATER_0_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#error No heater 0 thermistor table specified&lt;/p&gt;

&lt;h1&gt;
  
  
  else  // HEATER_0_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#define heater_0_temptable 0&lt;br&gt;
 #define heater_0_temptable_len 0&lt;/p&gt;

&lt;h1&gt;
  
  
  endif // HEATER_0_USES_THERMISTOR
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef THERMISTORHEATER_1
&lt;/h1&gt;

&lt;p&gt;#define heater_1_temptable TT_NAME(THERMISTORHEATER_1)&lt;br&gt;
 #define heater_1_temptable_len (sizeof(heater_1_temptable)/sizeof(*heater_1_temptable))&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef HEATER_1_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#error No heater 1 thermistor table specified&lt;/p&gt;

&lt;h1&gt;
  
  
  else  // HEATER_1_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#define heater_1_temptable 0&lt;br&gt;
 #define heater_1_temptable_len 0&lt;/p&gt;

&lt;h1&gt;
  
  
  endif // HEATER_1_USES_THERMISTOR
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef THERMISTORHEATER_2
&lt;/h1&gt;

&lt;p&gt;#define heater_2_temptable TT_NAME(THERMISTORHEATER_2)&lt;br&gt;
 #define heater_2_temptable_len (sizeof(heater_2_temptable)/sizeof(*heater_2_temptable))&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef HEATER_2_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#error No heater 2 thermistor table specified&lt;/p&gt;

&lt;h1&gt;
  
  
  else  // HEATER_2_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#define heater_2_temptable 0&lt;br&gt;
 #define heater_2_temptable_len 0&lt;/p&gt;

&lt;h1&gt;
  
  
  endif // HEATER_2_USES_THERMISTOR
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef THERMISTORBED
&lt;/h1&gt;

&lt;p&gt;#define bedtemptable TT_NAME(THERMISTORBED)&lt;br&gt;
 #define bedtemptable_len (sizeof(bedtemptable)/sizeof(*bedtemptable))&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef BED_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#error No bed thermistor table specified&lt;/p&gt;

&lt;h1&gt;
  
  
  endif // BED_USES_THERMISTOR
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif //THERMISTORTABLES_H_
&lt;/h1&gt;



&lt;h1&gt;
  
  
  include "thermistortables.h"
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_STEP_PIN         54
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_DIR_PIN          55
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_ENABLE_PIN       38
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_MIN_PIN           3
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_MAX_PIN           2
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_STEP_PIN         60
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_DIR_PIN          61
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_ENABLE_PIN       56
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_MIN_PIN          14
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_MAX_PIN          15
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_STEP_PIN         46
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_DIR_PIN          48
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_ENABLE_PIN       62
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_MIN_PIN          18
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_MAX_PIN          19
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_STEP_PIN         26
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_DIR_PIN          28
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_ENABLE_PIN       24
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_STEP_PIN         36
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_DIR_PIN          34
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_ENABLE_PIN       30
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define SDPOWER            -1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define EXTRUDERS 3
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TEMP_SENSOR_AD595_OFFSET 0.0
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TEMP_SENSOR_AD595_GAIN   1.0
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define THERMISTORHEATER_0 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define THERMISTORHEATER_1 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define THERMISTORHEATER_2 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define HEATER_0_USES_THERMISTOR 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define HEATER_1_USES_THERMISTOR 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define HEATER_2_USES_THERMISTOR 1
&lt;/h1&gt;

&lt;p&gt;static void *heater_ttbl_map[EXTRUDERS] = { (void *)heater_0_temptable&lt;/p&gt;

&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 1
&lt;/h1&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                       , (void *)heater_1_temptable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;
&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 2
&lt;/h1&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                       , (void *)heater_2_temptable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;
&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 3
&lt;/h1&gt;

&lt;p&gt;#error Unsupported number of extruders&lt;/p&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;};&lt;/p&gt;

&lt;p&gt;static int heater_ttbllen_map[EXTRUDERS] = { heater_0_temptable_len&lt;/p&gt;
&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 1
&lt;/h1&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                        , heater_1_temptable_len
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;
&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 2
&lt;/h1&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                        , heater_2_temptable_len
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;
&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 3
&lt;/h1&gt;

&lt;p&gt;#error Unsupported number of extruders&lt;/p&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;};&lt;/p&gt;

&lt;p&gt;#define PGM_RD_W(x)   (short)pgm_read_word(&amp;amp;x)&lt;/p&gt;
&lt;h1&gt;
  
  
  define SDSS               53
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LED_PIN            13
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define FAN_PIN            9
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define PS_ON_PIN          12
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define KILL_PIN           -1
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define HEATER_0_PIN       10
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define HEATER_1_PIN       8
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define TEMP_0_PIN         15   // ANALOG NUMBERING
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define TEMP_1_PIN         14   // ANALOG NUMBERING
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define TEMP_2_PIN         13   // ANALOG NUMBERING
&lt;/h1&gt;

&lt;p&gt;void setup() {&lt;/p&gt;

&lt;p&gt;pinMode(TEMP_0_PIN  , INPUT);&lt;/p&gt;

&lt;p&gt;pinMode(TEMP_1_PIN  , INPUT);&lt;/p&gt;

&lt;p&gt;pinMode(TEMP_2_PIN  , INPUT);&lt;/p&gt;

&lt;p&gt;pinMode(FAN_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(HEATER_0_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(HEATER_1_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(LED_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_DIR_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_ENABLE_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_DIR_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_ENABLE_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_DIR_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_ENABLE_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_DIR_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_ENABLE_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_DIR_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_ENABLE_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;digitalWrite(X_ENABLE_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_ENABLE_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_ENABLE_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_ENABLE_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_ENABLE_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;Serial.begin(115200);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;float analog2temp(int raw, uint8_t e) {&lt;/p&gt;

&lt;p&gt;#ifdef HEATER_0_USES_MAX6675&lt;/p&gt;

&lt;p&gt;if (e == 0)&lt;/p&gt;

&lt;p&gt;{&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; return 0.25 * raw;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;#endif&lt;/p&gt;

&lt;p&gt;if(heater_ttbl_map[e] != 0)&lt;/p&gt;

&lt;p&gt;{&lt;/p&gt;

&lt;p&gt;float celsius = 0;&lt;/p&gt;

&lt;p&gt;byte i;  &lt;/p&gt;

&lt;p&gt;short (&lt;em&gt;tt)[][2] = (short (&lt;/em&gt;)[][2])(heater_ttbl_map[e]);&lt;/p&gt;

&lt;p&gt;raw = (1023 * OVERSAMPLENR) - raw;&lt;/p&gt;

&lt;p&gt;for (i=1; i&amp;lt;heater_ttbllen_map[e]; i++)&lt;/p&gt;

&lt;p&gt;{&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; if ((PGM_RD_W((*tt)[i][0]) &amp;gt; raw) &amp;amp;&amp;amp; ((float)(PGM_RD_W((*tt)[i][0]) - PGM_RD_W((*tt)[i-1][0])) &amp;gt;0))

 {

   celsius = PGM_RD_W((*tt)[i-1][1]) +

     (raw - PGM_RD_W((*tt)[i-1][0])) *

     (float)(PGM_RD_W((*tt)[i][1]) - PGM_RD_W((*tt)[i-1][1])) /

     (float)(PGM_RD_W((*tt)[i][0]) - PGM_RD_W((*tt)[i-1][0]));

   break;

 }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;// Overflow: Set to last value in the table&lt;/p&gt;

&lt;p&gt;if (i == heater_ttbllen_map[e]) celsius = PGM_RD_W((*tt)[i-1][1]);&lt;/p&gt;

&lt;p&gt;return celsius;&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;return ((raw * ((5.0 * 100.0) / 1024.0) / OVERSAMPLENR) * TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET;&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;unsigned long prevMillis;&lt;/p&gt;

&lt;p&gt;void loop () {&lt;/p&gt;

&lt;p&gt;if (millis() %1000 &amp;lt;500)&lt;/p&gt;

&lt;p&gt;digitalWrite(LED_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;else&lt;/p&gt;

&lt;p&gt;digitalWrite(LED_PIN, LOW);&lt;/p&gt;

&lt;p&gt;if (millis() %1000 &amp;lt;300) {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, LOW);&lt;/p&gt;

&lt;p&gt;} else if (millis() %1000 &amp;lt;600) {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, LOW);&lt;/p&gt;

&lt;p&gt;} else  {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;if (millis() %2000 &amp;lt;1000) {&lt;/p&gt;

&lt;p&gt;digitalWrite(X_DIR_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_DIR_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_DIR_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_DIR_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_DIR_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;else {&lt;/p&gt;

&lt;p&gt;digitalWrite(X_DIR_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_DIR_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_DIR_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_DIR_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_DIR_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;digitalWrite(X_STEP_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_STEP_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_STEP_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_STEP_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_STEP_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;delay(1);&lt;/p&gt;

&lt;p&gt;digitalWrite(X_STEP_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_STEP_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_STEP_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_STEP_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_STEP_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;if (millis() -prevMillis &amp;gt;500){&lt;/p&gt;

&lt;p&gt;prevMillis=millis();&lt;/p&gt;

&lt;p&gt;int t = analogRead( TEMP_0_PIN);&lt;/p&gt;

&lt;p&gt;Serial.print("T0 ");&lt;/p&gt;

&lt;p&gt;Serial.print(t);&lt;/p&gt;

&lt;p&gt;Serial.print("/");&lt;/p&gt;

&lt;p&gt;Serial.print(analog2temp(1024 - t,0),0);&lt;/p&gt;

&lt;p&gt;Serial.print(" T1 ");&lt;/p&gt;

&lt;p&gt;t = analogRead( TEMP_1_PIN);&lt;/p&gt;

&lt;p&gt;Serial.print(t);&lt;/p&gt;

&lt;p&gt;Serial.print("/");&lt;/p&gt;

&lt;p&gt;Serial.print(analog2temp(1024 - t,1),0);&lt;/p&gt;

&lt;p&gt;Serial.print(" T2 ");&lt;/p&gt;

&lt;p&gt;t = analogRead( TEMP_2_PIN);&lt;/p&gt;

&lt;p&gt;Serial.print(t);&lt;/p&gt;

&lt;p&gt;Serial.print("/");&lt;/p&gt;

&lt;p&gt;Serial.println(analog2temp(1024 - t,2),0);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;p&gt;int uinput;&lt;/p&gt;

&lt;p&gt;extern "C"&lt;br&gt;
JNIEXPORT void JNICALL&lt;br&gt;
Java_com_monobogdan_inputservicebridge_InputNative_init(JNIEnv *env, jclass clazz) {&lt;br&gt;
    uinput = open("/dev/input/event2", O_WRONLY);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;__android_log_print(ANDROID_LOG_DEBUG  , "Test", uinput &amp;gt;= 0 ? "Open event OK" : "Failed to open event");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;void emit(int fd, int type, int code, int val)&lt;br&gt;
{&lt;br&gt;
    struct input_event ie;&lt;br&gt;
    ie.type = type;&lt;br&gt;
    ie.code = code;&lt;br&gt;
    ie.value = val;&lt;br&gt;
    /* timestamp values below are ignored */&lt;br&gt;
    ie.time.tv_sec = 0;&lt;br&gt;
    ie.time.tv_usec = 0;&lt;br&gt;
    write(fd, &amp;amp;ie, sizeof(ie));&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;extern "C"&lt;br&gt;
JNIEXPORT void JNICALL&lt;br&gt;
Java_com_monobogdan_inputservicebridge_InputNative_sendKeyEvent(JNIEnv *env, jclass clazz,&lt;br&gt;
                                                                jint key_code, jboolean pressed) {&lt;br&gt;
    __android_log_print(ANDROID_LOG_DEBUG  , "Test", "Send");&lt;br&gt;
    emit(uinput, EV_KEY, key_code, (bool)pressed  ? 1 : 0);&lt;br&gt;
    emit(uinput, EV_SYN, SYN_REPORT, 0);&lt;br&gt;
}&lt;br&gt;
package com.monobogdan.inputservicebridge;&lt;/p&gt;

&lt;p&gt;public class InputListener extends Service {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private static final int tty = 3;

private InputManager iManager;
private Map&amp;lt;Character, Integer&amp;gt; keyMap;
private Method injectMethod;

private Process runAsRoot(String cmd)
{
    try {
        return Runtime.getRuntime().exec(new String[] { "su", "-c", cmd });
    }
    catch (IOException e)
    {
        e.printStackTrace();

        return null;
    }
}

@Override
public void onCreate() {
    super.onCreate();

    // According to linux key map (input-event-codes.h)
    keyMap = new HashMap&amp;lt;&amp;gt;();
    keyMap.put('U', 103);
    keyMap.put('D', 108);
    keyMap.put('L', 105);
    keyMap.put('R', 106);
    keyMap.put('E', 115);
    keyMap.put('B', 158);
    keyMap.put('A', 232);
    keyMap.put('C', 212);

    InputNative.init();

    try {
        runAsRoot("chmod 777 /dev/input/event2").waitFor();
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }

    Executors.newSingleThreadExecutor().execute(new Runnable() {
        @Override
        public void run() {
            Process proc = runAsRoot("cat /dev/ttyMT" + tty);
            BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));

            while(true)
            {
                try {
                    String line = reader.readLine();

                    if(line != null &amp;amp;&amp;amp; line.length() &amp;gt; 0) {
                        Log.i("Hi", "run: " + line);

                        boolean pressing = line.charAt(0) == 'D';
                        int keyCode = keyMap.get(line.charAt(2));

                        Log.i("TAG", "run: " + keyCode);
                        InputNative.sendKeyEvent(keyCode, pressing);
                    }
                }
                catch(IOException e)
                {
                    e.printStackTrace();
                }

                /*try {
                    Thread.sleep(1000 / 30);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }*/
            }
        }
    });
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}
#include &amp;lt;stdio.h&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;
&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;
&lt;h1&gt;
  
  
  include "pico/stdlib.h"
&lt;/h1&gt;
&lt;h1&gt;
  
  
  include "pico/time.h"
&lt;/h1&gt;
&lt;h1&gt;
  
  
  include "hardware/uart.h"
&lt;/h1&gt;

&lt;p&gt;struct keyMap&lt;br&gt;
{&lt;br&gt;
    int gpio;&lt;br&gt;
    char key;&lt;br&gt;
    bool pressed;&lt;br&gt;
    int lastTick;&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;keyMap keys[] = {&lt;br&gt;
    {&lt;br&gt;
        15,&lt;br&gt;
        'L',&lt;br&gt;
        false,&lt;br&gt;
        0&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
        14,&lt;br&gt;
        'U',&lt;br&gt;
        false,&lt;br&gt;
        0&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
        13,&lt;br&gt;
        'D',&lt;br&gt;
        false,&lt;br&gt;
        0&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
        12,&lt;br&gt;
        'R',&lt;br&gt;
        false,&lt;br&gt;
        0&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
        11,&lt;br&gt;
        'E',&lt;br&gt;
        false,&lt;br&gt;
        0&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
        10,&lt;br&gt;
        'B',&lt;br&gt;
        false,&lt;br&gt;
        0&lt;br&gt;
    },&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    20,
    'A',
    false,
    0
},
{
    21,
    'C',
    false,
    0
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;};&lt;/p&gt;

&lt;h1&gt;
  
  
  define KEY_NUM 8
&lt;/h1&gt;

&lt;p&gt;int main() {&lt;br&gt;
    stdio_init_all();&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;uart_init(uart0, 921600);
gpio_set_function(PICO_DEFAULT_UART_TX_PIN, GPIO_FUNC_UART);
gpio_set_function(PICO_DEFAULT_UART_RX_PIN, GPIO_FUNC_UART);
sleep_ms(1000); // Allow serial monitor to settle

for(int i = 0; i &amp;lt;  KEY_NUM; i++)
{
    gpio_init(keys[i].gpio);
    gpio_set_dir(keys[i].gpio, false);
    gpio_pull_up(keys[i].gpio);
}

while(true)
{
    int now = time_us_32();

    for(int i = 0; i &amp;lt; KEY_NUM; i++)
    {
        char buf[5];
        buf[1] = ' ';
        buf[3] = '\n';
        buf[4] = 0;

        if(!gpio_get(keys[i].gpio) &amp;amp;&amp;amp; !keys[i].pressed &amp;amp;&amp;amp; now - keys[i].lastTick &amp;gt; 15500)
        {
            buf[0] = 'D';
            buf[2] = keys[i].key;
            puts(buf);

            keys[i].lastTick = now;
            keys[i].pressed = true;
            continue;
        }

        if(gpio_get(keys[i].gpio) &amp;amp;&amp;amp; keys[i].pressed &amp;amp;&amp;amp; now - keys[i].lastTick &amp;gt; 15500)
        {
            buf[0] = 'U';
            buf[2] = keys[i].key;
            puts(buf);

            keys[i].pressed = false;
            keys[i].lastTick = now;
        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>javascript</category>
      <category>css</category>
      <category>java</category>
      <category>github</category>
    </item>
    <item>
      <title>portable computer smart watch</title>
      <dc:creator>jay jordan</dc:creator>
      <pubDate>Mon, 25 Dec 2023 16:04:14 +0000</pubDate>
      <link>https://dev.to/jayjo87/portable-computer-smart-watch-49np</link>
      <guid>https://dev.to/jayjo87/portable-computer-smart-watch-49np</guid>
      <description>&lt;h1&gt;
  
  
  ifndef ARDUINO_STM32_FEATHER
&lt;/h1&gt;

&lt;p&gt;#include "pins_arduino.h"&lt;br&gt;
  #include "wiring_private.h"&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;p&gt;// If the SPI library has transaction support, these functions&lt;br&gt;
// establish settings and protect from interference from other&lt;br&gt;
// libraries.  Otherwise, they simply do nothing.&lt;/p&gt;

&lt;h1&gt;
  
  
  ifdef SPI_HAS_TRANSACTION
&lt;/h1&gt;

&lt;p&gt;static inline void spi_begin(void) &lt;strong&gt;attribute&lt;/strong&gt;((always_inline));&lt;br&gt;
static inline void spi_begin(void) {&lt;/p&gt;

&lt;h1&gt;
  
  
  if defined (ARDUINO_ARCH_ARC32)
&lt;/h1&gt;

&lt;p&gt;// max speed!&lt;br&gt;
  SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE0));&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// max speed!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;SPI.beginTransaction(SPISettings(24000000, MSBFIRST, SPI_MODE0));&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;}&lt;br&gt;
static inline void spi_end(void) &lt;strong&gt;attribute&lt;/strong&gt;((always_inline));&lt;br&gt;
static inline void spi_end(void) {&lt;br&gt;
  SPI.endTransaction();&lt;br&gt;
}&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define spi_begin()
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define spi_end()
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;// Constructor when using software SPI.  All output pins are configurable.&lt;br&gt;
ILI9488::ILI9488(int8_t cs, int8_t dc, int8_t mosi,&lt;br&gt;
                   int8_t sclk, int8_t rst, int8_t miso) : Adafruit_GFX(ILI9488_TFTWIDTH, ILI9488_TFTHEIGHT) {&lt;br&gt;
  _cs   = cs;&lt;br&gt;
  _dc   = dc;&lt;br&gt;
  _mosi  = mosi;&lt;br&gt;
  _miso = miso;&lt;br&gt;
  _sclk = sclk;&lt;br&gt;
  _rst  = rst;&lt;br&gt;
  hwSPI = false;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// Constructor when using hardware SPI.  Faster, but must use SPI pins&lt;br&gt;
// specific to each board type (e.g. 11,13 for Uno, 51,52 for Mega, etc.)&lt;br&gt;
ILI9488::ILI9488(int8_t cs, int8_t dc, int8_t rst) : Adafruit_GFX(ILI9488_TFTWIDTH, ILI9488_TFTHEIGHT) {&lt;br&gt;
  _cs   = cs;&lt;br&gt;
  _dc   = dc;&lt;br&gt;
  _rst  = rst;&lt;br&gt;
  hwSPI = true;&lt;br&gt;
  _mosi  = _sclk = 0;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void ILI9488::spiwrite(uint8_t c) {&lt;/p&gt;

&lt;p&gt;//Serial.print("0x"); Serial.print(c, HEX); Serial.print(", ");&lt;/p&gt;

&lt;p&gt;if (hwSPI) {&lt;/p&gt;

&lt;h1&gt;
  
  
  if defined (&lt;strong&gt;AVR&lt;/strong&gt;)
&lt;/h1&gt;

&lt;p&gt;#ifndef SPI_HAS_TRANSACTION&lt;br&gt;
    uint8_t backupSPCR = SPCR;&lt;br&gt;
    SPCR = mySPCR;&lt;br&gt;
  #endif&lt;br&gt;
    SPDR = c;&lt;br&gt;
    while(!(SPSR &amp;amp; _BV(SPIF)));&lt;br&gt;
  #ifndef SPI_HAS_TRANSACTION&lt;br&gt;
    SPCR = backupSPCR;&lt;br&gt;
  #endif&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SPI.transfer(c);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;} else {&lt;/p&gt;
&lt;h1&gt;
  
  
  if defined(ESP8266) || defined (ARDUINO_ARCH_ARC32) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_ARCH_ESP32)
&lt;/h1&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for(uint8_t bit = 0x80; bit; bit &amp;gt;&amp;gt;= 1) {
  if(c &amp;amp; bit) {
digitalWrite(_mosi, HIGH);
  } else {
digitalWrite(_mosi, LOW);
  }
  digitalWrite(_sclk, HIGH);
  digitalWrite(_sclk, LOW);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  else
&lt;/h1&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Fast SPI bitbang swiped from LPD8806 library
for(uint8_t bit = 0x80; bit; bit &amp;gt;&amp;gt;= 1) {
  if(c &amp;amp; bit) {
//digitalWrite(_mosi, HIGH);
*mosiport |=  mosipinmask;
  } else {
//digitalWrite(_mosi, LOW);
*mosiport &amp;amp;= ~mosipinmask;
  }
  //digitalWrite(_sclk, HIGH);
  *clkport |=  clkpinmask;
  //digitalWrite(_sclk, LOW);
  *clkport &amp;amp;= ~clkpinmask;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;}&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void ILI9488::writecommand(uint8_t c) {&lt;/p&gt;
&lt;h1&gt;
  
  
  if defined(USE_FAST_PINIO) &amp;amp;&amp;amp; !defined (&lt;em&gt;VARIANT_ARDUINO_STM32&lt;/em&gt;)
&lt;/h1&gt;

&lt;p&gt;*dcport &amp;amp;= ~dcpinmask;&lt;br&gt;
  *csport &amp;amp;= ~cspinmask;&lt;/p&gt;
&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;p&gt;digitalWrite(_dc, LOW);&lt;br&gt;
  digitalWrite(_sclk, LOW);&lt;br&gt;
  digitalWrite(_cs, LOW);&lt;/p&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;spiwrite(c);&lt;/p&gt;
&lt;h1&gt;
  
  
  if defined(USE_FAST_PINIO) &amp;amp;&amp;amp; !defined (&lt;em&gt;VARIANT_ARDUINO_STM32&lt;/em&gt;)
&lt;/h1&gt;

&lt;p&gt;*csport |= cspinmask;&lt;/p&gt;
&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;p&gt;digitalWrite(_cs, HIGH);&lt;/p&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;void ILI9488::writedata(uint8_t c) {&lt;/p&gt;
&lt;h1&gt;
  
  
  if defined(USE_FAST_PINIO) &amp;amp;&amp;amp; !defined (&lt;em&gt;VARIANT_ARDUINO_STM32&lt;/em&gt;)
&lt;/h1&gt;

&lt;p&gt;*dcport |=  dcpinmask;&lt;br&gt;
  *csport &amp;amp;= ~cspinmask;&lt;/p&gt;
&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;p&gt;digitalWrite(_dc, HIGH);&lt;br&gt;
  digitalWrite(_cs, LOW);&lt;/p&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;spiwrite(c);&lt;/p&gt;
&lt;h1&gt;
  
  
  if defined(USE_FAST_PINIO) &amp;amp;&amp;amp; !defined (&lt;em&gt;VARIANT_ARDUINO_STM32&lt;/em&gt;)
&lt;/h1&gt;

&lt;p&gt;*csport |= cspinmask;&lt;/p&gt;
&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;p&gt;digitalWrite(_cs, HIGH);&lt;/p&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;// Rather than a bazillion writecommand() and writedata() calls, screen&lt;br&gt;
// initialization commands and arguments are organized in these tables&lt;br&gt;
// stored in PROGMEM.  The table may look bulky, but that's mostly the&lt;br&gt;
// formatting -- storage-wise this is hundreds of bytes more compact&lt;br&gt;
// than the equivalent code.  Companion function follows.&lt;/p&gt;
&lt;h1&gt;
  
  
  define DELAY 0x80
&lt;/h1&gt;

&lt;p&gt;// Companion code to the above tables.  Reads and issues&lt;br&gt;
// a series of LCD commands stored in PROGMEM byte array.&lt;br&gt;
void ILI9488::commandList(uint8_t *addr) {&lt;/p&gt;

&lt;p&gt;uint8_t  numCommands, numArgs;&lt;br&gt;
  uint16_t ms;&lt;/p&gt;

&lt;p&gt;numCommands = pgm_read_byte(addr++);   // Number of commands to follow&lt;br&gt;
  while(numCommands--) {                 // For each command...&lt;br&gt;
    writecommand(pgm_read_byte(addr++)); //   Read, issue command&lt;br&gt;
    numArgs  = pgm_read_byte(addr++);    //   Number of args to follow&lt;br&gt;
    ms       = numArgs &amp;amp; DELAY;          //   If hibit set, delay follows args&lt;br&gt;
    numArgs &amp;amp;= ~DELAY;                   //   Mask out delay bit&lt;br&gt;
    while(numArgs--) {                   //   For each argument...&lt;br&gt;
      writedata(pgm_read_byte(addr++));  //     Read, issue argument&lt;br&gt;
    }&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if(ms) {
  ms = pgm_read_byte(addr++); // Read post-command delay time (ms)
  if(ms == 255) ms = 500;     // If 255, delay for 500 ms
  delay(ms);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void ILI9488::begin(void) {&lt;br&gt;
  if (_rst &amp;gt; 0) {&lt;br&gt;
    pinMode(_rst, OUTPUT);&lt;br&gt;
    digitalWrite(_rst, LOW);&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;pinMode(_dc, OUTPUT);&lt;br&gt;
  pinMode(_cs, OUTPUT);&lt;/p&gt;

&lt;h1&gt;
  
  
  if defined(USE_FAST_PINIO) &amp;amp;&amp;amp; !defined (&lt;em&gt;VARIANT_ARDUINO_STM32&lt;/em&gt;)
&lt;/h1&gt;

&lt;p&gt;csport    = portOutputRegister(digitalPinToPort(_cs));&lt;br&gt;
  cspinmask = digitalPinToBitMask(_cs);&lt;br&gt;
  dcport    = portOutputRegister(digitalPinToPort(_dc));&lt;br&gt;
  dcpinmask = digitalPinToBitMask(_dc);&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;if(hwSPI) { // Using hardware SPI&lt;br&gt;
    SPI.begin();&lt;/p&gt;

&lt;h1&gt;
  
  
  ifndef SPI_HAS_TRANSACTION
&lt;/h1&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;#if defined (&lt;em&gt;AVR&lt;/em&gt;&lt;em&gt;)&lt;br&gt;
    SPI.setClockDivider(SPI_CLOCK_DIV2); // 8 MHz (full! speed!)&lt;br&gt;
    mySPCR = SPCR;&lt;br&gt;
  #elif defined(TEENSYDUINO) || defined (&lt;/em&gt;&lt;em&gt;STM32F1&lt;/em&gt;&lt;em&gt;)&lt;br&gt;
    SPI.setClockDivider(SPI_CLOCK_DIV2); // 8 MHz (full! speed!)&lt;br&gt;
  #elif defined (&lt;/em&gt;&lt;em&gt;arm&lt;/em&gt;_)&lt;br&gt;
    SPI.setClockDivider(11); // 8-ish MHz (full! speed!)&lt;br&gt;
  #endif&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;} else {&lt;br&gt;
    pinMode(_sclk, OUTPUT);&lt;br&gt;
    pinMode(_mosi, OUTPUT);&lt;br&gt;
    pinMode(_miso, INPUT);&lt;/p&gt;

&lt;h1&gt;
  
  
  if defined(USE_FAST_PINIO) &amp;amp;&amp;amp; !defined (&lt;em&gt;VARIANT_ARDUINO_STM32&lt;/em&gt;)
&lt;/h1&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;clkport     = portOutputRegister(digitalPinToPort(_sclk));
clkpinmask  = digitalPinToBitMask(_sclk);
mosiport    = portOutputRegister(digitalPinToPort(_mosi));
mosipinmask = digitalPinToBitMask(_mosi);
*clkport   &amp;amp;= ~clkpinmask;
*mosiport  &amp;amp;= ~mosipinmask;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;// toggle RST low to reset&lt;br&gt;
  if (_rst &amp;gt; 0) {&lt;br&gt;
    digitalWrite(_rst, HIGH);&lt;br&gt;
    delay(5);&lt;br&gt;
    digitalWrite(_rst, LOW);&lt;br&gt;
    delay(20);&lt;br&gt;
    digitalWrite(_rst, HIGH);&lt;br&gt;
    delay(150);&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;/*&lt;br&gt;
  uint8_t x = readcommand8(ILI9488_RDMODE);&lt;br&gt;
  Serial.print("\nDisplay Power Mode: 0x"); Serial.println(x, HEX);&lt;br&gt;
  x = readcommand8(ILI9488_RDMADCTL);&lt;br&gt;
  Serial.print("\nMADCTL Mode: 0x"); Serial.println(x, HEX);&lt;br&gt;
  x = readcommand8(ILI9488_RDPIXFMT);&lt;br&gt;
  Serial.print("\nPixel Format: 0x"); Serial.println(x, HEX);&lt;br&gt;
  x = readcommand8(ILI9488_RDIMGFMT);&lt;br&gt;
  Serial.print("\nImage Format: 0x"); Serial.println(x, HEX);&lt;br&gt;
  x = readcommand8(ILI9488_RDSELFDIAG);&lt;br&gt;
  Serial.print("\nSelf Diagnostic: 0x"); Serial.println(x, HEX);&lt;br&gt;
*/&lt;br&gt;
  //if(cmdList) commandList(cmdList);&lt;/p&gt;

&lt;p&gt;if (hwSPI) spi_begin();&lt;br&gt;
  // writecommand(0xEF);&lt;br&gt;
  // writedata(0x03);&lt;br&gt;
  // writedata(0x80);&lt;br&gt;
  // writedata(0x02);&lt;br&gt;
  //&lt;br&gt;
  // writecommand(0xCF);&lt;br&gt;
  // writedata(0x00);&lt;br&gt;
  // writedata(0XC1);&lt;br&gt;
  // writedata(0X30);&lt;br&gt;
  //&lt;br&gt;
  // writecommand(0xED);&lt;br&gt;
  // writedata(0x64);&lt;br&gt;
  // writedata(0x03);&lt;br&gt;
  // writedata(0X12);&lt;br&gt;
  // writedata(0X81);&lt;br&gt;
  //&lt;br&gt;
  // writecommand(0xE8);&lt;br&gt;
  // writedata(0x85);&lt;br&gt;
  // writedata(0x00);&lt;br&gt;
  // writedata(0x78);&lt;br&gt;
  //&lt;br&gt;
  // writecommand(0xCB);&lt;br&gt;
  // writedata(0x39);&lt;br&gt;
  // writedata(0x2C);&lt;br&gt;
  // writedata(0x00);&lt;br&gt;
  // writedata(0x34);&lt;br&gt;
  // writedata(0x02);&lt;br&gt;
  //&lt;br&gt;
  // writecommand(0xF7);&lt;br&gt;
  // writedata(0x20);&lt;br&gt;
  //&lt;br&gt;
  // writecommand(0xEA);&lt;br&gt;
  // writedata(0x00);&lt;br&gt;
  // writedata(0x00);&lt;br&gt;
  //&lt;br&gt;
  // writecommand(ILI9488_PWCTR1);    //Power control&lt;br&gt;
  // writedata(0x23);   //VRH[5:0]&lt;br&gt;
  //&lt;br&gt;
  // writecommand(ILI9488_PWCTR2);    //Power control&lt;br&gt;
  // writedata(0x10);   //SAP[2:0];BT[3:0]&lt;br&gt;
  //&lt;br&gt;
  // writecommand(ILI9488_VMCTR1);    //VCM control&lt;br&gt;
  // writedata(0x3e); //¶Ô±È¶Èµ÷½Ú&lt;br&gt;
  // writedata(0x28);&lt;br&gt;
  //&lt;br&gt;
  // writecommand(ILI9488_VMCTR2);    //VCM control2&lt;br&gt;
  // writedata(0x86);  //--&lt;br&gt;
  //&lt;br&gt;
  // writecommand(ILI9488_MADCTL);    // Memory Access Control&lt;br&gt;
  // writedata(0x48);&lt;br&gt;
  //&lt;br&gt;
  // writecommand(ILI9488_PIXFMT);&lt;br&gt;
  // writedata(0x55);&lt;br&gt;
  //&lt;br&gt;
  // writecommand(ILI9488_FRMCTR1);&lt;br&gt;
  // writedata(0x00);&lt;br&gt;
  // writedata(0x18);&lt;br&gt;
  //&lt;br&gt;
  // writecommand(ILI9488_DFUNCTR);    // Display Function Control&lt;br&gt;
  // writedata(0x08);&lt;br&gt;
  // writedata(0x82);&lt;br&gt;
  // writedata(0x27);&lt;br&gt;
  //&lt;br&gt;
  // writecommand(0xF2);    // 3Gamma Function Disable&lt;br&gt;
  // writedata(0x00);&lt;br&gt;
  //&lt;br&gt;
  // writecommand(ILI9488_GAMMASET);    //Gamma curve selected&lt;br&gt;
  // writedata(0x01);&lt;br&gt;
  //&lt;br&gt;
  // writecommand(ILI9488_GMCTRP1);    //Set Gamma&lt;br&gt;
  // writedata(0x0F);&lt;br&gt;
  // writedata(0x31);&lt;br&gt;
  // writedata(0x2B);&lt;br&gt;
  // writedata(0x0C);&lt;br&gt;
  // writedata(0x0E);&lt;br&gt;
  // writedata(0x08);&lt;br&gt;
  // writedata(0x4E);&lt;br&gt;
  // writedata(0xF1);&lt;br&gt;
  // writedata(0x37);&lt;br&gt;
  // writedata(0x07);&lt;br&gt;
  // writedata(0x10);&lt;br&gt;
  // writedata(0x03);&lt;br&gt;
  // writedata(0x0E);&lt;br&gt;
  // writedata(0x09);&lt;br&gt;
  // writedata(0x00);&lt;br&gt;
  //&lt;br&gt;
  // writecommand(ILI9488_GMCTRN1);    //Set Gamma&lt;br&gt;
  // writedata(0x00);&lt;br&gt;
  // writedata(0x0E);&lt;br&gt;
  // writedata(0x14);&lt;br&gt;
  // writedata(0x03);&lt;br&gt;
  // writedata(0x11);&lt;br&gt;
  // writedata(0x07);&lt;br&gt;
  // writedata(0x31);&lt;br&gt;
  // writedata(0xC1);&lt;br&gt;
  // writedata(0x48);&lt;br&gt;
  // writedata(0x08);&lt;br&gt;
  // writedata(0x0F);&lt;br&gt;
  // writedata(0x0C);&lt;br&gt;
  // writedata(0x31);&lt;br&gt;
  // writedata(0x36);&lt;br&gt;
  // writedata(0x0F);&lt;/p&gt;

&lt;p&gt;writecommand(0xE0);&lt;br&gt;
    writedata(0x00);&lt;br&gt;
    writedata(0x03);&lt;br&gt;
    writedata(0x09);&lt;br&gt;
    writedata(0x08);&lt;br&gt;
    writedata(0x16);&lt;br&gt;
    writedata(0x0A);&lt;br&gt;
    writedata(0x3F);&lt;br&gt;
    writedata(0x78);&lt;br&gt;
    writedata(0x4C);&lt;br&gt;
    writedata(0x09);&lt;br&gt;
    writedata(0x0A);&lt;br&gt;
    writedata(0x08);&lt;br&gt;
    writedata(0x16);&lt;br&gt;
    writedata(0x1A);&lt;br&gt;
    writedata(0x0F);&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;writecommand(0XE1);
writedata(0x00);
writedata(0x16);
writedata(0x19);
writedata(0x03);
writedata(0x0F);
writedata(0x05);
writedata(0x32);
writedata(0x45);
writedata(0x46);
writedata(0x04);
writedata(0x0E);
writedata(0x0D);
writedata(0x35);
writedata(0x37);
writedata(0x0F);



writecommand(0XC0);      //Power Control 1
writedata(0x17);    //Vreg1out
writedata(0x15);    //Verg2out

writecommand(0xC1);      //Power Control 2
writedata(0x41);    //VGH,VGL

writecommand(0xC5);      //Power Control 3
writedata(0x00);
writedata(0x12);    //Vcom
writedata(0x80);

writecommand(0x36);      //Memory Access
writedata(0x48);

writecommand(0x3A);      // Interface Pixel Format
writedata(0x66);      //18 bit

writecommand(0XB0);      // Interface Mode Control
writedata(0x80);                 //SDO NOT USE

writecommand(0xB1);      //Frame rate
writedata(0xA0);    //60Hz

writecommand(0xB4);      //Display Inversion Control
writedata(0x02);    //2-dot

writecommand(0XB6);      //Display Function Control  RGB/MCU Interface Control

writedata(0x02);    //MCU
writedata(0x02);    //Source,Gate scan dieection

writecommand(0XE9);      // Set Image Functio
writedata(0x00);    // Disable 24 bit data

writecommand(0xF7);      // Adjust Control
writedata(0xA9);
writedata(0x51);
writedata(0x2C);
writedata(0x82);    // D7 stream, loose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;writecommand(ILI9488_SLPOUT);    //Exit Sleep&lt;br&gt;
  if (hwSPI) spi_end();&lt;br&gt;
  delay(120);&lt;br&gt;
  if (hwSPI) spi_begin();&lt;br&gt;
  writecommand(ILI9488_DISPON);    //Display on&lt;br&gt;
  if (hwSPI) spi_end();&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;void ILI9488::setScrollArea(uint16_t topFixedArea, uint16_t bottomFixedArea){&lt;br&gt;
  if (hwSPI) spi_begin();&lt;br&gt;
  writecommand(0x33); // Vertical scroll definition&lt;br&gt;
  writedata(topFixedArea &amp;gt;&amp;gt; 8);&lt;br&gt;
  writedata(topFixedArea);&lt;br&gt;
  writedata((_height - topFixedArea - bottomFixedArea) &amp;gt;&amp;gt; 8);&lt;br&gt;
  writedata(_height - topFixedArea - bottomFixedArea);&lt;br&gt;
  writedata(bottomFixedArea &amp;gt;&amp;gt; 8);&lt;br&gt;
  writedata(bottomFixedArea);&lt;br&gt;
  if (hwSPI) spi_end();&lt;br&gt;
}&lt;br&gt;
void ILI9488::scroll(uint16_t pixels){&lt;br&gt;
  if (hwSPI) spi_begin();&lt;br&gt;
  writecommand(0x37); // Vertical scrolling start address&lt;br&gt;
  writedata(pixels &amp;gt;&amp;gt; 8);&lt;br&gt;
  writedata(pixels);&lt;br&gt;
  if (hwSPI) spi_end();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void ILI9488::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1,&lt;br&gt;
 uint16_t y1) {&lt;/p&gt;

&lt;p&gt;writecommand(ILI9488_CASET); // Column addr set&lt;br&gt;
  writedata(x0 &amp;gt;&amp;gt; 8);&lt;br&gt;
  writedata(x0 &amp;amp; 0xFF);     // XSTART&lt;br&gt;
  writedata(x1 &amp;gt;&amp;gt; 8);&lt;br&gt;
  writedata(x1 &amp;amp; 0xFF);     // XEND&lt;/p&gt;

&lt;p&gt;writecommand(ILI9488_PASET); // Row addr set&lt;br&gt;
  writedata(y0&amp;gt;&amp;gt;8);&lt;br&gt;
  writedata(y0 &amp;amp;0xff);     // YSTART&lt;br&gt;
  writedata(y1&amp;gt;&amp;gt;8);&lt;br&gt;
  writedata(y1 &amp;amp;0xff);     // YEND&lt;/p&gt;

&lt;p&gt;writecommand(ILI9488_RAMWR); // write to RAM&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;void ILI9488::drawImage(const uint8_t* img, uint16_t x, uint16_t y, uint16_t w, uint16_t h){&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// rudimentary clipping (drawChar w/big text requires this)
if((x &amp;gt;= _width) || (y &amp;gt;= _height)) return;
if((x + w - 1) &amp;gt;= _width)  w = _width  - x;
if((y + h - 1) &amp;gt;= _height) h = _height - y;

if (hwSPI) spi_begin();
setAddrWindow(x, y, x+w-1, y+h-1);

// uint8_t hi = color &amp;gt;&amp;gt; 8, lo = color;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;#if defined(USE_FAST_PINIO) &amp;amp;&amp;amp; !defined (&lt;em&gt;VARIANT_ARDUINO_STM32&lt;/em&gt;)&lt;br&gt;
    &lt;em&gt;dcport |=  dcpinmask;&lt;br&gt;
    *csport &amp;amp;= ~cspinmask;&lt;br&gt;
  #else&lt;br&gt;
    digitalWrite(_dc, HIGH);&lt;br&gt;
    digitalWrite(_cs, LOW);&lt;br&gt;
  #endif&lt;br&gt;
  uint8_t linebuff[w*3+1];&lt;br&gt;
  uint16_t pixels = w*h;&lt;br&gt;
  // uint16_t count = 0;&lt;br&gt;
  uint32_t count = 0;&lt;br&gt;
  for (uint16_t i = 0; i &amp;lt; h; i++) {&lt;br&gt;
    uint16_t pixcount = 0;&lt;br&gt;
    for (uint16_t o = 0; o &amp;lt;  w; o++) {&lt;br&gt;
      uint8_t b1 = img[count];&lt;br&gt;
      count++;&lt;br&gt;
      uint8_t b2 = img[count];&lt;br&gt;
      count++;&lt;br&gt;
      uint16_t color = b1 &amp;lt;&amp;lt; 8 | b2;&lt;br&gt;
      linebuff[pixcount] = (((color &amp;amp; 0xF800) &amp;gt;&amp;gt; 11)&lt;/em&gt; 255) / 31;&lt;br&gt;
      pixcount++;&lt;br&gt;
      linebuff[pixcount] = (((color &amp;amp; 0x07E0) &amp;gt;&amp;gt; 5) * 255) / 63;&lt;br&gt;
      pixcount++;&lt;br&gt;
      linebuff[pixcount] = ((color &amp;amp; 0x001F)* 255) / 31;&lt;br&gt;
      pixcount++;&lt;br&gt;
    } // for row&lt;br&gt;
    #if defined (&lt;strong&gt;STM32F1&lt;/strong&gt;)&lt;br&gt;
      SPI.dmaSend(linebuff, w*3);&lt;br&gt;
    #else&lt;br&gt;
      for(uint16_t b = 0; b &amp;lt; w*3; b++){&lt;br&gt;
        spiwrite(linebuff[b]);&lt;br&gt;
      }&lt;br&gt;
    #endif&lt;/p&gt;

&lt;p&gt;}// for col&lt;br&gt;
  #if defined(USE_FAST_PINIO) &amp;amp;&amp;amp; !defined (&lt;em&gt;VARIANT_ARDUINO_STM32&lt;/em&gt;)&lt;br&gt;
    *csport |= cspinmask;&lt;br&gt;
  #else&lt;br&gt;
    digitalWrite(_cs, HIGH);&lt;br&gt;
  #endif&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (hwSPI) spi_end();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;void ILI9488::pushColor(uint16_t color) {&lt;br&gt;
  if (hwSPI) spi_begin();&lt;/p&gt;

&lt;h1&gt;
  
  
  if defined(USE_FAST_PINIO) &amp;amp;&amp;amp; !defined (&lt;em&gt;VARIANT_ARDUINO_STM32&lt;/em&gt;)
&lt;/h1&gt;

&lt;p&gt;*dcport |=  dcpinmask;&lt;br&gt;
  *csport &amp;amp;= ~cspinmask;&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;p&gt;digitalWrite(_dc, HIGH);&lt;br&gt;
  digitalWrite(_cs, LOW);&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;// spiwrite(color &amp;gt;&amp;gt; 8);&lt;br&gt;
  // spiwrite(color);&lt;br&gt;
  // spiwrite(0); // added for 24 bit&lt;br&gt;
  write16BitColor(color);&lt;/p&gt;

&lt;h1&gt;
  
  
  if defined(USE_FAST_PINIO) &amp;amp;&amp;amp; !defined (&lt;em&gt;VARIANT_ARDUINO_STM32&lt;/em&gt;)
&lt;/h1&gt;

&lt;p&gt;*csport |= cspinmask;&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;p&gt;digitalWrite(_cs, HIGH);&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;if (hwSPI) spi_end();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void ILI9488::pushColors(uint16_t &lt;em&gt;data, uint8_t len, boolean first) {&lt;br&gt;
  uint16_t color;&lt;br&gt;
  uint8_t  buff[len*3+1];&lt;br&gt;
  uint16_t count = 0;&lt;br&gt;
  uint8_t lencount = len;&lt;br&gt;
  if (hwSPI) spi_begin();&lt;br&gt;
  #if defined(USE_FAST_PINIO) &amp;amp;&amp;amp; !defined (&lt;em&gt;VARIANT_ARDUINO_STM32&lt;/em&gt;)&lt;br&gt;
    *csport &amp;amp;= ~cspinmask;&lt;br&gt;
  #else&lt;br&gt;
    digitalWrite(&lt;em&gt;cs, LOW);&lt;br&gt;
  #endif&lt;br&gt;
  if(first == true) { // Issue GRAM write command only on first call&lt;br&gt;
    #if defined(USE_FAST_PINIO) &amp;amp;&amp;amp; !defined (_VARIANT_ARDUINO_STM32&lt;/em&gt;)&lt;br&gt;
      *dcport |=  dcpinmask;&lt;br&gt;
    #else&lt;br&gt;
      digitalWrite(_dc, HIGH);&lt;br&gt;
    #endif&lt;br&gt;
  }&lt;br&gt;
  while(lencount--) {&lt;br&gt;
    color = *data++;&lt;br&gt;
    buff[count] = (((color &amp;amp; 0xF800) &amp;gt;&amp;gt; 11)&lt;/em&gt; 255) / 31;&lt;br&gt;
    count++;&lt;br&gt;
    buff[count] = (((color &amp;amp; 0x07E0) &amp;gt;&amp;gt; 5) * 255) / 63;&lt;br&gt;
    count++;&lt;br&gt;
    buff[count] = ((color &amp;amp; 0x001F)* 255) / 31;&lt;br&gt;
    count++;&lt;br&gt;
  }&lt;br&gt;
  #if defined (&lt;strong&gt;STM32F1&lt;/strong&gt;)&lt;br&gt;
    SPI.dmaSend(buff, len*3);&lt;br&gt;
  #else&lt;br&gt;
    for(uint16_t b = 0; b &amp;lt; len*3; b++){&lt;br&gt;
      spiwrite(buff[b]);&lt;br&gt;
    }&lt;br&gt;
  #endif&lt;br&gt;
  #if defined(USE_FAST_PINIO) &amp;amp;&amp;amp; !defined (&lt;em&gt;VARIANT_ARDUINO_STM32&lt;/em&gt;)&lt;br&gt;
    *csport |= cspinmask;&lt;br&gt;
  #else&lt;br&gt;
    digitalWrite(_cs, HIGH);&lt;br&gt;
  #endif&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (hwSPI) spi_end();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;void ILI9488::write16BitColor(uint16_t color){&lt;br&gt;
  // #if (&lt;strong&gt;STM32F1&lt;/strong&gt;)&lt;br&gt;
  //     uint8_t buff[4] = {&lt;br&gt;
  //       (((color &amp;amp; 0xF800) &amp;gt;&amp;gt; 11)* 255) / 31,&lt;br&gt;
  //       (((color &amp;amp; 0x07E0) &amp;gt;&amp;gt; 5) * 255) / 63,&lt;br&gt;
  //       ((color &amp;amp; 0x001F)* 255) / 31&lt;br&gt;
  //     };&lt;br&gt;
  //     SPI.dmaSend(buff, 3);&lt;br&gt;
  // #else&lt;br&gt;
  uint8_t r = (color &amp;amp; 0xF800) &amp;gt;&amp;gt; 11;&lt;br&gt;
  uint8_t g = (color &amp;amp; 0x07E0) &amp;gt;&amp;gt; 5;&lt;br&gt;
  uint8_t b = color &amp;amp; 0x001F;&lt;/p&gt;

&lt;p&gt;r = (r * 255) / 31;&lt;br&gt;
  g = (g * 255) / 63;&lt;br&gt;
  b = (b * 255) / 31;&lt;/p&gt;

&lt;p&gt;spiwrite(r);&lt;br&gt;
  spiwrite(g);&lt;br&gt;
  spiwrite(b);&lt;br&gt;
  yield();&lt;br&gt;
  // #endif&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void ILI9488::drawPixel(int16_t x, int16_t y, uint16_t color) {&lt;/p&gt;

&lt;p&gt;if((x &amp;lt; 0) ||(x &amp;gt;= _width) || (y &amp;lt; 0) || (y &amp;gt;= _height)) return;&lt;/p&gt;

&lt;p&gt;if (hwSPI) spi_begin();&lt;br&gt;
  setAddrWindow(x,y,x+1,y+1);&lt;/p&gt;

&lt;h1&gt;
  
  
  if defined(USE_FAST_PINIO) &amp;amp;&amp;amp; !defined (&lt;em&gt;VARIANT_ARDUINO_STM32&lt;/em&gt;)
&lt;/h1&gt;

&lt;p&gt;*dcport |=  dcpinmask;&lt;br&gt;
  *csport &amp;amp;= ~cspinmask;&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;p&gt;digitalWrite(_dc, HIGH);&lt;br&gt;
  digitalWrite(_cs, LOW);&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;// spiwrite(color &amp;gt;&amp;gt; 8);&lt;br&gt;
  // spiwrite(color);&lt;br&gt;
  // spiwrite(0); // added for 24 bit&lt;br&gt;
  write16BitColor(color);&lt;/p&gt;

&lt;h1&gt;
  
  
  if defined(USE_FAST_PINIO) &amp;amp;&amp;amp; !defined (&lt;em&gt;VARIANT_ARDUINO_STM32&lt;/em&gt;)
&lt;/h1&gt;

&lt;p&gt;*csport |= cspinmask;&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;p&gt;digitalWrite(_cs, HIGH);&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;if (hwSPI) spi_end();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void ILI9488::drawFastVLine(int16_t x, int16_t y, int16_t h,&lt;br&gt;
 uint16_t color) {&lt;/p&gt;

&lt;p&gt;// Rudimentary clipping&lt;br&gt;
  if((x &amp;gt;= _width) || (y &amp;gt;= _height)) return;&lt;/p&gt;

&lt;p&gt;if((y+h-1) &amp;gt;= _height)&lt;br&gt;
    h = _height-y;&lt;/p&gt;

&lt;p&gt;if (hwSPI) spi_begin();&lt;br&gt;
  setAddrWindow(x, y, x, y+h-1);&lt;/p&gt;

&lt;p&gt;//  uint8_t hi = color &amp;gt;&amp;gt; 8, lo = color;&lt;/p&gt;

&lt;h1&gt;
  
  
  if defined(USE_FAST_PINIO) &amp;amp;&amp;amp; !defined (&lt;em&gt;VARIANT_ARDUINO_STM32&lt;/em&gt;)
&lt;/h1&gt;

&lt;p&gt;*dcport |=  dcpinmask;&lt;br&gt;
  *csport &amp;amp;= ~cspinmask;&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;p&gt;digitalWrite(_dc, HIGH);&lt;br&gt;
  digitalWrite(_cs, LOW);&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;while (h--) {&lt;br&gt;
    // spiwrite(hi);&lt;br&gt;
    // spiwrite(lo);&lt;br&gt;
    // spiwrite(0); // added for 24 bit&lt;br&gt;
    write16BitColor(color);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;h1&gt;
  
  
  if defined(USE_FAST_PINIO) &amp;amp;&amp;amp; !defined (&lt;em&gt;VARIANT_ARDUINO_STM32&lt;/em&gt;)
&lt;/h1&gt;

&lt;p&gt;*csport |= cspinmask;&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;p&gt;digitalWrite(_cs, HIGH);&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;if (hwSPI) spi_end();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void ILI9488::drawFastHLine(int16_t x, int16_t y, int16_t w,&lt;br&gt;
  uint16_t color) {&lt;/p&gt;

&lt;p&gt;// Rudimentary clipping&lt;br&gt;
  if((x &amp;gt;= _width) || (y &amp;gt;= _height)) return;&lt;br&gt;
  if((x+w-1) &amp;gt;= _width)  w = _width-x;&lt;br&gt;
  if (hwSPI) spi_begin();&lt;br&gt;
  setAddrWindow(x, y, x+w-1, y);&lt;/p&gt;

&lt;p&gt;// uint8_t hi = color &amp;gt;&amp;gt; 8, lo = color;&lt;/p&gt;

&lt;h1&gt;
  
  
  if defined(USE_FAST_PINIO) &amp;amp;&amp;amp; !defined (&lt;em&gt;VARIANT_ARDUINO_STM32&lt;/em&gt;)
&lt;/h1&gt;

&lt;p&gt;*dcport |=  dcpinmask;&lt;br&gt;
  *csport &amp;amp;= ~cspinmask;&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;p&gt;digitalWrite(_dc, HIGH);&lt;br&gt;
  digitalWrite(_cs, LOW);&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;while (w--) {&lt;br&gt;
    // spiwrite(hi);&lt;br&gt;
    // spiwrite(lo);&lt;br&gt;
    // spiwrite(0); // added for 24 bit&lt;br&gt;
    write16BitColor(color);&lt;br&gt;
  }&lt;/p&gt;

&lt;h1&gt;
  
  
  if defined(USE_FAST_PINIO) &amp;amp;&amp;amp; !defined (&lt;em&gt;VARIANT_ARDUINO_STM32&lt;/em&gt;)
&lt;/h1&gt;

&lt;p&gt;*csport |= cspinmask;&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;p&gt;digitalWrite(_cs, HIGH);&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;if (hwSPI) spi_end();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void ILI9488::fillScreen(uint16_t color) {&lt;br&gt;
  fillRect(0, 0,  _width, _height, color);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// fill a rectangle&lt;br&gt;
void ILI9488::fillRect(int16_t x, int16_t y, int16_t w, int16_t h,&lt;br&gt;
  uint16_t color) {&lt;/p&gt;

&lt;p&gt;// rudimentary clipping (drawChar w/big text requires this)&lt;br&gt;
  if((x &amp;gt;= _width) || (y &amp;gt;= _height)) return;&lt;br&gt;
  if((x + w - 1) &amp;gt;= _width)  w = _width  - x;&lt;br&gt;
  if((y + h - 1) &amp;gt;= _height) h = _height - y;&lt;/p&gt;

&lt;p&gt;if (hwSPI) spi_begin();&lt;br&gt;
  setAddrWindow(x, y, x+w-1, y+h-1);&lt;/p&gt;

&lt;p&gt;// uint8_t hi = color &amp;gt;&amp;gt; 8, lo = color;&lt;/p&gt;

&lt;h1&gt;
  
  
  if defined(USE_FAST_PINIO) &amp;amp;&amp;amp; !defined (&lt;em&gt;VARIANT_ARDUINO_STM32&lt;/em&gt;)
&lt;/h1&gt;

&lt;p&gt;*dcport |=  dcpinmask;&lt;br&gt;
  *csport &amp;amp;= ~cspinmask;&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;p&gt;digitalWrite(_dc, HIGH);&lt;br&gt;
  digitalWrite(_cs, LOW);&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (&lt;strong&gt;STM32F1&lt;/strong&gt;)
&lt;/h1&gt;

&lt;p&gt;//use dma fast fills&lt;br&gt;
    uint8_t buff[4] = {&lt;br&gt;
      (((color &amp;amp; 0xF800) &amp;gt;&amp;gt; 11)* 255) / 31,&lt;br&gt;
      (((color &amp;amp; 0x07E0) &amp;gt;&amp;gt; 5) * 255) / 63,&lt;br&gt;
      ((color &amp;amp; 0x001F)* 255) / 31&lt;br&gt;
    };&lt;br&gt;
    uint8_t linebuff[w*3+1];&lt;br&gt;
    int cnt = 0;&lt;br&gt;
    for(int i = 0; i &amp;lt; w; i++){&lt;br&gt;
      linebuff[cnt]= buff[0];&lt;br&gt;
      cnt++;&lt;br&gt;
      linebuff[cnt]= buff[1];&lt;br&gt;
      cnt++;&lt;br&gt;
      linebuff[cnt]= buff[2];&lt;br&gt;
      cnt++;&lt;br&gt;
    }&lt;br&gt;
    for(y=h; y&amp;gt;0; y--) {&lt;br&gt;
        SPI.dmaSend(linebuff, w*3);&lt;br&gt;
      }&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;p&gt;for(y=h; y&amp;gt;0; y--) {&lt;br&gt;
    for(x=w; x&amp;gt;0; x--) {&lt;br&gt;
      // spiwrite(hi);&lt;br&gt;
      // spiwrite(lo);&lt;br&gt;
      // spiwrite(0); // added for 24 bit&lt;br&gt;
      write16BitColor(color);&lt;br&gt;
    }&lt;br&gt;
  }&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if defined(USE_FAST_PINIO) &amp;amp;&amp;amp; !defined (&lt;em&gt;VARIANT_ARDUINO_STM32&lt;/em&gt;)
&lt;/h1&gt;

&lt;p&gt;*csport |= cspinmask;&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;p&gt;digitalWrite(_cs, HIGH);&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;if (hwSPI) spi_end();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// Pass 8-bit (each) R,G,B, get back 16-bit packed color&lt;br&gt;
uint16_t ILI9488::color565(uint8_t r, uint8_t g, uint8_t b) {&lt;br&gt;
  return ((r &amp;amp; 0xF8) &amp;lt;&amp;lt; 8) | ((g &amp;amp; 0xFC) &amp;lt;&amp;lt; 3) | (b &amp;gt;&amp;gt; 3);&lt;br&gt;
}&lt;/p&gt;

&lt;h1&gt;
  
  
  define MADCTL_MY  0x80
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define MADCTL_MX  0x40
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define MADCTL_MV  0x20
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define MADCTL_ML  0x10
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define MADCTL_RGB 0x00
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define MADCTL_BGR 0x08
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define MADCTL_MH  0x04
&lt;/h1&gt;

&lt;p&gt;void ILI9488::setRotation(uint8_t m) {&lt;/p&gt;

&lt;p&gt;if (hwSPI) spi_begin();&lt;br&gt;
  writecommand(ILI9488_MADCTL);&lt;br&gt;
  rotation = m % 4; // can't be higher than 3&lt;br&gt;
  switch (rotation) {&lt;br&gt;
   case 0:&lt;br&gt;
     writedata(MADCTL_MX | MADCTL_BGR);&lt;br&gt;
     _width  = ILI9488_TFTWIDTH;&lt;br&gt;
     _height = ILI9488_TFTHEIGHT;&lt;br&gt;
     break;&lt;br&gt;
   case 1:&lt;br&gt;
     writedata(MADCTL_MV | MADCTL_BGR);&lt;br&gt;
     _width  = ILI9488_TFTHEIGHT;&lt;br&gt;
     _height = ILI9488_TFTWIDTH;&lt;br&gt;
     break;&lt;br&gt;
  case 2:&lt;br&gt;
    writedata(MADCTL_MY | MADCTL_BGR);&lt;br&gt;
     _width  = ILI9488_TFTWIDTH;&lt;br&gt;
     _height = ILI9488_TFTHEIGHT;&lt;br&gt;
    break;&lt;br&gt;
   case 3:&lt;br&gt;
     writedata(MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR);&lt;br&gt;
     _width  = ILI9488_TFTHEIGHT;&lt;br&gt;
     _height = ILI9488_TFTWIDTH;&lt;br&gt;
     break;&lt;br&gt;
  }&lt;br&gt;
  if (hwSPI) spi_end();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void ILI9488::invertDisplay(boolean i) {&lt;br&gt;
  if (hwSPI) spi_begin();&lt;br&gt;
  writecommand(i ? ILI9488_INVON : ILI9488_INVOFF);&lt;br&gt;
  if (hwSPI) spi_end();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;////////// stuff not actively being used, but kept for posterity&lt;/p&gt;

&lt;p&gt;uint8_t ILI9488::spiread(void) {&lt;br&gt;
  uint8_t r = 0;&lt;/p&gt;

&lt;p&gt;if (hwSPI) {&lt;/p&gt;

&lt;h1&gt;
  
  
  if defined (&lt;strong&gt;AVR&lt;/strong&gt;)
&lt;/h1&gt;

&lt;p&gt;#ifndef SPI_HAS_TRANSACTION&lt;br&gt;
    uint8_t backupSPCR = SPCR;&lt;br&gt;
    SPCR = mySPCR;&lt;br&gt;
  #endif&lt;br&gt;
    SPDR = 0x00;&lt;br&gt;
    while(!(SPSR &amp;amp; _BV(SPIF)));&lt;br&gt;
    r = SPDR;&lt;/p&gt;

&lt;p&gt;#ifndef SPI_HAS_TRANSACTION&lt;br&gt;
    SPCR = backupSPCR;&lt;br&gt;
  #endif&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;r = SPI.transfer(0x00);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;} else {&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for (uint8_t i=0; i&amp;lt;8; i++) {
  digitalWrite(_sclk, LOW);
  digitalWrite(_sclk, HIGH);
  r &amp;lt;&amp;lt;= 1;
  if (digitalRead(_miso))
r |= 0x1;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  //Serial.print("read: 0x"); Serial.print(r, HEX);&lt;/p&gt;

&lt;p&gt;return r;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;uint8_t ILI9488::readdata(void) {&lt;br&gt;
   digitalWrite(_dc, HIGH);&lt;br&gt;
   digitalWrite(_cs, LOW);&lt;br&gt;
   uint8_t r = spiread();&lt;br&gt;
   digitalWrite(_cs, HIGH);&lt;/p&gt;

&lt;p&gt;return r;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;uint8_t ILI9488::readcommand8(uint8_t c, uint8_t index) {&lt;br&gt;
   if (hwSPI) spi_begin();&lt;br&gt;
   digitalWrite(_dc, LOW); // command&lt;br&gt;
   digitalWrite(_cs, LOW);&lt;br&gt;
   spiwrite(0xD9);  // woo sekret command?&lt;br&gt;
   digitalWrite(_dc, HIGH); // data&lt;br&gt;
   spiwrite(0x10 + index);&lt;br&gt;
   digitalWrite(_cs, HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(_dc, LOW);&lt;br&gt;
   digitalWrite(_sclk, LOW);&lt;br&gt;
   digitalWrite(_cs, LOW);&lt;br&gt;
   spiwrite(c);&lt;/p&gt;

&lt;p&gt;digitalWrite(_dc, HIGH);&lt;br&gt;
   uint8_t r = spiread();&lt;br&gt;
   digitalWrite(_cs, HIGH);&lt;br&gt;
   if (hwSPI) spi_end();&lt;br&gt;
   return r;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;/*&lt;/p&gt;

&lt;p&gt;uint16_t ILI9488::readcommand16(uint8_t c) {&lt;br&gt;
 digitalWrite(_dc, LOW);&lt;br&gt;
 if (_cs)&lt;br&gt;
 digitalWrite(_cs, LOW);&lt;/p&gt;

&lt;p&gt;spiwrite(c);&lt;br&gt;
 pinMode(_sid, INPUT); // input!&lt;br&gt;
 uint16_t r = spiread();&lt;br&gt;
 r &amp;lt;&amp;lt;= 8;&lt;br&gt;
 r |= spiread();&lt;br&gt;
 if (_cs)&lt;br&gt;
 digitalWrite(_cs, HIGH);&lt;/p&gt;

&lt;p&gt;pinMode(_sid, OUTPUT); // back to output&lt;br&gt;
 return r;&lt;br&gt;
 }&lt;/p&gt;

&lt;p&gt;uint32_t ILI9488::readcommand32(uint8_t c) {&lt;br&gt;
 digitalWrite(_dc, LOW);&lt;br&gt;
 if (_cs)&lt;br&gt;
 digitalWrite(_cs, LOW);&lt;br&gt;
 spiwrite(c);&lt;br&gt;
 pinMode(_sid, INPUT); // input!&lt;/p&gt;

&lt;p&gt;dummyclock();&lt;br&gt;
 dummyclock();&lt;/p&gt;

&lt;p&gt;uint32_t r = spiread();&lt;br&gt;
 r &amp;lt;&amp;lt;= 8;&lt;br&gt;
 r |= spiread();&lt;br&gt;
 r &amp;lt;&amp;lt;= 8;&lt;br&gt;
 r |= spiread();&lt;br&gt;
 r &amp;lt;&amp;lt;= 8;&lt;br&gt;
 r |= spiread();&lt;br&gt;
 if (_cs)&lt;br&gt;
 digitalWrite(_cs, HIGH);&lt;/p&gt;

&lt;p&gt;pinMode(_sid, OUTPUT); // back to output&lt;br&gt;
 return r;&lt;br&gt;
 }&lt;/p&gt;

&lt;p&gt;&lt;em&gt;/&lt;br&gt;
 /&lt;/em&gt;**************************************************&lt;br&gt;
  This is our GFX example for the Adafruit ILI9488 Breakout and Shield&lt;br&gt;
  ----&amp;gt; &lt;a href="http://www.adafruit.com/products/1651"&gt;http://www.adafruit.com/products/1651&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check out the links above for our tutorials and wiring diagrams&lt;br&gt;
  These displays use SPI to communicate, 4 or 5 pins are required to&lt;br&gt;
  interface (RST is optional)&lt;br&gt;
  Adafruit invests time and resources providing this open source code,&lt;br&gt;
  please support Adafruit and open-source hardware by purchasing&lt;br&gt;
  products from Adafruit!&lt;/p&gt;

&lt;p&gt;Written by Limor Fried/Ladyada for Adafruit Industries.&lt;br&gt;
  MIT license, all text above must be included in any redistribution&lt;br&gt;
 ****************************************************/&lt;/p&gt;

&lt;h1&gt;
  
  
  include "SPI.h"
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TFT_CS         PA1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TFT_DC         PB3
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TFT_LED        PB0
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TFT_RST        PB4
&lt;/h1&gt;

&lt;p&gt;// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC&lt;br&gt;
ILI9488 tft = ILI9488(TFT_CS, TFT_DC, TFT_RST);&lt;br&gt;
// If using the breakout, change pins as desired&lt;br&gt;
//Adafruit_ILI9488 tft = Adafruit_ILI9488(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);&lt;/p&gt;

&lt;p&gt;void setup() {&lt;br&gt;
  Serial.begin(9600);&lt;br&gt;
  Serial.println("ILI9488 Test!");&lt;/p&gt;

&lt;p&gt;tft.begin();&lt;/p&gt;

&lt;p&gt;// read diagnostics (optional but can help debug problems)&lt;br&gt;
  uint8_t x = tft.readcommand8(ILI9488_RDMODE);&lt;br&gt;
  Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX);&lt;br&gt;
  x = tft.readcommand8(ILI9488_RDMADCTL);&lt;br&gt;
  Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX);&lt;br&gt;
  x = tft.readcommand8(ILI9488_RDPIXFMT);&lt;br&gt;
  Serial.print("Pixel Format: 0x"); Serial.println(x, HEX);&lt;br&gt;
  x = tft.readcommand8(ILI9488_RDIMGFMT);&lt;br&gt;
  Serial.print("Image Format: 0x"); Serial.println(x, HEX);&lt;br&gt;
  x = tft.readcommand8(ILI9488_RDSELFDIAG);&lt;br&gt;
  Serial.print("Self Diagnostic: 0x"); Serial.println(x, HEX);&lt;/p&gt;

&lt;p&gt;Serial.println(F("Benchmark                Time (microseconds)"));&lt;/p&gt;

&lt;p&gt;Serial.print(F("Screen fill              "));&lt;br&gt;
  Serial.println(testFillScreen());&lt;br&gt;
  delay(500);&lt;/p&gt;

&lt;p&gt;Serial.print(F("Text                     "));&lt;br&gt;
  Serial.println(testText());&lt;br&gt;
  delay(3000);&lt;/p&gt;

&lt;p&gt;Serial.print(F("Lines                    "));&lt;br&gt;
  Serial.println(testLines(ILI9488_CYAN));&lt;br&gt;
  delay(500);&lt;/p&gt;

&lt;p&gt;Serial.print(F("Horiz/Vert Lines         "));&lt;br&gt;
  Serial.println(testFastLines(ILI9488_RED, ILI9488_BLUE));&lt;br&gt;
  delay(500);&lt;/p&gt;

&lt;p&gt;Serial.print(F("Rectangles (outline)     "));&lt;br&gt;
  Serial.println(testRects(ILI9488_GREEN));&lt;br&gt;
  delay(500);&lt;/p&gt;

&lt;p&gt;Serial.print(F("Rectangles (filled)      "));&lt;br&gt;
  Serial.println(testFilledRects(ILI9488_YELLOW, ILI9488_MAGENTA));&lt;br&gt;
  delay(500);&lt;/p&gt;

&lt;p&gt;Serial.print(F("Circles (filled)         "));&lt;br&gt;
  Serial.println(testFilledCircles(10, ILI9488_MAGENTA));&lt;/p&gt;

&lt;p&gt;Serial.print(F("Circles (outline)        "));&lt;br&gt;
  Serial.println(testCircles(10, ILI9488_WHITE));&lt;br&gt;
  delay(500);&lt;/p&gt;

&lt;p&gt;Serial.print(F("Triangles (outline)      "));&lt;br&gt;
  Serial.println(testTriangles());&lt;br&gt;
  delay(500);&lt;/p&gt;

&lt;p&gt;Serial.print(F("Triangles (filled)       "));&lt;br&gt;
  Serial.println(testFilledTriangles());&lt;br&gt;
  delay(500);&lt;/p&gt;

&lt;p&gt;Serial.print(F("Rounded rects (outline)  "));&lt;br&gt;
  Serial.println(testRoundRects());&lt;br&gt;
  delay(500);&lt;/p&gt;

&lt;p&gt;Serial.print(F("Rounded rects (filled)   "));&lt;br&gt;
  Serial.println(testFilledRoundRects());&lt;br&gt;
  delay(500);&lt;/p&gt;

&lt;p&gt;Serial.println(F("Done!"));&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;void loop(void) {&lt;br&gt;
  for(uint8_t rotation=0; rotation&amp;lt;4; rotation++) {&lt;br&gt;
    tft.setRotation(rotation);&lt;br&gt;
    testText();&lt;br&gt;
    delay(1000);&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;unsigned long testFillScreen() {&lt;br&gt;
  unsigned long start = micros();&lt;br&gt;
  tft.fillScreen(ILI9488_BLACK);&lt;br&gt;
  tft.fillScreen(ILI9488_RED);&lt;br&gt;
  tft.fillScreen(ILI9488_GREEN);&lt;br&gt;
  tft.fillScreen(ILI9488_BLUE);&lt;br&gt;
  tft.fillScreen(ILI9488_BLACK);&lt;br&gt;
  return micros() - start;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;unsigned long testText() {&lt;br&gt;
  tft.fillScreen(ILI9488_BLACK);&lt;br&gt;
  unsigned long start = micros();&lt;br&gt;
  tft.setCursor(0, 0);&lt;br&gt;
  tft.setTextColor(ILI9488_WHITE);  tft.setTextSize(1);&lt;br&gt;
  tft.println("Hello World!");&lt;br&gt;
  tft.setTextColor(ILI9488_YELLOW); tft.setTextSize(2);&lt;br&gt;
  tft.println(1234.56);&lt;br&gt;
  tft.setTextColor(ILI9488_RED);    tft.setTextSize(3);&lt;br&gt;
  tft.println(0xDEADBEEF, HEX);&lt;br&gt;
  tft.println();&lt;br&gt;
  tft.setTextColor(ILI9488_GREEN);&lt;br&gt;
  tft.setTextSize(5);&lt;br&gt;
  tft.println("Groop");&lt;br&gt;
  tft.setTextSize(2);&lt;br&gt;
  tft.println("I implore thee,");&lt;br&gt;
  tft.setTextSize(1);&lt;br&gt;
  tft.println("my foonting turlingdromes.");&lt;br&gt;
  tft.println("And hooptiously drangle me");&lt;br&gt;
  tft.println("with crinkly bindlewurdles,");&lt;br&gt;
  tft.println("Or I will rend thee");&lt;br&gt;
  tft.println("in the gobberwarts");&lt;br&gt;
  tft.println("with my blurglecruncheon,");&lt;br&gt;
  tft.println("see if I don't!");&lt;br&gt;
  return micros() - start;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;unsigned long testLines(uint16_t color) {&lt;br&gt;
  unsigned long start, t;&lt;br&gt;
  int           x1, y1, x2, y2,&lt;br&gt;
                w = tft.width(),&lt;br&gt;
                h = tft.height();&lt;/p&gt;

&lt;p&gt;tft.fillScreen(ILI9488_BLACK);&lt;/p&gt;

&lt;p&gt;x1 = y1 = 0;&lt;br&gt;
  y2    = h - 1;&lt;br&gt;
  start = micros();&lt;br&gt;
  for(x2=0; x2&amp;lt;w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);&lt;br&gt;
  x2    = w - 1;&lt;br&gt;
  for(y2=0; y2&amp;lt;h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);&lt;br&gt;
  t     = micros() - start; // fillScreen doesn't count against timing&lt;/p&gt;

&lt;p&gt;tft.fillScreen(ILI9488_BLACK);&lt;/p&gt;

&lt;p&gt;x1    = w - 1;&lt;br&gt;
  y1    = 0;&lt;br&gt;
  y2    = h - 1;&lt;br&gt;
  start = micros();&lt;br&gt;
  for(x2=0; x2&amp;lt;w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);&lt;br&gt;
  x2    = 0;&lt;br&gt;
  for(y2=0; y2&amp;lt;h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);&lt;br&gt;
  t    += micros() - start;&lt;/p&gt;

&lt;p&gt;tft.fillScreen(ILI9488_BLACK);&lt;/p&gt;

&lt;p&gt;x1    = 0;&lt;br&gt;
  y1    = h - 1;&lt;br&gt;
  y2    = 0;&lt;br&gt;
  start = micros();&lt;br&gt;
  for(x2=0; x2&amp;lt;w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);&lt;br&gt;
  x2    = w - 1;&lt;br&gt;
  for(y2=0; y2&amp;lt;h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);&lt;br&gt;
  t    += micros() - start;&lt;/p&gt;

&lt;p&gt;tft.fillScreen(ILI9488_BLACK);&lt;/p&gt;

&lt;p&gt;x1    = w - 1;&lt;br&gt;
  y1    = h - 1;&lt;br&gt;
  y2    = 0;&lt;br&gt;
  start = micros();&lt;br&gt;
  for(x2=0; x2&amp;lt;w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);&lt;br&gt;
  x2    = 0;&lt;br&gt;
  for(y2=0; y2&amp;lt;h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);&lt;/p&gt;

&lt;p&gt;return micros() - start;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;unsigned long testFastLines(uint16_t color1, uint16_t color2) {&lt;br&gt;
  unsigned long start;&lt;br&gt;
  int           x, y, w = tft.width(), h = tft.height();&lt;/p&gt;

&lt;p&gt;tft.fillScreen(ILI9488_BLACK);&lt;br&gt;
  start = micros();&lt;br&gt;
  for(y=0; y&amp;lt;h; y+=5) tft.drawFastHLine(0, y, w, color1);&lt;br&gt;
  for(x=0; x&amp;lt;w; x+=5) tft.drawFastVLine(x, 0, h, color2);&lt;/p&gt;

&lt;p&gt;return micros() - start;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;unsigned long testRects(uint16_t color) {&lt;br&gt;
  unsigned long start;&lt;br&gt;
  int           n, i, i2,&lt;br&gt;
                cx = tft.width()  / 2,&lt;br&gt;
                cy = tft.height() / 2;&lt;/p&gt;

&lt;p&gt;tft.fillScreen(ILI9488_BLACK);&lt;br&gt;
  n     = min(tft.width(), tft.height());&lt;br&gt;
  start = micros();&lt;br&gt;
  for(i=2; i&amp;lt;n; i+=6) {&lt;br&gt;
    i2 = i / 2;&lt;br&gt;
    tft.drawRect(cx-i2, cy-i2, i, i, color);&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;return micros() - start;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;unsigned long testFilledRects(uint16_t color1, uint16_t color2) {&lt;br&gt;
  unsigned long start, t = 0;&lt;br&gt;
  int           n, i, i2,&lt;br&gt;
                cx = tft.width()  / 2 - 1,&lt;br&gt;
                cy = tft.height() / 2 - 1;&lt;/p&gt;

&lt;p&gt;tft.fillScreen(ILI9488_BLACK);&lt;br&gt;
  n = min(tft.width(), tft.height());&lt;br&gt;
  for(i=n; i&amp;gt;0; i-=6) {&lt;br&gt;
    i2    = i / 2;&lt;br&gt;
    start = micros();&lt;br&gt;
    tft.fillRect(cx-i2, cy-i2, i, i, color1);&lt;br&gt;
    t    += micros() - start;&lt;br&gt;
    // Outlines are not included in timing results&lt;br&gt;
    tft.drawRect(cx-i2, cy-i2, i, i, color2);&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;return t;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;unsigned long testFilledCircles(uint8_t radius, uint16_t color) {&lt;br&gt;
  unsigned long start;&lt;br&gt;
  int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2;&lt;/p&gt;

&lt;p&gt;tft.fillScreen(ILI9488_BLACK);&lt;br&gt;
  start = micros();&lt;br&gt;
  for(x=radius; x&amp;lt;w; x+=r2) {&lt;br&gt;
    for(y=radius; y&amp;lt;h; y+=r2) {&lt;br&gt;
      tft.fillCircle(x, y, radius, color);&lt;br&gt;
    }&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;return micros() - start;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;unsigned long testCircles(uint8_t radius, uint16_t color) {&lt;br&gt;
  unsigned long start;&lt;br&gt;
  int           x, y, r2 = radius * 2,&lt;br&gt;
                w = tft.width()  + radius,&lt;br&gt;
                h = tft.height() + radius;&lt;/p&gt;

&lt;p&gt;// Screen is not cleared for this one -- this is&lt;br&gt;
  // intentional and does not affect the reported time.&lt;br&gt;
  start = micros();&lt;br&gt;
  for(x=0; x&amp;lt;w; x+=r2) {&lt;br&gt;
    for(y=0; y&amp;lt;h; y+=r2) {&lt;br&gt;
      tft.drawCircle(x, y, radius, color);&lt;br&gt;
    }&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;return micros() - start;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;unsigned long testTriangles() {&lt;br&gt;
  unsigned long start;&lt;br&gt;
  int           n, i, cx = tft.width()  / 2 - 1,&lt;br&gt;
                      cy = tft.height() / 2 - 1;&lt;/p&gt;

&lt;p&gt;tft.fillScreen(ILI9488_BLACK);&lt;br&gt;
  n     = min(cx, cy);&lt;br&gt;
  start = micros();&lt;br&gt;
  for(i=0; i&amp;lt;n; i+=5) {&lt;br&gt;
    tft.drawTriangle(&lt;br&gt;
      cx    , cy - i, // peak&lt;br&gt;
      cx - i, cy + i, // bottom left&lt;br&gt;
      cx + i, cy + i, // bottom right&lt;br&gt;
      tft.color565(0, 0, i));&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;return micros() - start;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;unsigned long testFilledTriangles() {&lt;br&gt;
  unsigned long start, t = 0;&lt;br&gt;
  int           i, cx = tft.width()  / 2 - 1,&lt;br&gt;
                   cy = tft.height() / 2 - 1;&lt;/p&gt;

&lt;p&gt;tft.fillScreen(ILI9488_BLACK);&lt;br&gt;
  start = micros();&lt;br&gt;
  for(i=min(cx,cy); i&amp;gt;10; i-=5) {&lt;br&gt;
    start = micros();&lt;br&gt;
    tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,&lt;br&gt;
      tft.color565(0, i, i));&lt;br&gt;
    t += micros() - start;&lt;br&gt;
    tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,&lt;br&gt;
      tft.color565(i, i, 0));&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;return t;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;unsigned long testRoundRects() {&lt;br&gt;
  unsigned long start;&lt;br&gt;
  int           w, i, i2,&lt;br&gt;
                cx = tft.width()  / 2 - 1,&lt;br&gt;
                cy = tft.height() / 2 - 1;&lt;/p&gt;

&lt;p&gt;tft.fillScreen(ILI9488_BLACK);&lt;br&gt;
  w     = min(tft.width(), tft.height());&lt;br&gt;
  start = micros();&lt;br&gt;
  for(i=0; i&amp;lt;w; i+=6) {&lt;br&gt;
    i2 = i / 2;&lt;br&gt;
    tft.drawRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(i, 0, 0));&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;return micros() - start;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;unsigned long testFilledRoundRects() {&lt;br&gt;
  unsigned long start;&lt;br&gt;
  int           i, i2,&lt;br&gt;
                cx = tft.width()  / 2 - 1,&lt;br&gt;
                cy = tft.height() / 2 - 1;&lt;/p&gt;

&lt;p&gt;tft.fillScreen(ILI9488_BLACK);&lt;br&gt;
  start = micros();&lt;br&gt;
  for(i=min(tft.width(), tft.height()); i&amp;gt;20; i-=6) {&lt;br&gt;
    i2 = i / 2;&lt;br&gt;
    tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0));&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;return micros() - start;&lt;br&gt;
}&lt;br&gt;
/***************************************************&lt;br&gt;
  STM32 Support added by Jaret Burkett at OSHlab.com&lt;/p&gt;

&lt;p&gt;This is our library for the Adafruit  ILI9488 Breakout and Shield&lt;br&gt;
  ----&amp;gt; &lt;a href="http://www.adafruit.com/products/1651"&gt;http://www.adafruit.com/products/1651&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check out the links above for our tutorials and wiring diagrams&lt;br&gt;
  These displays use SPI to communicate, 4 or 5 pins are required to&lt;br&gt;
  interface (RST is optional)&lt;br&gt;
  Adafruit invests time and resources providing this open source code,&lt;br&gt;
  please support Adafruit and open-source hardware by purchasing&lt;br&gt;
  products from Adafruit!&lt;/p&gt;

&lt;p&gt;Written by Limor Fried/Ladyada for Adafruit Industries.&lt;br&gt;
  MIT license, all text above must be included in any redistribution&lt;br&gt;
 ****************************************************/&lt;/p&gt;

&lt;h1&gt;
  
  
  ifndef &lt;em&gt;ILI9488H&lt;/em&gt;
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define &lt;em&gt;ILI9488H&lt;/em&gt;
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if ARDUINO &amp;gt;= 100
&lt;/h1&gt;

&lt;p&gt;#include "Arduino.h"&lt;br&gt;
 #include "Print.h"&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;p&gt;#include "WProgram.h"&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef __AVR
&lt;/h1&gt;

&lt;p&gt;#include &lt;/p&gt;

&lt;h1&gt;
  
  
  elif defined(ESP8266)
&lt;/h1&gt;

&lt;p&gt;#include &lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if defined(ARDUINO_STM32_FEATHER) || defined(ARDUINO_ARCH_RP2040)
&lt;/h1&gt;

&lt;p&gt;typedef volatile uint32_t RwReg;&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if defined (&lt;strong&gt;AVR&lt;/strong&gt;) || defined(TEENSYDUINO) || defined (&lt;strong&gt;arm&lt;/strong&gt;) || defined (&lt;strong&gt;STM32F1&lt;/strong&gt;)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define USE_FAST_PINIO
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if defined(ARDUINO_ARCH_RP2040)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  undef USE_FAST_PINIO
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_TFTWIDTH  320
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_TFTHEIGHT 480
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_NOP     0x00
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_SWRESET 0x01
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_RDDID   0x04
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_RDDST   0x09
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_SLPIN   0x10
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_SLPOUT  0x11
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_PTLON   0x12
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_NORON   0x13
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_RDMODE  0x0A
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_RDMADCTL  0x0B
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_RDPIXFMT  0x0C
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_RDIMGFMT  0x0D
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_RDSELFDIAG  0x0F
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_INVOFF  0x20
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_INVON   0x21
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_GAMMASET 0x26
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_DISPOFF 0x28
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_DISPON  0x29
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_CASET   0x2A
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_PASET   0x2B
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_RAMWR   0x2C
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_RAMRD   0x2E
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_PTLAR   0x30
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_MADCTL  0x36
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_PIXFMT  0x3A
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_FRMCTR1 0xB1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_FRMCTR2 0xB2
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_FRMCTR3 0xB3
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_INVCTR  0xB4
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_DFUNCTR 0xB6
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_PWCTR1  0xC0
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_PWCTR2  0xC1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_PWCTR3  0xC2
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_PWCTR4  0xC3
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_PWCTR5  0xC4
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_VMCTR1  0xC5
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_VMCTR2  0xC7
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_RDID1   0xDA
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_RDID2   0xDB
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_RDID3   0xDC
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_RDID4   0xDD
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_GMCTRP1 0xE0
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_GMCTRN1 0xE1
&lt;/h1&gt;

&lt;p&gt;/*&lt;/p&gt;

&lt;h1&gt;
  
  
  define ILI9488_PWCTR6  0xFC
&lt;/h1&gt;

&lt;p&gt;*/&lt;/p&gt;

&lt;p&gt;// Color definitions&lt;/p&gt;

&lt;h1&gt;
  
  
  define ILI9488_BLACK       0x0000      /*   0,   0,   0 */
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_NAVY        0x000F      /*   0,   0, 128 */
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_DARKGREEN   0x03E0      /*   0, 128,   0 */
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_DARKCYAN    0x03EF      /*   0, 128, 128 */
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_MAROON      0x7800      /* 128,   0,   0 */
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_PURPLE      0x780F      /* 128,   0, 128 */
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_OLIVE       0x7BE0      /* 128, 128,   0 */
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_LIGHTGREY   0xC618      /* 192, 192, 192 */
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_DARKGREY    0x7BEF      /* 128, 128, 128 */
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_BLUE        0x001F      /*   0,   0, 255 */
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_GREEN       0x07E0      /*   0, 255,   0 */
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_CYAN        0x07FF      /*   0, 255, 255 */
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_RED         0xF800      /* 255,   0,   0 */
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_MAGENTA     0xF81F      /* 255,   0, 255 */
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_YELLOW      0xFFE0      /* 255, 255,   0 */
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_WHITE       0xFFFF      /* 255, 255, 255 */
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_ORANGE      0xFD20      /* 255, 165,   0 */
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_GREENYELLOW 0xAFE5      /* 173, 255,  47 */
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define ILI9488_PINK        0xF81F
&lt;/h1&gt;

&lt;p&gt;class ILI9488 : public Adafruit_GFX {&lt;/p&gt;

&lt;p&gt;public:&lt;/p&gt;

&lt;p&gt;ILI9488(int8_t _CS, int8_t _DC, int8_t _MOSI, int8_t _SCLK,&lt;br&gt;
           int8_t _RST, int8_t _MISO);&lt;br&gt;
  ILI9488(int8_t _CS, int8_t _DC, int8_t _RST = -1);&lt;/p&gt;

&lt;p&gt;void     begin(void),&lt;br&gt;
           setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1),&lt;br&gt;
           setScrollArea(uint16_t topFixedArea, uint16_t bottomFixedArea),&lt;br&gt;
           scroll(uint16_t pixels),&lt;br&gt;
           pushColor(uint16_t color),&lt;br&gt;
           pushColors(uint16_t &lt;em&gt;data, uint8_t len, boolean first),&lt;br&gt;
           drawImage(const uint8_t&lt;/em&gt; img, uint16_t x, uint16_t y, uint16_t w, uint16_t h),&lt;br&gt;
           fillScreen(uint16_t color),&lt;br&gt;
           drawPixel(int16_t x, int16_t y, uint16_t color),&lt;br&gt;
           drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color),&lt;br&gt;
           drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color),&lt;br&gt;
           fillRect(int16_t x, int16_t y, int16_t w, int16_t h,&lt;br&gt;
             uint16_t color),&lt;br&gt;
           setRotation(uint8_t r),&lt;br&gt;
           invertDisplay(boolean i);&lt;br&gt;
  uint16_t color565(uint8_t r, uint8_t g, uint8_t b);&lt;/p&gt;

&lt;p&gt;/* These are not for current use, 8-bit protocol only! &lt;em&gt;/&lt;br&gt;
  uint8_t  readdata(void),&lt;br&gt;
    readcommand8(uint8_t reg, uint8_t index = 0);&lt;br&gt;
  /&lt;/em&gt;&lt;br&gt;
  uint16_t readcommand16(uint8_t);&lt;br&gt;
  uint32_t readcommand32(uint8_t);&lt;br&gt;
  void     dummyclock(void);&lt;br&gt;
  */&lt;/p&gt;

&lt;p&gt;void     spiwrite(uint8_t),&lt;br&gt;
    writecommand(uint8_t c),&lt;br&gt;
    write16BitColor(uint16_t color),&lt;br&gt;
    writedata(uint8_t d),&lt;br&gt;
    commandList(uint8_t *addr);&lt;br&gt;
  uint8_t  spiread(void);&lt;/p&gt;

&lt;p&gt;private:&lt;br&gt;
  uint8_t  tabcolor;&lt;/p&gt;

&lt;p&gt;boolean  hwSPI;&lt;/p&gt;

&lt;h1&gt;
  
  
  if defined (&lt;strong&gt;AVR&lt;/strong&gt;) || defined(TEENSYDUINO)
&lt;/h1&gt;

&lt;p&gt;uint8_t mySPCR;&lt;br&gt;
  volatile uint8_t *mosiport, *clkport, *dcport, *rsport, *csport;&lt;br&gt;
  int8_t  _cs, _dc, _rst, _mosi, _miso, _sclk;&lt;br&gt;
  uint8_t  mosipinmask, clkpinmask, cspinmask, dcpinmask;&lt;br&gt;
////This def is for the Arduino.ORG M0!!!&lt;br&gt;
//#elif defined(ARDUINO_SAM_ZERO)&lt;br&gt;
//    volatile PORT_OUT_Type *mosiport, *clkport, *dcport, *rsport, *csport;&lt;br&gt;
//    int32_t  _cs, _dc, _rst, _mosi, _miso, _sclk;&lt;br&gt;
//    PORT_OUT_Type  mosipinmask, clkpinmask, cspinmask, dcpinmask;&lt;/p&gt;

&lt;h1&gt;
  
  
  elif defined (&lt;strong&gt;STM32F1&lt;/strong&gt;) || defined (&lt;em&gt;VARIANT_ARDUINO_STM32&lt;/em&gt;) || defined (STM32F100xE) || defined (STM32F101xE) || defined (STM32F101xG) || defined (STM32F103xE) || defined (STM32F103xG) || defined (STM32F105xC) || defined (STM32F107xC)
&lt;/h1&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;uint8_t mySPCR;&lt;br&gt;
volatile uint32_t *mosiport, *clkport, *dcport, *rsport, *csport;&lt;br&gt;
int32_t  _cs, _dc, _rst, _mosi, _miso, _sclk;&lt;br&gt;
uint32_t  mosipinmask, clkpinmask, cspinmask, dcpinmask;&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  elif defined (&lt;strong&gt;arm&lt;/strong&gt;)&lt;br&gt;
&lt;/h1&gt;
&lt;br&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;volatile RwReg *mosiport, *clkport, *dcport, *rsport, *csport;&lt;br&gt;
int32_t  _cs, _dc, _rst, _mosi, _miso, _sclk;&lt;br&gt;
uint32_t  mosipinmask, clkpinmask, cspinmask, dcpinmask;&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  elif defined (ESP8266)&lt;br&gt;
&lt;/h1&gt;
&lt;br&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;int32_t  _cs, _dc, _rst, _mosi, _miso, _sclk;&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  else&lt;br&gt;
&lt;/h1&gt;
&lt;br&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;int8_t  _cs, _dc, _rst, _mosi, _miso, _sclk;&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  endif&lt;br&gt;
&lt;/h1&gt;

&lt;p&gt;};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

</description>
      <category>aws</category>
      <category>css</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>notebook 3d printer</title>
      <dc:creator>jay jordan</dc:creator>
      <pubDate>Mon, 25 Dec 2023 16:01:56 +0000</pubDate>
      <link>https://dev.to/jayjo87/notebook-3d-printer-3h50</link>
      <guid>https://dev.to/jayjo87/notebook-3d-printer-3h50</guid>
      <description>&lt;h1&gt;
  
  
  define X_STEP_PIN      54
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_DIR_PIN       55
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_ENABLE_PIN       38
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_MIN_PIN           3
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_MAX_PIN           2
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_STEP_PIN         60
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_DIR_PIN          61
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_ENABLE_PIN       56
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_MIN_PIN          14
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_MAX_PIN          15
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_STEP_PIN         46
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_DIR_PIN          48
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_ENABLE_PIN       62
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_MIN_PIN          18
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_MAX_PIN          19
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_STEP_PIN         26
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_DIR_PIN          28
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_ENABLE_PIN       24
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_STEP_PIN     36
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_DIR_PIN          34
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_ENABLE_PIN       30
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define SDPOWER            -1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define SDSS               53
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define LED_PIN            13
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define FAN_PIN         9
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define PS_ON_PIN          12
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define KILL_PIN           -1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define HEATER_0_PIN       10
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define HEATER_1_PIN    8
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TEMP_0_PIN          13   // ANALOG NUMBERING
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TEMP_1_PIN          14   // ANALOG NUMBERING
&lt;/h1&gt;

&lt;p&gt;void setup() {&lt;/p&gt;

&lt;p&gt;pinMode(FAN_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(HEATER_0_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(HEATER_1_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(LED_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_DIR_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_ENABLE_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_DIR_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_ENABLE_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_DIR_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_ENABLE_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_DIR_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_ENABLE_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_DIR_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_ENABLE_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;digitalWrite(X_ENABLE_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_ENABLE_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_ENABLE_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_ENABLE_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_ENABLE_PIN , LOW);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;void loop () {&lt;/p&gt;

&lt;p&gt;if (millis() %1000 &amp;lt;500)&lt;/p&gt;

&lt;p&gt;digitalWrite(LED_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;else&lt;/p&gt;

&lt;p&gt;digitalWrite(LED_PIN, LOW);&lt;/p&gt;

&lt;p&gt;if (millis() %1000 &amp;lt;300) {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, LOW);&lt;/p&gt;

&lt;p&gt;} else if (millis() %1000 &amp;lt;600) {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, LOW);&lt;/p&gt;

&lt;p&gt;} else  {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;if (millis() %10000 &amp;lt;5000) {&lt;/p&gt;

&lt;p&gt;digitalWrite(X_DIR_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_DIR_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_DIR_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_DIR_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_DIR_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;else {&lt;/p&gt;

&lt;p&gt;digitalWrite(X_DIR_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_DIR_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_DIR_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_DIR_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_DIR_PIN , LOW);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;digitalWrite(X_STEP_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_STEP_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_STEP_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_STEP_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_STEP_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;delay(1);&lt;/p&gt;

&lt;p&gt;digitalWrite(X_STEP_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_STEP_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_STEP_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_STEP_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_STEP_PIN , LOW);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;This code should activate all the steppers, fans, and heaters. The only problem with this code is that it does not activate both z-axis steppers; it only activates one. If you encounter any problems with any of the components, try isolating them and only running them in the code. If you would like to test the z-axis and thermistor, download the following codes:&lt;/p&gt;



&lt;h1&gt;
  
  
  ifndef THERMISTORTABLES_H_
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define THERMISTORTABLES_H_
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define OVERSAMPLENR 16
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 1) || (THERMISTORHEATER_1 == 1)  || (THERMISTORHEATER_2 == 1) || (THERMISTORBED == 1) //100k bed thermistor
&lt;/h1&gt;

&lt;p&gt;const short temptable_1[][2] PROGMEM = {&lt;br&gt;
{       23*OVERSAMPLENR ,       300     },&lt;br&gt;
{       25*OVERSAMPLENR ,       295     },&lt;br&gt;
{       27*OVERSAMPLENR ,       290     },&lt;br&gt;
{       28*OVERSAMPLENR ,       285     },&lt;br&gt;
{       31*OVERSAMPLENR ,       280     },&lt;br&gt;
{       33*OVERSAMPLENR ,       275     },&lt;br&gt;
{       35*OVERSAMPLENR ,       270     },&lt;br&gt;
{       38*OVERSAMPLENR ,       265     },&lt;br&gt;
{       41*OVERSAMPLENR ,       260     },&lt;br&gt;
{       44*OVERSAMPLENR ,       255     },&lt;br&gt;
{       48*OVERSAMPLENR ,       250     },&lt;br&gt;
{       52*OVERSAMPLENR ,       245     },&lt;br&gt;
{       56*OVERSAMPLENR ,       240     },&lt;br&gt;
{       61*OVERSAMPLENR ,       235     },&lt;br&gt;
{       66*OVERSAMPLENR ,       230     },&lt;br&gt;
{       71*OVERSAMPLENR ,       225     },&lt;br&gt;
{       78*OVERSAMPLENR ,       220     },&lt;br&gt;
{       84*OVERSAMPLENR ,       215     },&lt;br&gt;
{       92*OVERSAMPLENR ,       210     },&lt;br&gt;
{       100*OVERSAMPLENR        ,       205     },&lt;br&gt;
{       109*OVERSAMPLENR        ,       200     },&lt;br&gt;
{       120*OVERSAMPLENR        ,       195     },&lt;br&gt;
{       131*OVERSAMPLENR        ,       190     },&lt;br&gt;
{       143*OVERSAMPLENR        ,       185     },&lt;br&gt;
{       156*OVERSAMPLENR        ,       180     },&lt;br&gt;
{       171*OVERSAMPLENR        ,       175     },&lt;br&gt;
{       187*OVERSAMPLENR        ,       170     },&lt;br&gt;
{       205*OVERSAMPLENR        ,       165     },&lt;br&gt;
{       224*OVERSAMPLENR        ,       160     },&lt;br&gt;
{       245*OVERSAMPLENR        ,       155     },&lt;br&gt;
{       268*OVERSAMPLENR        ,       150     },&lt;br&gt;
{       293*OVERSAMPLENR        ,       145     },&lt;br&gt;
{       320*OVERSAMPLENR        ,       140     },&lt;br&gt;
{       348*OVERSAMPLENR        ,       135     },&lt;br&gt;
{       379*OVERSAMPLENR        ,       130     },&lt;br&gt;
{       411*OVERSAMPLENR        ,       125     },&lt;br&gt;
{       445*OVERSAMPLENR        ,       120     },&lt;br&gt;
{       480*OVERSAMPLENR        ,       115     },&lt;br&gt;
{       516*OVERSAMPLENR        ,       110     },&lt;br&gt;
{       553*OVERSAMPLENR        ,       105     },&lt;br&gt;
{       591*OVERSAMPLENR        ,       100     },&lt;br&gt;
{       628*OVERSAMPLENR        ,       95      },&lt;br&gt;
{       665*OVERSAMPLENR        ,       90      },&lt;br&gt;
{       702*OVERSAMPLENR        ,       85      },&lt;br&gt;
{       737*OVERSAMPLENR        ,       80      },&lt;br&gt;
{       770*OVERSAMPLENR        ,       75      },&lt;br&gt;
{       801*OVERSAMPLENR        ,       70      },&lt;br&gt;
{       830*OVERSAMPLENR        ,       65      },&lt;br&gt;
{       857*OVERSAMPLENR        ,       60      },&lt;br&gt;
{       881*OVERSAMPLENR        ,       55      },&lt;br&gt;
{       903*OVERSAMPLENR        ,       50      },&lt;br&gt;
{       922*OVERSAMPLENR        ,       45      },&lt;br&gt;
{       939*OVERSAMPLENR        ,       40      },&lt;br&gt;
{       954*OVERSAMPLENR        ,       35      },&lt;br&gt;
{       966*OVERSAMPLENR        ,       30      },&lt;br&gt;
{       977*OVERSAMPLENR        ,       25      },&lt;br&gt;
{       985*OVERSAMPLENR        ,       20      },&lt;br&gt;
{       993*OVERSAMPLENR        ,       15      },&lt;br&gt;
{       999*OVERSAMPLENR        ,       10      },&lt;br&gt;
{       1004*OVERSAMPLENR       ,       5       },&lt;br&gt;
{       1008*OVERSAMPLENR       ,       0       } //safety&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 2) || (THERMISTORHEATER_1 == 2) || (THERMISTORHEATER_2 == 2) || (THERMISTORBED == 2) //200k bed thermistor
&lt;/h1&gt;

&lt;p&gt;const short temptable_2[][2] PROGMEM = {&lt;br&gt;
  {1*OVERSAMPLENR, 848},&lt;br&gt;
  {54*OVERSAMPLENR, 275},&lt;br&gt;
  {107*OVERSAMPLENR, 228},&lt;br&gt;
  {160*OVERSAMPLENR, 202},&lt;br&gt;
  {213*OVERSAMPLENR, 185},&lt;br&gt;
  {266*OVERSAMPLENR, 171},&lt;br&gt;
  {319*OVERSAMPLENR, 160},&lt;br&gt;
  {372*OVERSAMPLENR, 150},&lt;br&gt;
  {425*OVERSAMPLENR, 141},&lt;br&gt;
  {478*OVERSAMPLENR, 133},&lt;br&gt;
  {531*OVERSAMPLENR, 125},&lt;br&gt;
  {584*OVERSAMPLENR, 118},&lt;br&gt;
  {637*OVERSAMPLENR, 110},&lt;br&gt;
  {690*OVERSAMPLENR, 103},&lt;br&gt;
  {743*OVERSAMPLENR, 95},&lt;br&gt;
  {796*OVERSAMPLENR, 86},&lt;br&gt;
  {849*OVERSAMPLENR, 77},&lt;br&gt;
  {902*OVERSAMPLENR, 65},&lt;br&gt;
  {955*OVERSAMPLENR, 49},&lt;br&gt;
  {1008*OVERSAMPLENR, 17},&lt;br&gt;
  {1020*OVERSAMPLENR, 0} //safety&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 3) || (THERMISTORHEATER_1 == 3) || (THERMISTORHEATER_2 == 3) || (THERMISTORBED == 3) //mendel-parts
&lt;/h1&gt;

&lt;p&gt;const short temptable_3[][2] PROGMEM = {&lt;br&gt;
               {1*OVERSAMPLENR,864},&lt;br&gt;
               {21*OVERSAMPLENR,300},&lt;br&gt;
               {25*OVERSAMPLENR,290},&lt;br&gt;
               {29*OVERSAMPLENR,280},&lt;br&gt;
               {33*OVERSAMPLENR,270},&lt;br&gt;
               {39*OVERSAMPLENR,260},&lt;br&gt;
               {46*OVERSAMPLENR,250},&lt;br&gt;
               {54*OVERSAMPLENR,240},&lt;br&gt;
               {64*OVERSAMPLENR,230},&lt;br&gt;
               {75*OVERSAMPLENR,220},&lt;br&gt;
               {90*OVERSAMPLENR,210},&lt;br&gt;
               {107*OVERSAMPLENR,200},&lt;br&gt;
               {128*OVERSAMPLENR,190},&lt;br&gt;
               {154*OVERSAMPLENR,180},&lt;br&gt;
               {184*OVERSAMPLENR,170},&lt;br&gt;
               {221*OVERSAMPLENR,160},&lt;br&gt;
               {265*OVERSAMPLENR,150},&lt;br&gt;
               {316*OVERSAMPLENR,140},&lt;br&gt;
               {375*OVERSAMPLENR,130},&lt;br&gt;
               {441*OVERSAMPLENR,120},&lt;br&gt;
               {513*OVERSAMPLENR,110},&lt;br&gt;
               {588*OVERSAMPLENR,100},&lt;br&gt;
               {734*OVERSAMPLENR,80},&lt;br&gt;
               {856*OVERSAMPLENR,60},&lt;br&gt;
               {938*OVERSAMPLENR,40},&lt;br&gt;
               {986*OVERSAMPLENR,20},&lt;br&gt;
               {1008*OVERSAMPLENR,0},&lt;br&gt;
               {1018*OVERSAMPLENR,-20}&lt;br&gt;
       };&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 4) || (THERMISTORHEATER_1 == 4) || (THERMISTORHEATER_2 == 4) || (THERMISTORBED == 4) //10k thermistor
&lt;/h1&gt;

&lt;p&gt;const short temptable_4[][2] PROGMEM = {&lt;br&gt;
  {1*OVERSAMPLENR, 430},&lt;br&gt;
  {54*OVERSAMPLENR, 137},&lt;br&gt;
  {107*OVERSAMPLENR, 107},&lt;br&gt;
  {160*OVERSAMPLENR, 91},&lt;br&gt;
  {213*OVERSAMPLENR, 80},&lt;br&gt;
  {266*OVERSAMPLENR, 71},&lt;br&gt;
  {319*OVERSAMPLENR, 64},&lt;br&gt;
  {372*OVERSAMPLENR, 57},&lt;br&gt;
  {425*OVERSAMPLENR, 51},&lt;br&gt;
  {478*OVERSAMPLENR, 46},&lt;br&gt;
  {531*OVERSAMPLENR, 41},&lt;br&gt;
  {584*OVERSAMPLENR, 35},&lt;br&gt;
  {637*OVERSAMPLENR, 30},&lt;br&gt;
  {690*OVERSAMPLENR, 25},&lt;br&gt;
  {743*OVERSAMPLENR, 20},&lt;br&gt;
  {796*OVERSAMPLENR, 14},&lt;br&gt;
  {849*OVERSAMPLENR, 7},&lt;br&gt;
  {902*OVERSAMPLENR, 0},&lt;br&gt;
  {955*OVERSAMPLENR, -11},&lt;br&gt;
  {1008*OVERSAMPLENR, -35}&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 5) || (THERMISTORHEATER_1 == 5) || (THERMISTORHEATER_2 == 5) || (THERMISTORBED == 5) //100k ParCan thermistor (104GT-2)
&lt;/h1&gt;

&lt;p&gt;const short temptable_5[][2] PROGMEM = {&lt;br&gt;
{1*OVERSAMPLENR, 713},&lt;br&gt;
{18*OVERSAMPLENR, 316},&lt;br&gt;
{35*OVERSAMPLENR, 266},&lt;br&gt;
{52*OVERSAMPLENR, 239},&lt;br&gt;
{69*OVERSAMPLENR, 221},&lt;br&gt;
{86*OVERSAMPLENR, 208},&lt;br&gt;
{103*OVERSAMPLENR, 197},&lt;br&gt;
{120*OVERSAMPLENR, 188},&lt;br&gt;
{137*OVERSAMPLENR, 181},&lt;br&gt;
{154*OVERSAMPLENR, 174},&lt;br&gt;
{171*OVERSAMPLENR, 169},&lt;br&gt;
{188*OVERSAMPLENR, 163},&lt;br&gt;
{205*OVERSAMPLENR, 159},&lt;br&gt;
{222*OVERSAMPLENR, 154},&lt;br&gt;
{239*OVERSAMPLENR, 150},&lt;br&gt;
{256*OVERSAMPLENR, 147},&lt;br&gt;
{273*OVERSAMPLENR, 143},&lt;br&gt;
{290*OVERSAMPLENR, 140},&lt;br&gt;
{307*OVERSAMPLENR, 136},&lt;br&gt;
{324*OVERSAMPLENR, 133},&lt;br&gt;
{341*OVERSAMPLENR, 130},&lt;br&gt;
{358*OVERSAMPLENR, 128},&lt;br&gt;
{375*OVERSAMPLENR, 125},&lt;br&gt;
{392*OVERSAMPLENR, 122},&lt;br&gt;
{409*OVERSAMPLENR, 120},&lt;br&gt;
{426*OVERSAMPLENR, 117},&lt;br&gt;
{443*OVERSAMPLENR, 115},&lt;br&gt;
{460*OVERSAMPLENR, 112},&lt;br&gt;
{477*OVERSAMPLENR, 110},&lt;br&gt;
{494*OVERSAMPLENR, 108},&lt;br&gt;
{511*OVERSAMPLENR, 106},&lt;br&gt;
{528*OVERSAMPLENR, 103},&lt;br&gt;
{545*OVERSAMPLENR, 101},&lt;br&gt;
{562*OVERSAMPLENR, 99},&lt;br&gt;
{579*OVERSAMPLENR, 97},&lt;br&gt;
{596*OVERSAMPLENR, 95},&lt;br&gt;
{613*OVERSAMPLENR, 92},&lt;br&gt;
{630*OVERSAMPLENR, 90},&lt;br&gt;
{647*OVERSAMPLENR, 88},&lt;br&gt;
{664*OVERSAMPLENR, 86},&lt;br&gt;
{681*OVERSAMPLENR, 84},&lt;br&gt;
{698*OVERSAMPLENR, 81},&lt;br&gt;
{715*OVERSAMPLENR, 79},&lt;br&gt;
{732*OVERSAMPLENR, 77},&lt;br&gt;
{749*OVERSAMPLENR, 75},&lt;br&gt;
{766*OVERSAMPLENR, 72},&lt;br&gt;
{783*OVERSAMPLENR, 70},&lt;br&gt;
{800*OVERSAMPLENR, 67},&lt;br&gt;
{817*OVERSAMPLENR, 64},&lt;br&gt;
{834*OVERSAMPLENR, 61},&lt;br&gt;
{851*OVERSAMPLENR, 58},&lt;br&gt;
{868*OVERSAMPLENR, 55},&lt;br&gt;
{885*OVERSAMPLENR, 52},&lt;br&gt;
{902*OVERSAMPLENR, 48},&lt;br&gt;
{919*OVERSAMPLENR, 44},&lt;br&gt;
{936*OVERSAMPLENR, 40},&lt;br&gt;
{953*OVERSAMPLENR, 34},&lt;br&gt;
{970*OVERSAMPLENR, 28},&lt;br&gt;
{987*OVERSAMPLENR, 20},&lt;br&gt;
{1004*OVERSAMPLENR, 8},&lt;br&gt;
{1021*OVERSAMPLENR, 0}&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 6) || (THERMISTORHEATER_1 == 6) || (THERMISTORHEATER_2 == 6) || (THERMISTORBED == 6) // 100k Epcos thermistor
&lt;/h1&gt;

&lt;p&gt;const short temptable_6[][2] PROGMEM = {&lt;br&gt;
  {28*OVERSAMPLENR, 250},&lt;br&gt;
  {31*OVERSAMPLENR, 245},&lt;br&gt;
  {35*OVERSAMPLENR, 240},&lt;br&gt;
  {39*OVERSAMPLENR, 235},&lt;br&gt;
  {42*OVERSAMPLENR, 230},&lt;br&gt;
  {44*OVERSAMPLENR, 225},&lt;br&gt;
  {49*OVERSAMPLENR, 220},&lt;br&gt;
  {53*OVERSAMPLENR, 215},&lt;br&gt;
  {62*OVERSAMPLENR, 210},&lt;br&gt;
  {73*OVERSAMPLENR, 205},&lt;br&gt;
  {72*OVERSAMPLENR, 200},&lt;br&gt;
  {94*OVERSAMPLENR, 190},&lt;br&gt;
  {102*OVERSAMPLENR, 185},&lt;br&gt;
  {116*OVERSAMPLENR, 170},&lt;br&gt;
  {143*OVERSAMPLENR, 160},&lt;br&gt;
  {183*OVERSAMPLENR, 150},&lt;br&gt;
  {223*OVERSAMPLENR, 140},&lt;br&gt;
  {270*OVERSAMPLENR, 130},&lt;br&gt;
  {318*OVERSAMPLENR, 120},&lt;br&gt;
  {383*OVERSAMPLENR, 110},&lt;br&gt;
  {413*OVERSAMPLENR, 105},&lt;br&gt;
  {439*OVERSAMPLENR, 100},&lt;br&gt;
  {484*OVERSAMPLENR, 95},&lt;br&gt;
  {513*OVERSAMPLENR, 90},&lt;br&gt;
  {607*OVERSAMPLENR, 80},&lt;br&gt;
  {664*OVERSAMPLENR, 70},&lt;br&gt;
  {781*OVERSAMPLENR, 60},&lt;br&gt;
  {810*OVERSAMPLENR, 55},&lt;br&gt;
  {849*OVERSAMPLENR, 50},&lt;br&gt;
  {914*OVERSAMPLENR, 45},&lt;br&gt;
  {914*OVERSAMPLENR, 40},&lt;br&gt;
  {935*OVERSAMPLENR, 35},&lt;br&gt;
  {954*OVERSAMPLENR, 30},&lt;br&gt;
  {970*OVERSAMPLENR, 25},&lt;br&gt;
  {978*OVERSAMPLENR, 22},&lt;br&gt;
  {1008*OVERSAMPLENR, 3}&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 7) || (THERMISTORHEATER_1 == 7) || (THERMISTORHEATER_2 == 7) || (THERMISTORBED == 7) // 100k Honeywell 135-104LAG-J01
&lt;/h1&gt;

&lt;p&gt;const short temptable_7[][2] PROGMEM = {&lt;br&gt;
  {46*OVERSAMPLENR, 270},&lt;br&gt;
  {50*OVERSAMPLENR, 265},&lt;br&gt;
  {54*OVERSAMPLENR, 260},&lt;br&gt;
  {58*OVERSAMPLENR, 255},&lt;br&gt;
  {62*OVERSAMPLENR, 250},&lt;br&gt;
  {67*OVERSAMPLENR, 245},&lt;br&gt;
  {72*OVERSAMPLENR, 240},&lt;br&gt;
  {79*OVERSAMPLENR, 235},&lt;br&gt;
  {85*OVERSAMPLENR, 230},&lt;br&gt;
  {91*OVERSAMPLENR, 225},&lt;br&gt;
  {99*OVERSAMPLENR, 220},&lt;br&gt;
  {107*OVERSAMPLENR, 215},&lt;br&gt;
  {116*OVERSAMPLENR, 210},&lt;br&gt;
  {126*OVERSAMPLENR, 205},&lt;br&gt;
  {136*OVERSAMPLENR, 200},&lt;br&gt;
  {149*OVERSAMPLENR, 195},&lt;br&gt;
  {160*OVERSAMPLENR, 190},&lt;br&gt;
  {175*OVERSAMPLENR, 185},&lt;br&gt;
  {191*OVERSAMPLENR, 180},&lt;br&gt;
  {209*OVERSAMPLENR, 175},&lt;br&gt;
  {224*OVERSAMPLENR, 170},&lt;br&gt;
  {246*OVERSAMPLENR, 165},&lt;br&gt;
  {267*OVERSAMPLENR, 160},&lt;br&gt;
  {293*OVERSAMPLENR, 155},&lt;br&gt;
  {316*OVERSAMPLENR, 150},&lt;br&gt;
  {340*OVERSAMPLENR, 145},&lt;br&gt;
  {364*OVERSAMPLENR, 140},&lt;br&gt;
  {396*OVERSAMPLENR, 135},&lt;br&gt;
  {425*OVERSAMPLENR, 130},&lt;br&gt;
  {460*OVERSAMPLENR, 125},&lt;br&gt;
  {489*OVERSAMPLENR, 120},&lt;br&gt;
  {526*OVERSAMPLENR, 115},&lt;br&gt;
  {558*OVERSAMPLENR, 110},&lt;br&gt;
  {591*OVERSAMPLENR, 105},&lt;br&gt;
  {628*OVERSAMPLENR, 100},&lt;br&gt;
  {660*OVERSAMPLENR, 95},&lt;br&gt;
  {696*OVERSAMPLENR, 90},&lt;br&gt;
  {733*OVERSAMPLENR, 85},&lt;br&gt;
  {761*OVERSAMPLENR, 80},&lt;br&gt;
  {794*OVERSAMPLENR, 75},&lt;br&gt;
  {819*OVERSAMPLENR, 70},&lt;br&gt;
  {847*OVERSAMPLENR, 65},&lt;br&gt;
  {870*OVERSAMPLENR, 60},&lt;br&gt;
  {892*OVERSAMPLENR, 55},&lt;br&gt;
  {911*OVERSAMPLENR, 50},&lt;br&gt;
  {929*OVERSAMPLENR, 45},&lt;br&gt;
  {944*OVERSAMPLENR, 40},&lt;br&gt;
  {959*OVERSAMPLENR, 35},&lt;br&gt;
  {971*OVERSAMPLENR, 30},&lt;br&gt;
  {981*OVERSAMPLENR, 25},&lt;br&gt;
  {989*OVERSAMPLENR, 20},&lt;br&gt;
  {994*OVERSAMPLENR, 15},&lt;br&gt;
  {1001*OVERSAMPLENR, 10},&lt;br&gt;
  {1005*OVERSAMPLENR, 5}&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define &lt;em&gt;TT_NAME(_N) temptable&lt;/em&gt; ## _N
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TT_NAME(_N) _TT_NAME(_N)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef THERMISTORHEATER_0
&lt;/h1&gt;

&lt;p&gt;#define heater_0_temptable TT_NAME(THERMISTORHEATER_0)&lt;br&gt;
 #define heater_0_temptable_len (sizeof(heater_0_temptable)/sizeof(*heater_0_temptable))&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef HEATER_0_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#error No heater 0 thermistor table specified&lt;/p&gt;

&lt;h1&gt;
  
  
  else  // HEATER_0_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#define heater_0_temptable 0&lt;br&gt;
 #define heater_0_temptable_len 0&lt;/p&gt;

&lt;h1&gt;
  
  
  endif // HEATER_0_USES_THERMISTOR
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef THERMISTORHEATER_1
&lt;/h1&gt;

&lt;p&gt;#define heater_1_temptable TT_NAME(THERMISTORHEATER_1)&lt;br&gt;
 #define heater_1_temptable_len (sizeof(heater_1_temptable)/sizeof(*heater_1_temptable))&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef HEATER_1_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#error No heater 1 thermistor table specified&lt;/p&gt;

&lt;h1&gt;
  
  
  else  // HEATER_1_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#define heater_1_temptable 0&lt;br&gt;
 #define heater_1_temptable_len 0&lt;/p&gt;

&lt;h1&gt;
  
  
  endif // HEATER_1_USES_THERMISTOR
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef THERMISTORHEATER_2
&lt;/h1&gt;

&lt;p&gt;#define heater_2_temptable TT_NAME(THERMISTORHEATER_2)&lt;br&gt;
 #define heater_2_temptable_len (sizeof(heater_2_temptable)/sizeof(*heater_2_temptable))&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef HEATER_2_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#error No heater 2 thermistor table specified&lt;/p&gt;

&lt;h1&gt;
  
  
  else  // HEATER_2_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#define heater_2_temptable 0&lt;br&gt;
 #define heater_2_temptable_len 0&lt;/p&gt;

&lt;h1&gt;
  
  
  endif // HEATER_2_USES_THERMISTOR
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef THERMISTORBED
&lt;/h1&gt;

&lt;p&gt;#define bedtemptable TT_NAME(THERMISTORBED)&lt;br&gt;
 #define bedtemptable_len (sizeof(bedtemptable)/sizeof(*bedtemptable))&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef BED_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#error No bed thermistor table specified&lt;/p&gt;

&lt;h1&gt;
  
  
  endif // BED_USES_THERMISTOR
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif //THERMISTORTABLES_H_
&lt;/h1&gt;



&lt;h1&gt;
  
  
  include "thermistortables.h"
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_STEP_PIN         54
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_DIR_PIN          55
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_ENABLE_PIN       38
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_MIN_PIN           3
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_MAX_PIN           2
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_STEP_PIN         60
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_DIR_PIN          61
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_ENABLE_PIN       56
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_MIN_PIN          14
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_MAX_PIN          15
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_STEP_PIN         46
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_DIR_PIN          48
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_ENABLE_PIN       62
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_MIN_PIN          18
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_MAX_PIN          19
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_STEP_PIN         26
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_DIR_PIN          28
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_ENABLE_PIN       24
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_STEP_PIN         36
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_DIR_PIN          34
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_ENABLE_PIN       30
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define SDPOWER            -1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define EXTRUDERS 3
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TEMP_SENSOR_AD595_OFFSET 0.0
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TEMP_SENSOR_AD595_GAIN   1.0
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define THERMISTORHEATER_0 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define THERMISTORHEATER_1 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define THERMISTORHEATER_2 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define HEATER_0_USES_THERMISTOR 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define HEATER_1_USES_THERMISTOR 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define HEATER_2_USES_THERMISTOR 1
&lt;/h1&gt;

&lt;p&gt;static void *heater_ttbl_map[EXTRUDERS] = { (void *)heater_0_temptable&lt;/p&gt;

&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 1
&lt;/h1&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                       , (void *)heater_1_temptable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;
&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 2
&lt;/h1&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                       , (void *)heater_2_temptable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;
&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 3
&lt;/h1&gt;

&lt;p&gt;#error Unsupported number of extruders&lt;/p&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;};&lt;/p&gt;

&lt;p&gt;static int heater_ttbllen_map[EXTRUDERS] = { heater_0_temptable_len&lt;/p&gt;
&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 1
&lt;/h1&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                        , heater_1_temptable_len
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;
&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 2
&lt;/h1&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                        , heater_2_temptable_len
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;
&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 3
&lt;/h1&gt;

&lt;p&gt;#error Unsupported number of extruders&lt;/p&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;};&lt;/p&gt;

&lt;p&gt;#define PGM_RD_W(x)   (short)pgm_read_word(&amp;amp;x)&lt;/p&gt;
&lt;h1&gt;
  
  
  define SDSS               53
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LED_PIN            13
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define FAN_PIN            9
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define PS_ON_PIN          12
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define KILL_PIN           -1
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define HEATER_0_PIN       10
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define HEATER_1_PIN       8
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define TEMP_0_PIN         15   // ANALOG NUMBERING
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define TEMP_1_PIN         14   // ANALOG NUMBERING
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define TEMP_2_PIN         13   // ANALOG NUMBERING
&lt;/h1&gt;

&lt;p&gt;void setup() {&lt;/p&gt;

&lt;p&gt;pinMode(TEMP_0_PIN  , INPUT);&lt;/p&gt;

&lt;p&gt;pinMode(TEMP_1_PIN  , INPUT);&lt;/p&gt;

&lt;p&gt;pinMode(TEMP_2_PIN  , INPUT);&lt;/p&gt;

&lt;p&gt;pinMode(FAN_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(HEATER_0_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(HEATER_1_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(LED_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_DIR_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_ENABLE_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_DIR_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_ENABLE_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_DIR_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_ENABLE_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_DIR_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_ENABLE_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_DIR_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_ENABLE_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;digitalWrite(X_ENABLE_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_ENABLE_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_ENABLE_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_ENABLE_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_ENABLE_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;Serial.begin(115200);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;float analog2temp(int raw, uint8_t e) {&lt;/p&gt;

&lt;p&gt;#ifdef HEATER_0_USES_MAX6675&lt;/p&gt;

&lt;p&gt;if (e == 0)&lt;/p&gt;

&lt;p&gt;{&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; return 0.25 * raw;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;#endif&lt;/p&gt;

&lt;p&gt;if(heater_ttbl_map[e] != 0)&lt;/p&gt;

&lt;p&gt;{&lt;/p&gt;

&lt;p&gt;float celsius = 0;&lt;/p&gt;

&lt;p&gt;byte i;  &lt;/p&gt;

&lt;p&gt;short (&lt;em&gt;tt)[][2] = (short (&lt;/em&gt;)[][2])(heater_ttbl_map[e]);&lt;/p&gt;

&lt;p&gt;raw = (1023 * OVERSAMPLENR) - raw;&lt;/p&gt;

&lt;p&gt;for (i=1; i&amp;lt;heater_ttbllen_map[e]; i++)&lt;/p&gt;

&lt;p&gt;{&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; if ((PGM_RD_W((*tt)[i][0]) &amp;gt; raw) &amp;amp;&amp;amp; ((float)(PGM_RD_W((*tt)[i][0]) - PGM_RD_W((*tt)[i-1][0])) &amp;gt;0))

 {

   celsius = PGM_RD_W((*tt)[i-1][1]) +

     (raw - PGM_RD_W((*tt)[i-1][0])) *

     (float)(PGM_RD_W((*tt)[i][1]) - PGM_RD_W((*tt)[i-1][1])) /

     (float)(PGM_RD_W((*tt)[i][0]) - PGM_RD_W((*tt)[i-1][0]));

   break;

 }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;// Overflow: Set to last value in the table&lt;/p&gt;

&lt;p&gt;if (i == heater_ttbllen_map[e]) celsius = PGM_RD_W((*tt)[i-1][1]);&lt;/p&gt;

&lt;p&gt;return celsius;&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;return ((raw * ((5.0 * 100.0) / 1024.0) / OVERSAMPLENR) * TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET;&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;unsigned long prevMillis;&lt;/p&gt;

&lt;p&gt;void loop () {&lt;/p&gt;

&lt;p&gt;if (millis() %1000 &amp;lt;500)&lt;/p&gt;

&lt;p&gt;digitalWrite(LED_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;else&lt;/p&gt;

&lt;p&gt;digitalWrite(LED_PIN, LOW);&lt;/p&gt;

&lt;p&gt;if (millis() %1000 &amp;lt;300) {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, LOW);&lt;/p&gt;

&lt;p&gt;} else if (millis() %1000 &amp;lt;600) {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, LOW);&lt;/p&gt;

&lt;p&gt;} else  {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;if (millis() %2000 &amp;lt;1000) {&lt;/p&gt;

&lt;p&gt;digitalWrite(X_DIR_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_DIR_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_DIR_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_DIR_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_DIR_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;else {&lt;/p&gt;

&lt;p&gt;digitalWrite(X_DIR_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_DIR_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_DIR_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_DIR_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_DIR_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;digitalWrite(X_STEP_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_STEP_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_STEP_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_STEP_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_STEP_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;delay(1);&lt;/p&gt;

&lt;p&gt;digitalWrite(X_STEP_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_STEP_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_STEP_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_STEP_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_STEP_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;if (millis() -prevMillis &amp;gt;500){&lt;/p&gt;

&lt;p&gt;prevMillis=millis();&lt;/p&gt;

&lt;p&gt;int t = analogRead( TEMP_0_PIN);&lt;/p&gt;

&lt;p&gt;Serial.print("T0 ");&lt;/p&gt;

&lt;p&gt;Serial.print(t);&lt;/p&gt;

&lt;p&gt;Serial.print("/");&lt;/p&gt;

&lt;p&gt;Serial.print(analog2temp(1024 - t,0),0);&lt;/p&gt;

&lt;p&gt;Serial.print(" T1 ");&lt;/p&gt;

&lt;p&gt;t = analogRead( TEMP_1_PIN);&lt;/p&gt;

&lt;p&gt;Serial.print(t);&lt;/p&gt;

&lt;p&gt;Serial.print("/");&lt;/p&gt;

&lt;p&gt;Serial.print(analog2temp(1024 - t,1),0);&lt;/p&gt;

&lt;p&gt;Serial.print(" T2 ");&lt;/p&gt;

&lt;p&gt;t = analogRead( TEMP_2_PIN);&lt;/p&gt;

&lt;p&gt;Serial.print(t);&lt;/p&gt;

&lt;p&gt;Serial.print("/");&lt;/p&gt;

&lt;p&gt;Serial.println(analog2temp(1024 - t,2),0);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>testing</category>
      <category>cloud</category>
      <category>github</category>
    </item>
    <item>
      <title>smart watch printer</title>
      <dc:creator>jay jordan</dc:creator>
      <pubDate>Mon, 25 Dec 2023 16:00:27 +0000</pubDate>
      <link>https://dev.to/jayjo87/smart-watch-printer-d34</link>
      <guid>https://dev.to/jayjo87/smart-watch-printer-d34</guid>
      <description>&lt;h1&gt;
  
  
  include                            //  Подключаем библиотеку для работы по программной шине UART
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include                          //  Подключаем библиотеку для работы с принтером
&lt;/h1&gt;

&lt;p&gt;SoftwareSerial   mySerial(5, 6);                      //  Объявляем объект библиотеки SoftwareSerial, указывая задействованные выводы Arduino (RX=5-зелёный, TX=6-синий). Можно назначить другие выводы Arduino&lt;br&gt;
Adafruit_Thermal printer(&amp;amp;mySerial);                  //  Объявляем объект библиотеки Adafruit_Thermal, указывая ссылку на созданный ранее объект mySerial библиотеки SoftwareSerial&lt;br&gt;
char*            RUS(char*);                          //  Объявляем функцию перевода русских символов из кодировки UTF-8 в кодировку CP866&lt;br&gt;
                                                      //&lt;br&gt;
void setup(){                                         //  Код функции setup выполняется только 1 раз, при старте скетча&lt;br&gt;
    mySerial.begin(9600);                             //  Инициируем передачу данных по программной шине UART на скорости 9600. Функцию begin объекта mySerial нужно вызвать до вызова функции begin объекта printer!&lt;br&gt;
    printer.begin();                                  //  Инициируем работу с термопринтером. В качестве параметра можно указать время нагрева пикселей от 3 (0,03 мс) до 255 (2,55 мс), чем выше тем темнее пикселы. Значение по умолчанию = 120 (1,20 мс)&lt;br&gt;
    printer.setCodePage(CODEPAGE_CP866);              //  Устанавливаем кодовую таблицу CP866 с поддержкой русского языка&lt;br&gt;
    printer.setLineHeight(24);                        //  Устанавливаем межстрочный интервал в 2,4 мм (равен высоте текста), чтоб вертикальные линии таблицы не имели промежутков&lt;br&gt;
    printer.println("");                              //  Выводим пустую строку. Это рекомендуется делать для корректной работы некоторых принтеров после инициализации.&lt;br&gt;
    printer.write(0xC9);                              //  Выводим символ ╔&lt;br&gt;
    for(int i=0; i&amp;lt;29; i++){printer.write(0xCD);}     //  Выводим символ ═ в цикле (29 символов в одной строке). Ширина таблицы 31 символ, а не 32 (максимальное число символов в строке), для того что бы ячейки таблицы были одинаковой ширины&lt;br&gt;
    printer.write(0xBB);                              //  Выводим символ ╗&lt;br&gt;
    printer.feed();                                   //  Прокручиваем ленту на 1 строку, для перехода на новую строку. В этом месте можно было бы написать printer.println("") или printer.print("\r\n"), но printer.feed() действует быстрее&lt;br&gt;
    printer.write(0xBA);                              //  Выводим символ ║&lt;br&gt;
    for(int i=0; i&amp;lt;9; i++){printer.write(0x20);}      //  Выводим пробел в цикле (9 пробелов в одной строке)&lt;br&gt;
    printer.print(RUS("IARDUINO.RU"));                //  Выводим текст без перехода на новую строку&lt;br&gt;
    for(int i=0; i&amp;lt;9; i++){printer.write(0x20);}      //  Выводим пробел в цикле (9 пробелов в одной строке)&lt;br&gt;
    printer.write(0xBA);                              //  Выводим символ ║&lt;br&gt;
    printer.feed();                                   //  Прокручиваем ленту на 1 строку, для перехода на новую строку. В этом месте можно было бы написать printer.println("") или printer.print("\r\n"), но printer.feed() действует быстрее&lt;br&gt;
    printer.write(0xCC);                              //  Выводим символ ╠&lt;br&gt;
    for(int i=0; i&amp;lt;14; i++){printer.write(0xCD);}     //  Выводим символ ═ в цикле (14 символов в одной строке)&lt;br&gt;
    printer.write(0xD1);                              //  Выводим символ ╤&lt;br&gt;
    for(int i=0; i&amp;lt;14; i++){printer.write(0xCD);}     //  Выводим символ ═ в цикле (14 символов в одной строке)&lt;br&gt;
    printer.write(0xB9);                              //  Выводим символ ╣&lt;br&gt;
    printer.feed();                                   //  Прокручиваем ленту на 1 строку, для перехода на новую строку. В этом месте можно было бы написать printer.println("") или printer.print("\r\n"), но printer.feed() действует быстрее&lt;br&gt;
    printer.write(0xBA);                              //  Выводим символ ║&lt;br&gt;
    for(int i=0; i&amp;lt;5; i++){printer.write(0x20);}      //  Выводим пробел в цикле (5 пробелов в одной строке)&lt;br&gt;
    printer.print(RUS("ВСЁ"));                        //  Выводим текст без перехода на новую строку&lt;br&gt;
    for(int i=0; i&amp;lt;6; i++){printer.write(0x20);}      //  Выводим пробел в цикле (6 пробелов в одной строке)&lt;br&gt;
    printer.write(0xB3);                              //  Выводим символ │&lt;br&gt;
    for(int i=0; i&amp;lt;5; i++){printer.write(0x20);}      //  Выводим пробел в цикле (5 пробелов в одной строке)&lt;br&gt;
    printer.print(RUS("ДЛЯ"));                        //  Выводим текст без перехода на новую строку&lt;br&gt;
    for(int i=0; i&amp;lt;6; i++){printer.write(0x20);}      //  Выводим пробел в цикле (6 пробелов в одной строке)&lt;br&gt;
    printer.write(0xBA);                              //  Выводим символ ║&lt;br&gt;
    printer.feed();                                   //  Прокручиваем ленту на 1 строку, для перехода на новую строку. В этом месте можно было бы написать printer.println("") или printer.print("\r\n"), но printer.feed() действует быстрее&lt;br&gt;
    printer.write(0xC7);                              //  Выводим символ ╟&lt;br&gt;
    for(int i=0; i&amp;lt;14; i++){printer.write(0xC4);}     //  Выводим символ ─ в цикле (14 символов в одной строке)&lt;br&gt;
    printer.write(0xC5);                              //  Выводим символ ┼&lt;br&gt;
    for(int i=0; i&amp;lt;14; i++){printer.write(0xC4);}     //  Выводим символ ─ в цикле (14 символов в одной строке)&lt;br&gt;
    printer.write(0xB6);                              //  Выводим символ ╢&lt;br&gt;
    printer.feed();                                   //  Прокручиваем ленту на 1 строку, для перехода на новую строку. В этом месте можно было бы написать printer.println("") или printer.print("\r\n"), но printer.feed() действует быстрее&lt;br&gt;
    printer.write(0xBA);                              //  Выводим символ ║&lt;br&gt;
    for(int i=0; i&amp;lt;4; i++){printer.write(0x20);}      //  Выводим пробел в цикле (4 пробела в одной строке)&lt;br&gt;
    printer.print(RUS("РАДИО"));                      //  Выводим текст без перехода на новую строку&lt;br&gt;
    for(int i=0; i&amp;lt;5; i++){printer.write(0x20);}      //  Выводим пробел в цикле (5 пробелов в одной строке)&lt;br&gt;
    printer.write(0xB3);                              //  Выводим символ │&lt;br&gt;
    for(int i=0; i&amp;lt;2; i++){printer.write(0x20);}      //  Выводим пробел в цикле (2 пробела в одной строке)&lt;br&gt;
    printer.print(RUS("ЛЮБИТЕЛЕЙ"));                  //  Выводим текст без перехода на новую строку&lt;br&gt;
    for(int i=0; i&amp;lt;3; i++){printer.write(0x20);}      //  Выводим пробел в цикле (3 пробела в одной строке)&lt;br&gt;
    printer.write(0xBA);                              //  Выводим символ ║&lt;br&gt;
    printer.feed();                                   //  Прокручиваем ленту на 1 строку, для перехода на новую строку. В этом месте можно было бы написать printer.println("") или printer.print("\r\n"), но printer.feed() действует быстрее&lt;br&gt;
    printer.write(0xC8);                              //  Выводим символ ╚&lt;br&gt;
    for(int i=0; i&amp;lt;14; i++){printer.write(0xCD);}     //  Выводим символ ═ в цикле (14 символов в одной строке)&lt;br&gt;
    printer.write(0xCF);                              //  Выводим символ ╧&lt;br&gt;
    for(int i=0; i&amp;lt;14; i++){printer.write(0xCD);}     //  Выводим символ ═ в цикле (14 символов в одной строке)&lt;br&gt;
    printer.write(0xBC);                              //  Выводим символ ╝&lt;br&gt;
    printer.println("");                              //  Выводим пустую строку.&lt;br&gt;
    printer.feed(3);                                  //  Прокручиваем ленту на 3 строки, чтоб можно было оторвать ленту.&lt;br&gt;
    printer.setDefault();                             //  Устанавливаем настройки принтера по умолчанию.&lt;br&gt;
                                                      //&lt;br&gt;
}                                                     //&lt;br&gt;
                                                      //&lt;br&gt;
void loop(){}                                         //&lt;br&gt;
                                                      //&lt;br&gt;
char* RUS(char* str){                                                                                                                      // Определяем функцию которая преобразует код русских символов из кодировки UTF-8 в кодировку CP866&lt;br&gt;
    uint8_t i=0, j=0;                                                                                                                      // Определяем переменные: i - счетчик входящих символов, j - счетчик исходящих символов&lt;br&gt;
    while(str[i]){                                                                                                                         // Проходим по всем символам строки str, пока не встретим символ конца строки (код 0)&lt;br&gt;
        if(uint8_t(str[i]) == 0xD0 &amp;amp;&amp;amp; uint8_t(str[i+1]) &amp;gt;= 0x90 &amp;amp;&amp;amp; uint8_t(str[i+1]) &amp;lt;= 0xBF ){str[j] = (uint8_t) str[i+1]-0x10; i++;}else // Символы «А-Я а-п» (код UTF-8: D090-D0AF D0B0-D0BF) сохраняем в кодировке CP866: код 80-9F A0-AF (символ занимал 2 байта, а стал занимать 1 байт)&lt;br&gt;
        if(uint8_t(str[i]) == 0xD1 &amp;amp;&amp;amp; uint8_t(str[i+1]) &amp;gt;= 0x80 &amp;amp;&amp;amp; uint8_t(str[i+1]) &amp;lt;= 0x8F ){str[j] = (uint8_t) str[i+1]+0x60; i++;}else // Символы «р-я»     (код UTF-8: D180-D18F)           сохраняем в кодировке CP866: код E0-EF       (символ занимал 2 байта, а стал занимать 1 байт)&lt;br&gt;
        if(uint8_t(str[i]) == 0xD0 &amp;amp;&amp;amp; uint8_t(str[i+1]) == 0x81                              ){str[j] = 0xF0;                    i++;}else // Символ «Ё»        (код UTF-8: D081)                сохраняем в кодировке CP866: код F0          (символ занимал 2 байта, а стал занимать 1 байт)&lt;br&gt;
        if(uint8_t(str[i]) == 0xD1 &amp;amp;&amp;amp; uint8_t(str[i+1]) == 0x91                              ){str[j] = 0xF1;                    i++;}else // Символ «ё»        (код UTF-8: D191)                сохраняем в кодировке CP866: код F1          (символ занимал 2 байта, а стал занимать 1 байт)&lt;br&gt;
                                                                                              {str[j] = (uint8_t) str[i];}  j++; i++;      // Остальные символы оставляем как есть, без преобразования, но их место в строке могло сдвинуться, если до них были встречены русские символы&lt;br&gt;
    }   while(j&amp;lt;i){str[j]=0; j++;} return str;                                                                                             // Так как место занимаемое символами в строке могло уменьшиться, заполняем оставшиеся байты символами конца строки (код 0)&lt;br&gt;
}&lt;/p&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include "U8glib.h"
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include "SoftwareSerial.h"
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define nextButton 7      //define the pin numbers for the buttons
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define previousButton 5
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define menuButton 4
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define mot 9
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define buzz A3
&lt;/h1&gt;

&lt;p&gt;SoftwareSerial bluetooth(2,3);    //Use software serial for bluetooth&lt;/p&gt;

&lt;p&gt;const unsigned char PROGMEM ICON_BITMAP_1[] = &lt;br&gt;
{     //Android Logo&lt;br&gt;
  0x00,0x00,&lt;br&gt;
  0x00,0x00,&lt;br&gt;
  0x04,0x40,&lt;br&gt;
  0x07,0xc0,&lt;br&gt;
  0x0f,0xe0,&lt;br&gt;
  0x0b,0xa0,&lt;br&gt;
  0x1f,0xf0,&lt;br&gt;
  0x00,0x00,&lt;br&gt;
  0x5f,0xf4,&lt;br&gt;
  0x5f,0xf4,&lt;br&gt;
  0x5f,0xf4,&lt;br&gt;
  0x5f,0xf4,&lt;br&gt;
  0x1f,0xf0,&lt;br&gt;
  0x0c,0x60,&lt;br&gt;
  0x0c,0x60,&lt;br&gt;
  0x00,0x00&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;const unsigned char PROGMEM ICON_BITMAP_20[] = &lt;br&gt;
{    //chat&lt;br&gt;
  0x00,0x00,&lt;br&gt;
  0x00,0x00,&lt;br&gt;
  0x3f,0xf8,&lt;br&gt;
  0x40,0x04,&lt;br&gt;
  0x40,0x04,&lt;br&gt;
  0x40,0x04,&lt;br&gt;
  0x40,0x04,&lt;br&gt;
  0x49,0x24,&lt;br&gt;
  0x40,0x04,&lt;br&gt;
  0x40,0x04,&lt;br&gt;
  0x40,0x04,&lt;br&gt;
  0x3f,0xc8,&lt;br&gt;
  0x00,0x28,&lt;br&gt;
  0x00,0x18,&lt;br&gt;
  0x00,0x08,&lt;br&gt;
  0x00,0x00&lt;br&gt;
}; &lt;/p&gt;

&lt;p&gt;const unsigned char PROGMEM ICON_BITMAP_65[] = &lt;br&gt;
{    //bar signal&lt;br&gt;
  0x00,0x00,&lt;br&gt;
  0x00,0x00,&lt;br&gt;
  0x3f,0xe0,&lt;br&gt;
  0x10,0x40,&lt;br&gt;
  0x08,0x80,&lt;br&gt;
  0x05,0x00,&lt;br&gt;
  0x02,0x00,&lt;br&gt;
  0x02,0x00,&lt;br&gt;
  0x02,0x00,&lt;br&gt;
  0x00,0x0c,&lt;br&gt;
  0x00,0x6c,&lt;br&gt;
  0x03,0x6c,&lt;br&gt;
  0x1b,0x6c,&lt;br&gt;
  0x1b,0x6c,&lt;br&gt;
  0x00,0x00,&lt;br&gt;
  0x00,0x00&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;int i,c=0,t=0;&lt;/p&gt;

&lt;p&gt;boolean clockUp = true;&lt;br&gt;
boolean menuShow = false;&lt;br&gt;
boolean selectButtonbool = false;&lt;br&gt;
boolean newMessage = false;&lt;br&gt;
boolean newCall = false;&lt;br&gt;
boolean newCallR = false;&lt;br&gt;
boolean newNote = false;&lt;br&gt;
boolean newBuzz = false;&lt;/p&gt;

&lt;p&gt;byte hours = 0;&lt;br&gt;
byte minutes = 0;&lt;br&gt;
byte seconds = 0;&lt;br&gt;
byte day = 0;&lt;br&gt;
byte date = 0;&lt;br&gt;
byte month = 0;&lt;br&gt;
int year = 0;&lt;/p&gt;

&lt;p&gt;int k,j,n1,n2,n3,n4,n5,n6,n7,n8,N1,N2,N3,N4,N5,N6,N7,N8 = 0;&lt;br&gt;
float x1,x2,ans = 0.0;&lt;/p&gt;

&lt;p&gt;char DateBuffer[30];&lt;br&gt;
char* TimeStorage [6];&lt;br&gt;
char* vout;&lt;/p&gt;

&lt;p&gt;String monthw;&lt;br&gt;
String number;&lt;br&gt;
String numberR;&lt;br&gt;
String NoteS;&lt;br&gt;
String message;     //Variable for SMS messages&lt;br&gt;
String blReceived;    //Storage for strings received from bluetooth&lt;/p&gt;

&lt;p&gt;char msg[150];    //Char array for SMS&lt;br&gt;
char numb[15];&lt;br&gt;
char numbR[15];&lt;br&gt;
char note[300];&lt;br&gt;
String op[4]={"+","-","*","/"};&lt;/p&gt;

&lt;p&gt;byte menuSelection = 0;   //Menu&lt;br&gt;
byte menuSelections = 0;  //Settings&lt;br&gt;
byte menuSelectiona = 0;  //Apps&lt;br&gt;
byte len;         //Length of message&lt;br&gt;
byte len1;&lt;br&gt;
byte len2;&lt;br&gt;
byte l;&lt;/p&gt;

&lt;p&gt;static unsigned long lastTick = 0;&lt;/p&gt;

&lt;p&gt;//U8GLIB_SSD1306_ADAFRUIT_128X64 u8g(U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);&lt;br&gt;
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST); // I2C / TWI&lt;br&gt;
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);&lt;br&gt;
//U8GLIB_SH1106_128X64_2X u8g(13, 11, 10, 9,8); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8&lt;/p&gt;

&lt;p&gt;void setup(void) {&lt;br&gt;
  // flip screen, if required&lt;br&gt;
  //u8g.setRot180();&lt;/p&gt;

&lt;p&gt;pinMode(nextButton,INPUT);  //Set digital pins as inputs&lt;br&gt;
pinMode(previousButton,INPUT);&lt;br&gt;
pinMode(menuButton,INPUT);&lt;br&gt;
pinMode(mot,OUTPUT);&lt;br&gt;
pinMode(buzz,OUTPUT);&lt;/p&gt;

&lt;p&gt;Serial.begin(9600);&lt;br&gt;
bluetooth.begin(9600);&lt;/p&gt;

&lt;p&gt;digitalWrite(nextButton,HIGH);  //Enable internal pull up on all buttons&lt;br&gt;
digitalWrite(previousButton,HIGH);&lt;br&gt;
digitalWrite(menuButton,HIGH);&lt;br&gt;
digitalWrite(mot,HIGH);&lt;br&gt;
delay(500);&lt;br&gt;
digitalWrite(mot,LOW);&lt;br&gt;
drawStartUp();&lt;br&gt;&lt;br&gt;
delay(4000);&lt;/p&gt;

&lt;p&gt;}//end of setup&lt;/p&gt;

&lt;p&gt;void loop() {&lt;br&gt;
  int k,j,n1,n2,n3,n4,n5,n6,n7,n8,N1,N2,N3,N4,N5,N6,N7,N8 = 0;&lt;br&gt;
  float x1,x2,ans = 0.0;&lt;br&gt;
  t++;&lt;br&gt;
  if(t&amp;gt;160)&lt;br&gt;
  {&lt;br&gt;
    sleep();&lt;br&gt;
  }&lt;br&gt;
  if(digitalRead(menuButton)==LOW)&lt;br&gt;
    t=0; &lt;br&gt;
if(bluetooth.available() &amp;gt; 0 /&lt;em&gt;&amp;amp;&amp;amp; bluetooth.find("(")&lt;/em&gt;/)&lt;br&gt;
{&lt;br&gt;
  blReceived = bluetooth.readString();&lt;br&gt;
  if(blReceived.startsWith("1"))    //1 is the preamble date&lt;br&gt;
  {&lt;br&gt;
    digitalWrite(mot,HIGH);&lt;br&gt;
    delay(1000);&lt;br&gt;
    digitalWrite(mot,LOW);&lt;br&gt;
    seconds++;&lt;br&gt;
    blReceived.toCharArray(DateBuffer,blReceived.length()+1);&lt;br&gt;
    vout = strtok(DateBuffer,",");&lt;br&gt;
    for(int i=0;i&amp;lt;=6;i++)&lt;br&gt;
    {&lt;br&gt;
      //if(TimeStorage[i] = NULL)&lt;br&gt;
      //{Serial.println("Exited Loop");&lt;br&gt;
      //  break;}&lt;br&gt;
      TimeStorage[i] = strtok(NULL,",");&lt;br&gt;
      delay(10);&lt;br&gt;
    }&lt;br&gt;
    //int example = bluetooth.parseInt();&lt;br&gt;
    day = atoi(TimeStorage[0] - 1);&lt;br&gt;
    date = atoi(TimeStorage[1]);&lt;br&gt;
    month = atoi(TimeStorage[2]);&lt;br&gt;
    year = atoi(TimeStorage[3]);&lt;br&gt;
    hours = atoi(TimeStorage[4]);&lt;br&gt;
    minutes = atoi(TimeStorage[5]);&lt;br&gt;
    seconds = atoi(TimeStorage[6]);&lt;br&gt;
    blReceived="";&lt;br&gt;
    t=0;&lt;br&gt;
  }&lt;br&gt;
  else if (blReceived.startsWith("2"))&lt;br&gt;
  {&lt;br&gt;
    digitalWrite(mot,HIGH);&lt;br&gt;
    delay(1000);&lt;br&gt;
    digitalWrite(mot,LOW);&lt;br&gt;
    seconds++;&lt;br&gt;
    newMessage = true;&lt;br&gt;
    message = blReceived;&lt;br&gt;
    //sms();&lt;br&gt;
    //delay(300000);&lt;br&gt;
    blReceived="";&lt;br&gt;
    t=0;&lt;br&gt;
  }&lt;br&gt;
  else if (blReceived.startsWith("3"))&lt;br&gt;
  {&lt;br&gt;
    digitalWrite(mot,HIGH);&lt;br&gt;
    delay(1000);&lt;br&gt;
    digitalWrite(mot,LOW);&lt;br&gt;
    seconds++;&lt;br&gt;
    newCall = true;&lt;br&gt;
    number = blReceived;&lt;br&gt;
    //num();&lt;br&gt;
    //delay(300000);&lt;br&gt;
    blReceived="";&lt;br&gt;
    t=0;&lt;br&gt;
  }&lt;br&gt;
  else if (blReceived.startsWith("4"))&lt;br&gt;
  {&lt;br&gt;
      digitalWrite(mot,HIGH);&lt;br&gt;
      delay(1000);&lt;br&gt;
      digitalWrite(mot,LOW);&lt;br&gt;
      newCallR = true;&lt;br&gt;
      numberR = blReceived;&lt;br&gt;
      t=0;&lt;br&gt;
      u8g.firstPage();&lt;br&gt;
   do&lt;br&gt;
   {&lt;br&gt;
      u8g.setFont(u8g_font_unifont);&lt;br&gt;
      u8g.setPrintPos(0,20);&lt;br&gt;
      u8g.print("Calling...");&lt;br&gt;
      u8g.setPrintPos(0,40);&lt;br&gt;
      u8g.print(numberR);&lt;br&gt;
      len2 = numberR.length();&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  number.toCharArray(numbR, len2+1);
  //Serial.println(len2);
  if(len2&amp;lt;15)
  {
     //Serial.println("If");
     for (int i = 0;(i-1)&amp;lt;len2;i++)
     {
        //Serial.println("Enter for loop");
        u8g.setPrintPos(i*8,30);
        u8g.print(numbR[i-15]);
        delay(10);
        if(numbR[i-16] == '\0')
        { 
           //Serial.println("Break!!");
           break;
           //delay(3000);
        }
     }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  while (u8g.nextPage());&lt;br&gt;
  blReceived="";&lt;br&gt;
  delay(15000);&lt;br&gt;
  seconds=seconds+15;&lt;br&gt;
  newCallR = false;&lt;br&gt;
  }&lt;br&gt;
  else if (blReceived.startsWith("5"))&lt;br&gt;
  {&lt;br&gt;
    digitalWrite(mot,HIGH);&lt;br&gt;
    delay(1000);&lt;br&gt;
    digitalWrite(mot,LOW);&lt;br&gt;
    seconds++;&lt;br&gt;
    newNote = true;&lt;br&gt;
    NoteS = blReceived;&lt;br&gt;
    //notes();&lt;br&gt;
    //delay(300000);&lt;br&gt;
    blReceived="";&lt;br&gt;
    t=0;&lt;br&gt;
  }&lt;br&gt;
  else if (blReceived.startsWith("6"))&lt;br&gt;
  {&lt;br&gt;
    newBuzz = true;&lt;br&gt;
    Buzz();&lt;br&gt;
    blReceived="";&lt;br&gt;
    t=0;&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;/&lt;em&gt;Serial.println(day-1);&lt;br&gt;
  Serial.println(date);&lt;br&gt;
  Serial.println(month);&lt;br&gt;
  Serial.println(year);&lt;br&gt;
  Serial.println(hours);&lt;br&gt;
  Serial.println(minutes);&lt;br&gt;
  Serial.println(seconds);&lt;/em&gt;/&lt;br&gt;
}     //end of if for datetime&lt;/p&gt;

&lt;p&gt;/&lt;em&gt;Serial.println(day-1);&lt;br&gt;
  Serial.println(date);&lt;br&gt;
  Serial.println(month);&lt;br&gt;
  Serial.println(year);&lt;br&gt;
  Serial.println(hours);&lt;br&gt;
  Serial.println(minutes);&lt;br&gt;
  Serial.println(seconds);&lt;/em&gt;/&lt;/p&gt;

&lt;p&gt;/*else if(bluetooth.available() &amp;gt; 0 &amp;amp;&amp;amp; bluetooth.find("CMD")==true)&lt;br&gt;
{&lt;br&gt;
  Serial.println("ENTERED MESSAGE");&lt;br&gt;
  message = bluetooth.readString();&lt;br&gt;
  Serial.println(message);&lt;br&gt;
  //delay(300000);&lt;br&gt;
}&lt;br&gt;
*/&lt;/p&gt;

&lt;p&gt;if(digitalRead(previousButton)==LOW &amp;amp;&amp;amp; digitalRead(nextButton)==LOW)  //button is activated&lt;br&gt;
{&lt;br&gt;
  seconds=seconds+4;&lt;br&gt;&lt;br&gt;
  if(menuShow == false)    //To toggle the menu states&lt;br&gt;
  {&lt;br&gt;
     menuShow = true;&lt;br&gt;
     delay(100);&lt;br&gt;
     menu();  //Get back the menu selection number&lt;br&gt;&lt;br&gt;
     if(menuSelection == 4)&lt;br&gt;
     {&lt;br&gt;
        seconds=seconds+4;&lt;br&gt;
        delay(100);&lt;br&gt;
        menuSelection = 0;&lt;br&gt;
        while(digitalRead(menuButton)== HIGH)&lt;br&gt;
        {&lt;br&gt;
           HA();&lt;br&gt;
           delay(10);&lt;br&gt;
        }&lt;br&gt;
     }&lt;br&gt;
     if(menuSelection == 3)&lt;br&gt;
     {&lt;br&gt;
        seconds=seconds+4; &lt;br&gt;
        settings();&lt;br&gt;
        if(menuSelections == 2)&lt;br&gt;
        {&lt;br&gt;
           seconds=seconds+4;&lt;br&gt;
           delay(100);&lt;br&gt;
           menuSelections=0;&lt;br&gt;
           delay(100);&lt;br&gt;
           while(digitalRead(menuButton)== HIGH)&lt;br&gt;
           {&lt;br&gt;
              notice();&lt;br&gt;
           }&lt;br&gt;
           delay(100);&lt;br&gt;
        }&lt;br&gt;
        if(menuSelections == 3)&lt;br&gt;
        {&lt;br&gt;
           seconds=seconds+4;&lt;br&gt;
           delay(100);&lt;br&gt;
           menuSelections=0;&lt;br&gt;
           while(digitalRead(menuButton)==HIGH)&lt;br&gt;
           {&lt;br&gt;
              torch();&lt;br&gt;
              delay(10);&lt;br&gt;
           }&lt;br&gt;
        }&lt;br&gt;
        if(menuSelections == 4)&lt;br&gt;
        {&lt;br&gt;
           seconds=seconds+4;&lt;br&gt;
           delay(100);&lt;br&gt;
           menuSelections=0;&lt;br&gt;
           while(digitalRead(menuButton)==HIGH)&lt;br&gt;
           {&lt;br&gt;
             bluetooth.write("1");&lt;br&gt;
             delay(1000);&lt;br&gt;
             bluetooth.write("");&lt;br&gt;
           }&lt;br&gt;
        }&lt;br&gt;
        bluetooth.write("");&lt;br&gt;
        bluetooth.write("2");&lt;br&gt;
        bluetooth.write("");&lt;br&gt;
     }&lt;br&gt;
     if(menuSelection == 2)&lt;br&gt;
     {&lt;br&gt;
        seconds=seconds+4;&lt;br&gt;
        apps(); &lt;br&gt;
        if(menuSelectiona == 2)&lt;br&gt;
        {&lt;br&gt;&lt;br&gt;
           seconds=seconds+4;&lt;br&gt;
           delay(100);&lt;br&gt;
           menuSelectiona = 0;&lt;br&gt;
           while(digitalRead(menuButton)==HIGH)&lt;br&gt;
           {&lt;br&gt;
              Calc();&lt;br&gt;
           }&lt;br&gt;
           bluetooth.write("");&lt;br&gt;&lt;br&gt;
        }  &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    if(menuSelectiona == 3)
    {
       seconds=seconds+4;
       delay(100);
       menuSelectiona = 0;
       while(digitalRead(menuButton)== HIGH)
       {sms();}
       delay(100);
    }
    if(menuSelectiona == 4)
    {
       seconds=seconds+4;
       delay(100);
       menuSelectiona = 0;
       while(digitalRead(menuButton)== HIGH)
       {call();}
       delay(100);
    }
 }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  if(menuShow == true)&lt;br&gt;
  {&lt;br&gt;
     menuShow = false;&lt;br&gt;
     delay(100);&lt;br&gt;&lt;br&gt;
  }&lt;br&gt;
}//end of if&lt;br&gt;
advanceTime();&lt;br&gt;
delay(30);&lt;br&gt;
}//end of loop&lt;/p&gt;

&lt;p&gt;void sleep()&lt;br&gt;
{&lt;br&gt;
   u8g.firstPage();&lt;br&gt;
   do{}&lt;br&gt;
   while(u8g.nextPage());&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void advanceTime()&lt;br&gt;
{&lt;br&gt;
   if(millis()-lastTick&amp;gt;950)  //somehow&lt;br&gt;
   {&lt;br&gt;
      lastTick = millis();&lt;br&gt;
      seconds++;&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;if (seconds &amp;gt; 59)&lt;br&gt;
   {&lt;br&gt;
      minutes++;&lt;br&gt;
      seconds = 0;&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;if (minutes &amp;gt;59)&lt;br&gt;
   {&lt;br&gt;
      hours++;&lt;br&gt;
      minutes = 0;&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;if (hours &amp;gt; 23)&lt;br&gt;
   {&lt;br&gt;
      hours = 0;&lt;br&gt;
      minutes = 0;&lt;br&gt;
      date+=1;&lt;br&gt;
   }&lt;br&gt;
   draw();&lt;br&gt;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//**&lt;strong&gt;&lt;em&gt;------------------U8Glib Functions------------------&lt;/em&gt;&lt;/strong&gt;**&lt;br&gt;
void HA()&lt;br&gt;
{&lt;br&gt;
  u8g.firstPage();&lt;br&gt;&lt;br&gt;
  do {&lt;br&gt;
        bluetooth.write("3");&lt;br&gt;
        u8g.setFont(u8g_font_unifont);&lt;br&gt;
        u8g.setPrintPos(0,10);&lt;br&gt;
        u8g.print("Home Automation");&lt;br&gt;
        u8g.setFont(u8g_font_unifont);&lt;br&gt;
        u8g.setPrintPos(30,10);&lt;br&gt;
        u8g.print("In Development");&lt;br&gt;
        bluetooth.write("");&lt;br&gt;
  } while( u8g.nextPage() );&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void Buzz()&lt;br&gt;
{&lt;br&gt;
    while(c&amp;lt;5)&lt;br&gt;
    {&lt;br&gt;
      for(i=1;i&amp;lt;256;i++)&lt;br&gt;
      {&lt;br&gt;
        analogWrite(buzz,i);&lt;br&gt;
        delay(3.92);&lt;br&gt;
      }&lt;br&gt;
      for(i=256;i&amp;gt;0;i--)&lt;br&gt;
      {&lt;br&gt;
        analogWrite(buzz,i);&lt;br&gt;
        delay(3.92);&lt;br&gt;
      }&lt;br&gt;
      c++;&lt;br&gt;
    }&lt;br&gt;
    c=0;&lt;br&gt;
    newBuzz=false;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void drawStartUp()&lt;br&gt;
{&lt;br&gt;
  u8g.firstPage();&lt;br&gt;
  do&lt;br&gt;
  {&lt;br&gt;
    //u8g_prepare();&lt;br&gt;
    u8g.setColorIndex(0);&lt;br&gt;
    u8g.drawBox(0,0,127,63);&lt;br&gt;
    u8g.setColorIndex(1);&lt;br&gt;
    u8g.setFont(u8g_font_7x14r);&lt;br&gt;
    u8g.setPrintPos(5,10);&lt;br&gt;
    u8g.print("Developed By:-");&lt;br&gt;
    u8g.setFont(u8g_font_fur17r);&lt;br&gt;
    u8g.setPrintPos(10,38);&lt;br&gt;
    u8g.print("USER");&lt;br&gt;
    u8g.setFont(u8g_font_7x14r);&lt;br&gt;
    u8g.setPrintPos(5,62);&lt;br&gt;
    u8g.print("V402");&lt;br&gt;
  }&lt;br&gt;
  while(u8g.nextPage());&lt;br&gt;
}  //end of drawStartUp&lt;/p&gt;

&lt;p&gt;void menu()&lt;br&gt;
{&lt;br&gt;&lt;br&gt;
   u8g.setColorIndex(1);&lt;br&gt;
   //u8g.drawCircle(20,20,14);&lt;br&gt;
   menuSelection = 1;&lt;br&gt;
   while(digitalRead(menuButton) == HIGH)&lt;br&gt;
   {&lt;br&gt;
      if(digitalRead(nextButton) == LOW)&lt;br&gt;
      {&lt;br&gt;
         delay(20);&lt;br&gt;
         menuSelection++;&lt;br&gt;
         delay(50);&lt;br&gt;
      }  &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; if(digitalRead(previousButton) == LOW)
 {
    delay(20);
    menuSelection--;
    delay(50);
 }

 if(menuSelection &amp;gt; 4)
 {menuSelection = 1;}

 if(menuSelection &amp;lt; 1)
 {menuSelection = 4;}
 //draw picture here
 drawMenu();

 delay(50); //For debouncing

 //draw menus here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}//end of while loop&lt;br&gt;
}//end of menu&lt;/p&gt;

&lt;p&gt;void drawMenu()&lt;br&gt;
{&lt;br&gt;
   u8g.firstPage();&lt;br&gt;
   do&lt;br&gt;
   {&lt;br&gt;
      u8g.setFont(u8g_font_6x10r);&lt;br&gt;
      u8g.setPrintPos(30,8);&lt;br&gt;
      u8g.print("--- Menu ---");&lt;br&gt;
      //u8g.setPrintPos(0,10);&lt;br&gt;
      //u8g.print(menuSelection);&lt;br&gt;
      u8g.drawFrame(0,(menuSelection*13)-3,128,13); //Box height is 13 pixels&lt;br&gt;
      u8g.drawLine(0,10,128,10);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  //Draw menu options
  u8g.drawStr(3,20,"Return");
  u8g.drawStr(3,20+13,"Apps");
  u8g.drawStr(3,20+13+13,"Settings");
  u8g.drawStr(3,20+13+13+13,"Home Auto(Beta)");
  //u8g.drawStr(3,20+13+13+13,"More");   
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
   while(u8g.nextPage());&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void apps()&lt;br&gt;
{&lt;br&gt;
   u8g.setColorIndex(1);&lt;br&gt;
   //u8g.drawCircle(20,20,14);&lt;br&gt;
   menuSelectiona = 1;&lt;br&gt;
   delay(200);&lt;br&gt;
   while(digitalRead(menuButton) == HIGH)&lt;br&gt;
   {&lt;br&gt;
      if(digitalRead(nextButton) == LOW)&lt;br&gt;
      {&lt;br&gt;
         delay(20);&lt;br&gt;
         menuSelectiona++;&lt;br&gt;
         Serial.println("Up");&lt;br&gt;
         delay(50);&lt;br&gt;
      }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  if(digitalRead(previousButton) == LOW)
  {
     delay(20);
     menuSelectiona--;
     delay(50);
  }

  if(menuSelectiona &amp;gt; 4)
  {menuSelectiona = 1;}

  if(menuSelectiona &amp;lt; 1)
  {menuSelectiona = 4;}
  //draw picture here
drawApps();
delay(50); //For debouncing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}//end of while loop&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void notice()&lt;br&gt;
{&lt;br&gt;
   u8g.firstPage();&lt;br&gt;
   do&lt;br&gt;
   {&lt;br&gt;
      u8g.setFont(u8g_font_6x10r);&lt;br&gt;
      //u8g.print(NoteS);&lt;br&gt;
      l = NoteS.length();&lt;br&gt;
      NoteS.toCharArray(note, l+1);&lt;br&gt;
      //Serial.println(len);&lt;br&gt;
      if(l&amp;gt;0)&lt;br&gt;
      {&lt;br&gt;
        for(i=0;i&amp;lt;20;i++)&lt;br&gt;
        {&lt;br&gt;
           u8g.setPrintPos(i*6,8);&lt;br&gt;
           u8g.print(note[i]);&lt;br&gt;
           delay(10);&lt;br&gt;
        }&lt;br&gt;
      }&lt;br&gt;
      if(l&amp;gt;20)&lt;br&gt;
      {&lt;br&gt;
        for(i=20;i&amp;lt;40;i++)&lt;br&gt;
        {&lt;br&gt;
           u8g.setPrintPos((i-20)*6,17);&lt;br&gt;
           u8g.print(note[i]);&lt;br&gt;
           delay(10);&lt;br&gt;
        }&lt;br&gt;
      }&lt;br&gt;
      if(l&amp;gt;40)&lt;br&gt;
      {&lt;br&gt;
        for(i=40;i&amp;lt;60;i++)&lt;br&gt;
        {&lt;br&gt;
           u8g.setPrintPos((i-40)*6,26);&lt;br&gt;
           u8g.print(note[i]);&lt;br&gt;
           delay(10);&lt;br&gt;
        }&lt;br&gt;
      }&lt;br&gt;
      if(l&amp;gt;60)&lt;br&gt;
      {&lt;br&gt;
        for(i=60;i&amp;lt;80;i++)&lt;br&gt;
        {&lt;br&gt;
           u8g.setPrintPos((i-60)*6,35);&lt;br&gt;
           u8g.print(note[i]);&lt;br&gt;
           delay(10);&lt;br&gt;
        }&lt;br&gt;
      }&lt;br&gt;
      if(l&amp;gt;80)&lt;br&gt;
      {&lt;br&gt;
        for(i=80;i&amp;lt;100;i++)&lt;br&gt;
        {&lt;br&gt;
           u8g.setPrintPos((i-80)*6,43);&lt;br&gt;
           u8g.print(note[i]);&lt;br&gt;
           delay(10);&lt;br&gt;
        }&lt;br&gt;
      }&lt;br&gt;
      if(l&amp;gt;100)&lt;br&gt;
      {&lt;br&gt;
        for(i=100;i&amp;lt;120;i++)&lt;br&gt;
        {&lt;br&gt;
           u8g.setPrintPos((i-100)*6,51);&lt;br&gt;
           u8g.print(note[i]);&lt;br&gt;
           delay(10);&lt;br&gt;
        }&lt;br&gt;
      }&lt;br&gt;
      if(l&amp;gt;120)&lt;br&gt;
      {&lt;br&gt;
        for(i=120;i&amp;lt;140;i++)&lt;br&gt;
        {&lt;br&gt;
           u8g.setPrintPos((i-120)*6,59);&lt;br&gt;
           u8g.print(note[i]);&lt;br&gt;
           delay(10);&lt;br&gt;
        }&lt;br&gt;
      }&lt;br&gt;
  }&lt;br&gt;
  while (u8g.nextPage());&lt;br&gt;
  delay(30);&lt;br&gt;
  newNote = false;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void torch()&lt;br&gt;
{&lt;br&gt;
   u8g.firstPage();&lt;br&gt;
   do{u8g.drawBox(0,0,127,63);}&lt;br&gt;
   while(u8g.nextPage());&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void drawApps()&lt;br&gt;
{&lt;br&gt;
   u8g.firstPage();&lt;br&gt;
   do&lt;br&gt;
   {&lt;br&gt;
      u8g.setFont(u8g_font_6x10r);&lt;br&gt;
      u8g.setPrintPos(5,8);&lt;br&gt;
      u8g.print("--- Applications ---");&lt;br&gt;
      //u8g.setPrintPos(0,10);&lt;br&gt;
      //u8g.print(menuSelection);&lt;br&gt;
      u8g.drawFrame(0,(menuSelectiona*13)-3,128,13);  //Box height is 13 pixels&lt;br&gt;
      u8g.drawLine(0,10,128,10);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  //Draw menu options
  u8g.drawStr(3,20,"Return");
  u8g.drawStr(3,20+13,"CALC");
  u8g.drawStr(3,20+13+13,"SMS");
  u8g.drawStr(3,20+13+13+13,"CALLS");
  //u8g.drawStr(3,20+13+13+13,"More");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;&lt;br&gt;
   while(u8g.nextPage());&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void settings()&lt;br&gt;
{&lt;br&gt;
   u8g.setColorIndex(1);&lt;br&gt;
   //u8g.drawCircle(20,20,14);&lt;br&gt;
   menuSelections = 1;&lt;br&gt;
   delay(200);&lt;br&gt;
   while(digitalRead(menuButton) == HIGH)&lt;br&gt;
   {&lt;br&gt;&lt;br&gt;
      if(digitalRead(nextButton) == LOW)&lt;br&gt;
      {&lt;br&gt;
         delay(20);&lt;br&gt;
         menuSelections++;&lt;br&gt;
         Serial.println("Up");&lt;br&gt;
         delay(50);&lt;br&gt;
      }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  if(digitalRead(previousButton) == LOW)
  {
     delay(20);
     menuSelections--;
     delay(50);
  }

  if(menuSelections &amp;gt; 4)
  {menuSelections = 1;}

  if(menuSelections &amp;lt; 1)
  {menuSelections = 4;}
  //draw picture here
  drawSettings();

  delay(50); //For debouncing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}//end of while loop&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void sms()&lt;br&gt;
{&lt;br&gt;
   u8g.firstPage();&lt;br&gt;
   do&lt;br&gt;
   {&lt;br&gt;
      u8g.setFont(u8g_font_unifont);&lt;br&gt;
      u8g.setPrintPos(0,10);&lt;br&gt;
      u8g.print(message);&lt;br&gt;
      len = message.length();&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  message.toCharArray(msg, len+1);
  //Serial.println(len);
  if(len&amp;gt;16)
  {
     //Serial.println("If");
     for (int i = 0;(i-1)&amp;lt;len;i++)
     {
        //Serial.println("Enter for loop");
        u8g.setPrintPos(i*8,30);
        u8g.print(msg[i+16]);
        delay(10);
        if(msg[i+17] == '\0')
        { 
           //Serial.println("Break!!");
           break;
           //delay(3000);
        }
     }
  }

  if(len&amp;gt;32)
  {
     //Serial.println("If");
     for (int i = 0;(i-1)&amp;lt;len;i++)
     {
        //Serial.println("Enter for loop");
        u8g.setPrintPos(i*8,50);
        u8g.print(msg[i+32]);
        delay(10);
        if(msg[i+33] == '\0')
        { 
           //Serial.println("Break!!");
           break;
           //delay(3000);
        }
     }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  while (u8g.nextPage());&lt;br&gt;
  delay(30);&lt;br&gt;
  newMessage = false;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void call()&lt;br&gt;
{&lt;br&gt;
   u8g.firstPage();&lt;br&gt;
   do&lt;br&gt;
   {&lt;br&gt;
      u8g.setFont(u8g_font_unifont);&lt;br&gt;
      u8g.setPrintPos(0,10);&lt;br&gt;
      u8g.print(number);&lt;br&gt;
      len1 = number.length();&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  number.toCharArray(numb, len1+1);
  //Serial.println(len1);
  if(len1&amp;lt;15)
  {
     //Serial.println("If");
     for (int i = 0;(i-1)&amp;lt;len1;i++)
     {
        //Serial.println("Enter for loop");
        u8g.setPrintPos(i*8,30);
        u8g.print(numb[i-15]);
        delay(10);
        if(numb[i-16] == '\0')
        { 
           //Serial.println("Break!!");
           break;
           //delay(3000);
        }
     }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  while (u8g.nextPage());&lt;br&gt;
  delay(30);&lt;br&gt;
  newCall = false;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void drawSettings()&lt;br&gt;
{&lt;br&gt;
   u8g.firstPage();&lt;br&gt;
   do&lt;br&gt;
   {&lt;br&gt;
      u8g.setFont(u8g_font_6x10r);&lt;br&gt;
      u8g.setPrintPos(15,8);&lt;br&gt;
      u8g.print("--- Settings ---");&lt;br&gt;
      //u8g.setPrintPos(0,10);&lt;br&gt;
      //u8g.print(menuSelection);&lt;br&gt;
      u8g.drawFrame(0,(menuSelections*13)-3,128,13);  //Box height is 13 pixels&lt;br&gt;
      u8g.drawLine(0,10,128,10);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  //Draw menu options
  u8g.drawStr(3,20,"Return");
  u8g.drawStr(3,20+13,"Notes");
  u8g.drawStr(3,20+13+13,"Torch");
  u8g.drawStr(3,20+13+13+13,"Find My Phone");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  while(u8g.nextPage());&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void CalcPrintdata()&lt;br&gt;
{&lt;br&gt;
  u8g.setPrintPos(50,25);&lt;br&gt;
  u8g.print(n3);&lt;br&gt;
  u8g.setPrintPos(40,25);&lt;br&gt;
  u8g.print(n4);&lt;br&gt;
  u8g.setPrintPos(30,25);&lt;br&gt;
  u8g.print(n5);&lt;br&gt;
  u8g.setPrintPos(20,25);&lt;br&gt;
  u8g.print(n6);&lt;br&gt;
  u8g.setPrintPos(60,25);&lt;br&gt;
  u8g.print(".");&lt;br&gt;
  u8g.setPrintPos(70,25);&lt;br&gt;
  u8g.print(n7);&lt;br&gt;
  u8g.setPrintPos(80,25);&lt;br&gt;
  u8g.print(n8);&lt;br&gt;
  u8g.setPrintPos(3,37);&lt;br&gt;
  u8g.print(op[k]);&lt;br&gt;
  u8g.setPrintPos(50,37);&lt;br&gt;
  u8g.print(N3);&lt;br&gt;
  u8g.setPrintPos(40,37);&lt;br&gt;
  u8g.print(N4);&lt;br&gt;
  u8g.setPrintPos(30,37);&lt;br&gt;
  u8g.print(N5);&lt;br&gt;
  u8g.setPrintPos(20,37);&lt;br&gt;
  u8g.print(N6);&lt;br&gt;
  u8g.setPrintPos(60,37);&lt;br&gt;
  u8g.print(".");&lt;br&gt;
  u8g.setPrintPos(70,37);&lt;br&gt;
  u8g.print(N7);&lt;br&gt;
  u8g.setPrintPos(80,37);&lt;br&gt;
  u8g.print(N8);&lt;br&gt;
  u8g.setPrintPos(5,46);&lt;br&gt;
  u8g.print("---------------");&lt;br&gt;&lt;br&gt;
  u8g.setPrintPos(5,54);&lt;br&gt;
  u8g.print(ans);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void Calc()&lt;br&gt;
{&lt;br&gt;
   u8g.firstPage();&lt;br&gt;
   do{&lt;br&gt;
        u8g.setFont(u8g_font_unifont);&lt;br&gt;
        u8g.setPrintPos(0,10);&lt;br&gt;
        u8g.print("Calculator:-");&lt;br&gt;
        if(digitalRead(previousButton) == LOW)&lt;br&gt;
        {&lt;br&gt;
          j++;&lt;br&gt;
          delay(300);&lt;br&gt;
          if(j&amp;gt;12)&lt;br&gt;
            j = 0;&lt;br&gt;
        }&lt;br&gt;
        if(digitalRead(nextButton)==LOW &amp;amp;&amp;amp; digitalRead(previousButton)==LOW)&lt;br&gt;
        {&lt;br&gt;
          j=13;&lt;br&gt;
          delay(300);&lt;br&gt;
        }&lt;br&gt;
        if(j==0)&lt;br&gt;
        {&lt;br&gt;
          CalcPrintdata();&lt;br&gt;
          if(digitalRead(nextButton) == LOW)&lt;br&gt;
          {&lt;br&gt;
            n6++;&lt;br&gt;
            delay(300);&lt;br&gt;
          }&lt;br&gt;
          if(n6&amp;gt;9)&lt;br&gt;
            n6=0;&lt;br&gt;
        }&lt;br&gt;
        if(j==1)&lt;br&gt;
        {&lt;br&gt;
          CalcPrintdata();&lt;br&gt;
          if(digitalRead(nextButton) == LOW)&lt;br&gt;
          {&lt;br&gt;
            n5++;&lt;br&gt;
            delay(300);&lt;br&gt;
          }&lt;br&gt;
          if(n5&amp;gt;9)&lt;br&gt;
            n5=0;&lt;br&gt;
        }&lt;br&gt;
        if(j==2)&lt;br&gt;
        {&lt;br&gt;
          CalcPrintdata();&lt;br&gt;
          if(digitalRead(nextButton) == LOW)&lt;br&gt;
          {&lt;br&gt;
            n4++;&lt;br&gt;
            delay(300);&lt;br&gt;
          }&lt;br&gt;
          if(n4&amp;gt;9)&lt;br&gt;
            n4=0;&lt;br&gt;
        }&lt;br&gt;
        if(j==3)&lt;br&gt;
        {&lt;br&gt;
          CalcPrintdata();&lt;br&gt;
          if(digitalRead(nextButton) == LOW)&lt;br&gt;
          {&lt;br&gt;
            n3++;&lt;br&gt;
            delay(300);&lt;br&gt;
          }&lt;br&gt;
          if(n3&amp;gt;9)&lt;br&gt;
            n3=0;&lt;br&gt;
        }&lt;br&gt;
        if(j==4)&lt;br&gt;
        {&lt;br&gt;
          CalcPrintdata();&lt;br&gt;
          if(digitalRead(nextButton) == LOW)&lt;br&gt;
          {&lt;br&gt;
            n7++;&lt;br&gt;
            delay(300);&lt;br&gt;
          }&lt;br&gt;
          if(n7&amp;gt;9)&lt;br&gt;
            n7=0;&lt;br&gt;
        }&lt;br&gt;
        if(j==5)&lt;br&gt;
        {&lt;br&gt;
          CalcPrintdata();&lt;br&gt;
          if(digitalRead(nextButton) == LOW)&lt;br&gt;
          {&lt;br&gt;
            n8++;&lt;br&gt;
            delay(300);&lt;br&gt;
          }&lt;br&gt;
          if(n8&amp;gt;9)&lt;br&gt;
            n8=0;&lt;br&gt;
        }&lt;br&gt;
        if(j==6)&lt;br&gt;
        {&lt;br&gt;
          CalcPrintdata();&lt;br&gt;
          if(digitalRead(nextButton) == LOW)&lt;br&gt;
          {&lt;br&gt;
            k++;&lt;br&gt;
            delay(300);&lt;br&gt;
          }&lt;br&gt;
          if(k&amp;gt;3)&lt;br&gt;
            k=0;&lt;br&gt;
        }&lt;br&gt;
        if(j==7)&lt;br&gt;
        {&lt;br&gt;
          CalcPrintdata();&lt;br&gt;
          if(digitalRead(nextButton) == LOW)&lt;br&gt;
          {&lt;br&gt;
            N6++;&lt;br&gt;
            delay(300);&lt;br&gt;
...&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>react</category>
      <category>typescript</category>
    </item>
    <item>
      <title>smart watch with 3d printer function</title>
      <dc:creator>jay jordan</dc:creator>
      <pubDate>Mon, 25 Dec 2023 15:58:15 +0000</pubDate>
      <link>https://dev.to/jayjo87/smart-watch-with-3d-printer-function-4087</link>
      <guid>https://dev.to/jayjo87/smart-watch-with-3d-printer-function-4087</guid>
      <description>&lt;h1&gt;
  
  
  define X_STEP_PIN      54
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_DIR_PIN       55
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_ENABLE_PIN       38
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_MIN_PIN           3
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_MAX_PIN           2
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_STEP_PIN         60
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_DIR_PIN          61
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_ENABLE_PIN       56
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_MIN_PIN          14
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_MAX_PIN          15
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_STEP_PIN         46
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_DIR_PIN          48
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_ENABLE_PIN       62
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_MIN_PIN          18
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_MAX_PIN          19
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_STEP_PIN         26
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_DIR_PIN          28
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_ENABLE_PIN       24
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_STEP_PIN     36
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_DIR_PIN          34
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_ENABLE_PIN       30
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define SDPOWER            -1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define SDSS               53
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define LED_PIN            13
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define FAN_PIN         9
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define PS_ON_PIN          12
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define KILL_PIN           -1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define HEATER_0_PIN       10
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define HEATER_1_PIN    8
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TEMP_0_PIN          13   // ANALOG NUMBERING
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TEMP_1_PIN          14   // ANALOG NUMBERING
&lt;/h1&gt;

&lt;p&gt;void setup() {&lt;/p&gt;

&lt;p&gt;pinMode(FAN_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(HEATER_0_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(HEATER_1_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(LED_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_DIR_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_ENABLE_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_DIR_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_ENABLE_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_DIR_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_ENABLE_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_DIR_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_ENABLE_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_DIR_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_ENABLE_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;digitalWrite(X_ENABLE_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_ENABLE_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_ENABLE_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_ENABLE_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_ENABLE_PIN , LOW);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;void loop () {&lt;/p&gt;

&lt;p&gt;if (millis() %1000 &amp;lt;500)&lt;/p&gt;

&lt;p&gt;digitalWrite(LED_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;else&lt;/p&gt;

&lt;p&gt;digitalWrite(LED_PIN, LOW);&lt;/p&gt;

&lt;p&gt;if (millis() %1000 &amp;lt;300) {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, LOW);&lt;/p&gt;

&lt;p&gt;} else if (millis() %1000 &amp;lt;600) {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, LOW);&lt;/p&gt;

&lt;p&gt;} else  {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;if (millis() %10000 &amp;lt;5000) {&lt;/p&gt;

&lt;p&gt;digitalWrite(X_DIR_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_DIR_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_DIR_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_DIR_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_DIR_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;else {&lt;/p&gt;

&lt;p&gt;digitalWrite(X_DIR_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_DIR_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_DIR_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_DIR_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_DIR_PIN , LOW);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;digitalWrite(X_STEP_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_STEP_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_STEP_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_STEP_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_STEP_PIN , HIGH);&lt;/p&gt;

&lt;p&gt;delay(1);&lt;/p&gt;

&lt;p&gt;digitalWrite(X_STEP_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_STEP_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_STEP_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_STEP_PIN , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_STEP_PIN , LOW);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;This code should activate all the steppers, fans, and heaters. The only problem with this code is that it does not activate both z-axis steppers; it only activates one. If you encounter any problems with any of the components, try isolating them and only running them in the code. If you would like to test the z-axis and thermistor, download the following codes:&lt;/p&gt;



&lt;h1&gt;
  
  
  ifndef THERMISTORTABLES_H_
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define THERMISTORTABLES_H_
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define OVERSAMPLENR 16
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 1) || (THERMISTORHEATER_1 == 1)  || (THERMISTORHEATER_2 == 1) || (THERMISTORBED == 1) //100k bed thermistor
&lt;/h1&gt;

&lt;p&gt;const short temptable_1[][2] PROGMEM = {&lt;br&gt;
{       23*OVERSAMPLENR ,       300     },&lt;br&gt;
{       25*OVERSAMPLENR ,       295     },&lt;br&gt;
{       27*OVERSAMPLENR ,       290     },&lt;br&gt;
{       28*OVERSAMPLENR ,       285     },&lt;br&gt;
{       31*OVERSAMPLENR ,       280     },&lt;br&gt;
{       33*OVERSAMPLENR ,       275     },&lt;br&gt;
{       35*OVERSAMPLENR ,       270     },&lt;br&gt;
{       38*OVERSAMPLENR ,       265     },&lt;br&gt;
{       41*OVERSAMPLENR ,       260     },&lt;br&gt;
{       44*OVERSAMPLENR ,       255     },&lt;br&gt;
{       48*OVERSAMPLENR ,       250     },&lt;br&gt;
{       52*OVERSAMPLENR ,       245     },&lt;br&gt;
{       56*OVERSAMPLENR ,       240     },&lt;br&gt;
{       61*OVERSAMPLENR ,       235     },&lt;br&gt;
{       66*OVERSAMPLENR ,       230     },&lt;br&gt;
{       71*OVERSAMPLENR ,       225     },&lt;br&gt;
{       78*OVERSAMPLENR ,       220     },&lt;br&gt;
{       84*OVERSAMPLENR ,       215     },&lt;br&gt;
{       92*OVERSAMPLENR ,       210     },&lt;br&gt;
{       100*OVERSAMPLENR        ,       205     },&lt;br&gt;
{       109*OVERSAMPLENR        ,       200     },&lt;br&gt;
{       120*OVERSAMPLENR        ,       195     },&lt;br&gt;
{       131*OVERSAMPLENR        ,       190     },&lt;br&gt;
{       143*OVERSAMPLENR        ,       185     },&lt;br&gt;
{       156*OVERSAMPLENR        ,       180     },&lt;br&gt;
{       171*OVERSAMPLENR        ,       175     },&lt;br&gt;
{       187*OVERSAMPLENR        ,       170     },&lt;br&gt;
{       205*OVERSAMPLENR        ,       165     },&lt;br&gt;
{       224*OVERSAMPLENR        ,       160     },&lt;br&gt;
{       245*OVERSAMPLENR        ,       155     },&lt;br&gt;
{       268*OVERSAMPLENR        ,       150     },&lt;br&gt;
{       293*OVERSAMPLENR        ,       145     },&lt;br&gt;
{       320*OVERSAMPLENR        ,       140     },&lt;br&gt;
{       348*OVERSAMPLENR        ,       135     },&lt;br&gt;
{       379*OVERSAMPLENR        ,       130     },&lt;br&gt;
{       411*OVERSAMPLENR        ,       125     },&lt;br&gt;
{       445*OVERSAMPLENR        ,       120     },&lt;br&gt;
{       480*OVERSAMPLENR        ,       115     },&lt;br&gt;
{       516*OVERSAMPLENR        ,       110     },&lt;br&gt;
{       553*OVERSAMPLENR        ,       105     },&lt;br&gt;
{       591*OVERSAMPLENR        ,       100     },&lt;br&gt;
{       628*OVERSAMPLENR        ,       95      },&lt;br&gt;
{       665*OVERSAMPLENR        ,       90      },&lt;br&gt;
{       702*OVERSAMPLENR        ,       85      },&lt;br&gt;
{       737*OVERSAMPLENR        ,       80      },&lt;br&gt;
{       770*OVERSAMPLENR        ,       75      },&lt;br&gt;
{       801*OVERSAMPLENR        ,       70      },&lt;br&gt;
{       830*OVERSAMPLENR        ,       65      },&lt;br&gt;
{       857*OVERSAMPLENR        ,       60      },&lt;br&gt;
{       881*OVERSAMPLENR        ,       55      },&lt;br&gt;
{       903*OVERSAMPLENR        ,       50      },&lt;br&gt;
{       922*OVERSAMPLENR        ,       45      },&lt;br&gt;
{       939*OVERSAMPLENR        ,       40      },&lt;br&gt;
{       954*OVERSAMPLENR        ,       35      },&lt;br&gt;
{       966*OVERSAMPLENR        ,       30      },&lt;br&gt;
{       977*OVERSAMPLENR        ,       25      },&lt;br&gt;
{       985*OVERSAMPLENR        ,       20      },&lt;br&gt;
{       993*OVERSAMPLENR        ,       15      },&lt;br&gt;
{       999*OVERSAMPLENR        ,       10      },&lt;br&gt;
{       1004*OVERSAMPLENR       ,       5       },&lt;br&gt;
{       1008*OVERSAMPLENR       ,       0       } //safety&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 2) || (THERMISTORHEATER_1 == 2) || (THERMISTORHEATER_2 == 2) || (THERMISTORBED == 2) //200k bed thermistor
&lt;/h1&gt;

&lt;p&gt;const short temptable_2[][2] PROGMEM = {&lt;br&gt;
  {1*OVERSAMPLENR, 848},&lt;br&gt;
  {54*OVERSAMPLENR, 275},&lt;br&gt;
  {107*OVERSAMPLENR, 228},&lt;br&gt;
  {160*OVERSAMPLENR, 202},&lt;br&gt;
  {213*OVERSAMPLENR, 185},&lt;br&gt;
  {266*OVERSAMPLENR, 171},&lt;br&gt;
  {319*OVERSAMPLENR, 160},&lt;br&gt;
  {372*OVERSAMPLENR, 150},&lt;br&gt;
  {425*OVERSAMPLENR, 141},&lt;br&gt;
  {478*OVERSAMPLENR, 133},&lt;br&gt;
  {531*OVERSAMPLENR, 125},&lt;br&gt;
  {584*OVERSAMPLENR, 118},&lt;br&gt;
  {637*OVERSAMPLENR, 110},&lt;br&gt;
  {690*OVERSAMPLENR, 103},&lt;br&gt;
  {743*OVERSAMPLENR, 95},&lt;br&gt;
  {796*OVERSAMPLENR, 86},&lt;br&gt;
  {849*OVERSAMPLENR, 77},&lt;br&gt;
  {902*OVERSAMPLENR, 65},&lt;br&gt;
  {955*OVERSAMPLENR, 49},&lt;br&gt;
  {1008*OVERSAMPLENR, 17},&lt;br&gt;
  {1020*OVERSAMPLENR, 0} //safety&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 3) || (THERMISTORHEATER_1 == 3) || (THERMISTORHEATER_2 == 3) || (THERMISTORBED == 3) //mendel-parts
&lt;/h1&gt;

&lt;p&gt;const short temptable_3[][2] PROGMEM = {&lt;br&gt;
               {1*OVERSAMPLENR,864},&lt;br&gt;
               {21*OVERSAMPLENR,300},&lt;br&gt;
               {25*OVERSAMPLENR,290},&lt;br&gt;
               {29*OVERSAMPLENR,280},&lt;br&gt;
               {33*OVERSAMPLENR,270},&lt;br&gt;
               {39*OVERSAMPLENR,260},&lt;br&gt;
               {46*OVERSAMPLENR,250},&lt;br&gt;
               {54*OVERSAMPLENR,240},&lt;br&gt;
               {64*OVERSAMPLENR,230},&lt;br&gt;
               {75*OVERSAMPLENR,220},&lt;br&gt;
               {90*OVERSAMPLENR,210},&lt;br&gt;
               {107*OVERSAMPLENR,200},&lt;br&gt;
               {128*OVERSAMPLENR,190},&lt;br&gt;
               {154*OVERSAMPLENR,180},&lt;br&gt;
               {184*OVERSAMPLENR,170},&lt;br&gt;
               {221*OVERSAMPLENR,160},&lt;br&gt;
               {265*OVERSAMPLENR,150},&lt;br&gt;
               {316*OVERSAMPLENR,140},&lt;br&gt;
               {375*OVERSAMPLENR,130},&lt;br&gt;
               {441*OVERSAMPLENR,120},&lt;br&gt;
               {513*OVERSAMPLENR,110},&lt;br&gt;
               {588*OVERSAMPLENR,100},&lt;br&gt;
               {734*OVERSAMPLENR,80},&lt;br&gt;
               {856*OVERSAMPLENR,60},&lt;br&gt;
               {938*OVERSAMPLENR,40},&lt;br&gt;
               {986*OVERSAMPLENR,20},&lt;br&gt;
               {1008*OVERSAMPLENR,0},&lt;br&gt;
               {1018*OVERSAMPLENR,-20}&lt;br&gt;
       };&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 4) || (THERMISTORHEATER_1 == 4) || (THERMISTORHEATER_2 == 4) || (THERMISTORBED == 4) //10k thermistor
&lt;/h1&gt;

&lt;p&gt;const short temptable_4[][2] PROGMEM = {&lt;br&gt;
  {1*OVERSAMPLENR, 430},&lt;br&gt;
  {54*OVERSAMPLENR, 137},&lt;br&gt;
  {107*OVERSAMPLENR, 107},&lt;br&gt;
  {160*OVERSAMPLENR, 91},&lt;br&gt;
  {213*OVERSAMPLENR, 80},&lt;br&gt;
  {266*OVERSAMPLENR, 71},&lt;br&gt;
  {319*OVERSAMPLENR, 64},&lt;br&gt;
  {372*OVERSAMPLENR, 57},&lt;br&gt;
  {425*OVERSAMPLENR, 51},&lt;br&gt;
  {478*OVERSAMPLENR, 46},&lt;br&gt;
  {531*OVERSAMPLENR, 41},&lt;br&gt;
  {584*OVERSAMPLENR, 35},&lt;br&gt;
  {637*OVERSAMPLENR, 30},&lt;br&gt;
  {690*OVERSAMPLENR, 25},&lt;br&gt;
  {743*OVERSAMPLENR, 20},&lt;br&gt;
  {796*OVERSAMPLENR, 14},&lt;br&gt;
  {849*OVERSAMPLENR, 7},&lt;br&gt;
  {902*OVERSAMPLENR, 0},&lt;br&gt;
  {955*OVERSAMPLENR, -11},&lt;br&gt;
  {1008*OVERSAMPLENR, -35}&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 5) || (THERMISTORHEATER_1 == 5) || (THERMISTORHEATER_2 == 5) || (THERMISTORBED == 5) //100k ParCan thermistor (104GT-2)
&lt;/h1&gt;

&lt;p&gt;const short temptable_5[][2] PROGMEM = {&lt;br&gt;
{1*OVERSAMPLENR, 713},&lt;br&gt;
{18*OVERSAMPLENR, 316},&lt;br&gt;
{35*OVERSAMPLENR, 266},&lt;br&gt;
{52*OVERSAMPLENR, 239},&lt;br&gt;
{69*OVERSAMPLENR, 221},&lt;br&gt;
{86*OVERSAMPLENR, 208},&lt;br&gt;
{103*OVERSAMPLENR, 197},&lt;br&gt;
{120*OVERSAMPLENR, 188},&lt;br&gt;
{137*OVERSAMPLENR, 181},&lt;br&gt;
{154*OVERSAMPLENR, 174},&lt;br&gt;
{171*OVERSAMPLENR, 169},&lt;br&gt;
{188*OVERSAMPLENR, 163},&lt;br&gt;
{205*OVERSAMPLENR, 159},&lt;br&gt;
{222*OVERSAMPLENR, 154},&lt;br&gt;
{239*OVERSAMPLENR, 150},&lt;br&gt;
{256*OVERSAMPLENR, 147},&lt;br&gt;
{273*OVERSAMPLENR, 143},&lt;br&gt;
{290*OVERSAMPLENR, 140},&lt;br&gt;
{307*OVERSAMPLENR, 136},&lt;br&gt;
{324*OVERSAMPLENR, 133},&lt;br&gt;
{341*OVERSAMPLENR, 130},&lt;br&gt;
{358*OVERSAMPLENR, 128},&lt;br&gt;
{375*OVERSAMPLENR, 125},&lt;br&gt;
{392*OVERSAMPLENR, 122},&lt;br&gt;
{409*OVERSAMPLENR, 120},&lt;br&gt;
{426*OVERSAMPLENR, 117},&lt;br&gt;
{443*OVERSAMPLENR, 115},&lt;br&gt;
{460*OVERSAMPLENR, 112},&lt;br&gt;
{477*OVERSAMPLENR, 110},&lt;br&gt;
{494*OVERSAMPLENR, 108},&lt;br&gt;
{511*OVERSAMPLENR, 106},&lt;br&gt;
{528*OVERSAMPLENR, 103},&lt;br&gt;
{545*OVERSAMPLENR, 101},&lt;br&gt;
{562*OVERSAMPLENR, 99},&lt;br&gt;
{579*OVERSAMPLENR, 97},&lt;br&gt;
{596*OVERSAMPLENR, 95},&lt;br&gt;
{613*OVERSAMPLENR, 92},&lt;br&gt;
{630*OVERSAMPLENR, 90},&lt;br&gt;
{647*OVERSAMPLENR, 88},&lt;br&gt;
{664*OVERSAMPLENR, 86},&lt;br&gt;
{681*OVERSAMPLENR, 84},&lt;br&gt;
{698*OVERSAMPLENR, 81},&lt;br&gt;
{715*OVERSAMPLENR, 79},&lt;br&gt;
{732*OVERSAMPLENR, 77},&lt;br&gt;
{749*OVERSAMPLENR, 75},&lt;br&gt;
{766*OVERSAMPLENR, 72},&lt;br&gt;
{783*OVERSAMPLENR, 70},&lt;br&gt;
{800*OVERSAMPLENR, 67},&lt;br&gt;
{817*OVERSAMPLENR, 64},&lt;br&gt;
{834*OVERSAMPLENR, 61},&lt;br&gt;
{851*OVERSAMPLENR, 58},&lt;br&gt;
{868*OVERSAMPLENR, 55},&lt;br&gt;
{885*OVERSAMPLENR, 52},&lt;br&gt;
{902*OVERSAMPLENR, 48},&lt;br&gt;
{919*OVERSAMPLENR, 44},&lt;br&gt;
{936*OVERSAMPLENR, 40},&lt;br&gt;
{953*OVERSAMPLENR, 34},&lt;br&gt;
{970*OVERSAMPLENR, 28},&lt;br&gt;
{987*OVERSAMPLENR, 20},&lt;br&gt;
{1004*OVERSAMPLENR, 8},&lt;br&gt;
{1021*OVERSAMPLENR, 0}&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 6) || (THERMISTORHEATER_1 == 6) || (THERMISTORHEATER_2 == 6) || (THERMISTORBED == 6) // 100k Epcos thermistor
&lt;/h1&gt;

&lt;p&gt;const short temptable_6[][2] PROGMEM = {&lt;br&gt;
  {28*OVERSAMPLENR, 250},&lt;br&gt;
  {31*OVERSAMPLENR, 245},&lt;br&gt;
  {35*OVERSAMPLENR, 240},&lt;br&gt;
  {39*OVERSAMPLENR, 235},&lt;br&gt;
  {42*OVERSAMPLENR, 230},&lt;br&gt;
  {44*OVERSAMPLENR, 225},&lt;br&gt;
  {49*OVERSAMPLENR, 220},&lt;br&gt;
  {53*OVERSAMPLENR, 215},&lt;br&gt;
  {62*OVERSAMPLENR, 210},&lt;br&gt;
  {73*OVERSAMPLENR, 205},&lt;br&gt;
  {72*OVERSAMPLENR, 200},&lt;br&gt;
  {94*OVERSAMPLENR, 190},&lt;br&gt;
  {102*OVERSAMPLENR, 185},&lt;br&gt;
  {116*OVERSAMPLENR, 170},&lt;br&gt;
  {143*OVERSAMPLENR, 160},&lt;br&gt;
  {183*OVERSAMPLENR, 150},&lt;br&gt;
  {223*OVERSAMPLENR, 140},&lt;br&gt;
  {270*OVERSAMPLENR, 130},&lt;br&gt;
  {318*OVERSAMPLENR, 120},&lt;br&gt;
  {383*OVERSAMPLENR, 110},&lt;br&gt;
  {413*OVERSAMPLENR, 105},&lt;br&gt;
  {439*OVERSAMPLENR, 100},&lt;br&gt;
  {484*OVERSAMPLENR, 95},&lt;br&gt;
  {513*OVERSAMPLENR, 90},&lt;br&gt;
  {607*OVERSAMPLENR, 80},&lt;br&gt;
  {664*OVERSAMPLENR, 70},&lt;br&gt;
  {781*OVERSAMPLENR, 60},&lt;br&gt;
  {810*OVERSAMPLENR, 55},&lt;br&gt;
  {849*OVERSAMPLENR, 50},&lt;br&gt;
  {914*OVERSAMPLENR, 45},&lt;br&gt;
  {914*OVERSAMPLENR, 40},&lt;br&gt;
  {935*OVERSAMPLENR, 35},&lt;br&gt;
  {954*OVERSAMPLENR, 30},&lt;br&gt;
  {970*OVERSAMPLENR, 25},&lt;br&gt;
  {978*OVERSAMPLENR, 22},&lt;br&gt;
  {1008*OVERSAMPLENR, 3}&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  if (THERMISTORHEATER_0 == 7) || (THERMISTORHEATER_1 == 7) || (THERMISTORHEATER_2 == 7) || (THERMISTORBED == 7) // 100k Honeywell 135-104LAG-J01
&lt;/h1&gt;

&lt;p&gt;const short temptable_7[][2] PROGMEM = {&lt;br&gt;
  {46*OVERSAMPLENR, 270},&lt;br&gt;
  {50*OVERSAMPLENR, 265},&lt;br&gt;
  {54*OVERSAMPLENR, 260},&lt;br&gt;
  {58*OVERSAMPLENR, 255},&lt;br&gt;
  {62*OVERSAMPLENR, 250},&lt;br&gt;
  {67*OVERSAMPLENR, 245},&lt;br&gt;
  {72*OVERSAMPLENR, 240},&lt;br&gt;
  {79*OVERSAMPLENR, 235},&lt;br&gt;
  {85*OVERSAMPLENR, 230},&lt;br&gt;
  {91*OVERSAMPLENR, 225},&lt;br&gt;
  {99*OVERSAMPLENR, 220},&lt;br&gt;
  {107*OVERSAMPLENR, 215},&lt;br&gt;
  {116*OVERSAMPLENR, 210},&lt;br&gt;
  {126*OVERSAMPLENR, 205},&lt;br&gt;
  {136*OVERSAMPLENR, 200},&lt;br&gt;
  {149*OVERSAMPLENR, 195},&lt;br&gt;
  {160*OVERSAMPLENR, 190},&lt;br&gt;
  {175*OVERSAMPLENR, 185},&lt;br&gt;
  {191*OVERSAMPLENR, 180},&lt;br&gt;
  {209*OVERSAMPLENR, 175},&lt;br&gt;
  {224*OVERSAMPLENR, 170},&lt;br&gt;
  {246*OVERSAMPLENR, 165},&lt;br&gt;
  {267*OVERSAMPLENR, 160},&lt;br&gt;
  {293*OVERSAMPLENR, 155},&lt;br&gt;
  {316*OVERSAMPLENR, 150},&lt;br&gt;
  {340*OVERSAMPLENR, 145},&lt;br&gt;
  {364*OVERSAMPLENR, 140},&lt;br&gt;
  {396*OVERSAMPLENR, 135},&lt;br&gt;
  {425*OVERSAMPLENR, 130},&lt;br&gt;
  {460*OVERSAMPLENR, 125},&lt;br&gt;
  {489*OVERSAMPLENR, 120},&lt;br&gt;
  {526*OVERSAMPLENR, 115},&lt;br&gt;
  {558*OVERSAMPLENR, 110},&lt;br&gt;
  {591*OVERSAMPLENR, 105},&lt;br&gt;
  {628*OVERSAMPLENR, 100},&lt;br&gt;
  {660*OVERSAMPLENR, 95},&lt;br&gt;
  {696*OVERSAMPLENR, 90},&lt;br&gt;
  {733*OVERSAMPLENR, 85},&lt;br&gt;
  {761*OVERSAMPLENR, 80},&lt;br&gt;
  {794*OVERSAMPLENR, 75},&lt;br&gt;
  {819*OVERSAMPLENR, 70},&lt;br&gt;
  {847*OVERSAMPLENR, 65},&lt;br&gt;
  {870*OVERSAMPLENR, 60},&lt;br&gt;
  {892*OVERSAMPLENR, 55},&lt;br&gt;
  {911*OVERSAMPLENR, 50},&lt;br&gt;
  {929*OVERSAMPLENR, 45},&lt;br&gt;
  {944*OVERSAMPLENR, 40},&lt;br&gt;
  {959*OVERSAMPLENR, 35},&lt;br&gt;
  {971*OVERSAMPLENR, 30},&lt;br&gt;
  {981*OVERSAMPLENR, 25},&lt;br&gt;
  {989*OVERSAMPLENR, 20},&lt;br&gt;
  {994*OVERSAMPLENR, 15},&lt;br&gt;
  {1001*OVERSAMPLENR, 10},&lt;br&gt;
  {1005*OVERSAMPLENR, 5}&lt;br&gt;
};&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define &lt;em&gt;TT_NAME(_N) temptable&lt;/em&gt; ## _N
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TT_NAME(_N) _TT_NAME(_N)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef THERMISTORHEATER_0
&lt;/h1&gt;

&lt;p&gt;#define heater_0_temptable TT_NAME(THERMISTORHEATER_0)&lt;br&gt;
 #define heater_0_temptable_len (sizeof(heater_0_temptable)/sizeof(*heater_0_temptable))&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef HEATER_0_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#error No heater 0 thermistor table specified&lt;/p&gt;

&lt;h1&gt;
  
  
  else  // HEATER_0_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#define heater_0_temptable 0&lt;br&gt;
 #define heater_0_temptable_len 0&lt;/p&gt;

&lt;h1&gt;
  
  
  endif // HEATER_0_USES_THERMISTOR
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef THERMISTORHEATER_1
&lt;/h1&gt;

&lt;p&gt;#define heater_1_temptable TT_NAME(THERMISTORHEATER_1)&lt;br&gt;
 #define heater_1_temptable_len (sizeof(heater_1_temptable)/sizeof(*heater_1_temptable))&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef HEATER_1_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#error No heater 1 thermistor table specified&lt;/p&gt;

&lt;h1&gt;
  
  
  else  // HEATER_1_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#define heater_1_temptable 0&lt;br&gt;
 #define heater_1_temptable_len 0&lt;/p&gt;

&lt;h1&gt;
  
  
  endif // HEATER_1_USES_THERMISTOR
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef THERMISTORHEATER_2
&lt;/h1&gt;

&lt;p&gt;#define heater_2_temptable TT_NAME(THERMISTORHEATER_2)&lt;br&gt;
 #define heater_2_temptable_len (sizeof(heater_2_temptable)/sizeof(*heater_2_temptable))&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef HEATER_2_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#error No heater 2 thermistor table specified&lt;/p&gt;

&lt;h1&gt;
  
  
  else  // HEATER_2_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#define heater_2_temptable 0&lt;br&gt;
 #define heater_2_temptable_len 0&lt;/p&gt;

&lt;h1&gt;
  
  
  endif // HEATER_2_USES_THERMISTOR
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef THERMISTORBED
&lt;/h1&gt;

&lt;p&gt;#define bedtemptable TT_NAME(THERMISTORBED)&lt;br&gt;
 #define bedtemptable_len (sizeof(bedtemptable)/sizeof(*bedtemptable))&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ifdef BED_USES_THERMISTOR
&lt;/h1&gt;

&lt;p&gt;#error No bed thermistor table specified&lt;/p&gt;

&lt;h1&gt;
  
  
  endif // BED_USES_THERMISTOR
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;h1&gt;
  
  
  endif //THERMISTORTABLES_H_
&lt;/h1&gt;



&lt;h1&gt;
  
  
  include "thermistortables.h"
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_STEP_PIN         54
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_DIR_PIN          55
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_ENABLE_PIN       38
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_MIN_PIN           3
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define X_MAX_PIN           2
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_STEP_PIN         60
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_DIR_PIN          61
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_ENABLE_PIN       56
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_MIN_PIN          14
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Y_MAX_PIN          15
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_STEP_PIN         46
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_DIR_PIN          48
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_ENABLE_PIN       62
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_MIN_PIN          18
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Z_MAX_PIN          19
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_STEP_PIN         26
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_DIR_PIN          28
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define E_ENABLE_PIN       24
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_STEP_PIN         36
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_DIR_PIN          34
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define Q_ENABLE_PIN       30
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define SDPOWER            -1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define EXTRUDERS 3
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TEMP_SENSOR_AD595_OFFSET 0.0
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define TEMP_SENSOR_AD595_GAIN   1.0
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define THERMISTORHEATER_0 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define THERMISTORHEATER_1 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define THERMISTORHEATER_2 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define HEATER_0_USES_THERMISTOR 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define HEATER_1_USES_THERMISTOR 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define HEATER_2_USES_THERMISTOR 1
&lt;/h1&gt;

&lt;p&gt;static void *heater_ttbl_map[EXTRUDERS] = { (void *)heater_0_temptable&lt;/p&gt;

&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 1
&lt;/h1&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                       , (void *)heater_1_temptable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;
&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 2
&lt;/h1&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                       , (void *)heater_2_temptable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;
&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 3
&lt;/h1&gt;

&lt;p&gt;#error Unsupported number of extruders&lt;/p&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;};&lt;/p&gt;

&lt;p&gt;static int heater_ttbllen_map[EXTRUDERS] = { heater_0_temptable_len&lt;/p&gt;
&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 1
&lt;/h1&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                        , heater_1_temptable_len
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;
&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 2
&lt;/h1&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                        , heater_2_temptable_len
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;
&lt;h1&gt;
  
  
  if EXTRUDERS &amp;gt; 3
&lt;/h1&gt;

&lt;p&gt;#error Unsupported number of extruders&lt;/p&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;};&lt;/p&gt;

&lt;p&gt;#define PGM_RD_W(x)   (short)pgm_read_word(&amp;amp;x)&lt;/p&gt;
&lt;h1&gt;
  
  
  define SDSS               53
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LED_PIN            13
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define FAN_PIN            9
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define PS_ON_PIN          12
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define KILL_PIN           -1
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define HEATER_0_PIN       10
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define HEATER_1_PIN       8
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define TEMP_0_PIN         15   // ANALOG NUMBERING
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define TEMP_1_PIN         14   // ANALOG NUMBERING
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define TEMP_2_PIN         13   // ANALOG NUMBERING
&lt;/h1&gt;

&lt;p&gt;void setup() {&lt;/p&gt;

&lt;p&gt;pinMode(TEMP_0_PIN  , INPUT);&lt;/p&gt;

&lt;p&gt;pinMode(TEMP_1_PIN  , INPUT);&lt;/p&gt;

&lt;p&gt;pinMode(TEMP_2_PIN  , INPUT);&lt;/p&gt;

&lt;p&gt;pinMode(FAN_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(HEATER_0_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(HEATER_1_PIN , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(LED_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_DIR_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(X_ENABLE_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_DIR_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Y_ENABLE_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_DIR_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Z_ENABLE_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_DIR_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(E_ENABLE_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_STEP_PIN  , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_DIR_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;pinMode(Q_ENABLE_PIN    , OUTPUT);&lt;/p&gt;

&lt;p&gt;digitalWrite(X_ENABLE_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_ENABLE_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_ENABLE_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_ENABLE_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_ENABLE_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;Serial.begin(115200);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;float analog2temp(int raw, uint8_t e) {&lt;/p&gt;

&lt;p&gt;#ifdef HEATER_0_USES_MAX6675&lt;/p&gt;

&lt;p&gt;if (e == 0)&lt;/p&gt;

&lt;p&gt;{&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; return 0.25 * raw;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;#endif&lt;/p&gt;

&lt;p&gt;if(heater_ttbl_map[e] != 0)&lt;/p&gt;

&lt;p&gt;{&lt;/p&gt;

&lt;p&gt;float celsius = 0;&lt;/p&gt;

&lt;p&gt;byte i;  &lt;/p&gt;

&lt;p&gt;short (&lt;em&gt;tt)[][2] = (short (&lt;/em&gt;)[][2])(heater_ttbl_map[e]);&lt;/p&gt;

&lt;p&gt;raw = (1023 * OVERSAMPLENR) - raw;&lt;/p&gt;

&lt;p&gt;for (i=1; i&amp;lt;heater_ttbllen_map[e]; i++)&lt;/p&gt;

&lt;p&gt;{&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; if ((PGM_RD_W((*tt)[i][0]) &amp;gt; raw) &amp;amp;&amp;amp; ((float)(PGM_RD_W((*tt)[i][0]) - PGM_RD_W((*tt)[i-1][0])) &amp;gt;0))

 {

   celsius = PGM_RD_W((*tt)[i-1][1]) +

     (raw - PGM_RD_W((*tt)[i-1][0])) *

     (float)(PGM_RD_W((*tt)[i][1]) - PGM_RD_W((*tt)[i-1][1])) /

     (float)(PGM_RD_W((*tt)[i][0]) - PGM_RD_W((*tt)[i-1][0]));

   break;

 }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;// Overflow: Set to last value in the table&lt;/p&gt;

&lt;p&gt;if (i == heater_ttbllen_map[e]) celsius = PGM_RD_W((*tt)[i-1][1]);&lt;/p&gt;

&lt;p&gt;return celsius;&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;return ((raw * ((5.0 * 100.0) / 1024.0) / OVERSAMPLENR) * TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET;&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;unsigned long prevMillis;&lt;/p&gt;

&lt;p&gt;void loop () {&lt;/p&gt;

&lt;p&gt;if (millis() %1000 &amp;lt;500)&lt;/p&gt;

&lt;p&gt;digitalWrite(LED_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;else&lt;/p&gt;

&lt;p&gt;digitalWrite(LED_PIN, LOW);&lt;/p&gt;

&lt;p&gt;if (millis() %1000 &amp;lt;300) {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, LOW);&lt;/p&gt;

&lt;p&gt;} else if (millis() %1000 &amp;lt;600) {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, LOW);&lt;/p&gt;

&lt;p&gt;} else  {&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_0_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(HEATER_1_PIN, LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(FAN_PIN, HIGH);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;if (millis() %2000 &amp;lt;1000) {&lt;/p&gt;

&lt;p&gt;digitalWrite(X_DIR_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_DIR_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_DIR_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_DIR_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_DIR_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;else {&lt;/p&gt;

&lt;p&gt;digitalWrite(X_DIR_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_DIR_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_DIR_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_DIR_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_DIR_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;digitalWrite(X_STEP_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_STEP_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_STEP_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_STEP_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_STEP_PIN    , HIGH);&lt;/p&gt;

&lt;p&gt;delay(1);&lt;/p&gt;

&lt;p&gt;digitalWrite(X_STEP_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Y_STEP_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Z_STEP_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(E_STEP_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;digitalWrite(Q_STEP_PIN    , LOW);&lt;/p&gt;

&lt;p&gt;if (millis() -prevMillis &amp;gt;500){&lt;/p&gt;

&lt;p&gt;prevMillis=millis();&lt;/p&gt;

&lt;p&gt;int t = analogRead( TEMP_0_PIN);&lt;/p&gt;

&lt;p&gt;Serial.print("T0 ");&lt;/p&gt;

&lt;p&gt;Serial.print(t);&lt;/p&gt;

&lt;p&gt;Serial.print("/");&lt;/p&gt;

&lt;p&gt;Serial.print(analog2temp(1024 - t,0),0);&lt;/p&gt;

&lt;p&gt;Serial.print(" T1 ");&lt;/p&gt;

&lt;p&gt;t = analogRead( TEMP_1_PIN);&lt;/p&gt;

&lt;p&gt;Serial.print(t);&lt;/p&gt;

&lt;p&gt;Serial.print("/");&lt;/p&gt;

&lt;p&gt;Serial.print(analog2temp(1024 - t,1),0);&lt;/p&gt;

&lt;p&gt;Serial.print(" T2 ");&lt;/p&gt;

&lt;p&gt;t = analogRead( TEMP_2_PIN);&lt;/p&gt;

&lt;p&gt;Serial.print(t);&lt;/p&gt;

&lt;p&gt;Serial.print("/");&lt;/p&gt;

&lt;p&gt;Serial.println(analog2temp(1024 - t,2),0);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include "U8glib.h"
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include "SoftwareSerial.h"
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define nextButton 7      //define the pin numbers for the buttons
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define previousButton 5
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define menuButton 4
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define mot 9
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define buzz A3
&lt;/h1&gt;

&lt;p&gt;SoftwareSerial bluetooth(2,3);    //Use software serial for bluetooth&lt;/p&gt;

&lt;p&gt;const unsigned char PROGMEM ICON_BITMAP_1[] = &lt;br&gt;
{     //Android Logo&lt;br&gt;
  0x00,0x00,&lt;br&gt;
  0x00,0x00,&lt;br&gt;
  0x04,0x40,&lt;br&gt;
  0x07,0xc0,&lt;br&gt;
  0x0f,0xe0,&lt;br&gt;
  0x0b,0xa0,&lt;br&gt;
  0x1f,0xf0,&lt;br&gt;
  0x00,0x00,&lt;br&gt;
  0x5f,0xf4,&lt;br&gt;
  0x5f,0xf4,&lt;br&gt;
  0x5f,0xf4,&lt;br&gt;
  0x5f,0xf4,&lt;br&gt;
  0x1f,0xf0,&lt;br&gt;
  0x0c,0x60,&lt;br&gt;
  0x0c,0x60,&lt;br&gt;
  0x00,0x00&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;const unsigned char PROGMEM ICON_BITMAP_20[] = &lt;br&gt;
{    //chat&lt;br&gt;
  0x00,0x00,&lt;br&gt;
  0x00,0x00,&lt;br&gt;
  0x3f,0xf8,&lt;br&gt;
  0x40,0x04,&lt;br&gt;
  0x40,0x04,&lt;br&gt;
  0x40,0x04,&lt;br&gt;
  0x40,0x04,&lt;br&gt;
  0x49,0x24,&lt;br&gt;
  0x40,0x04,&lt;br&gt;
  0x40,0x04,&lt;br&gt;
  0x40,0x04,&lt;br&gt;
  0x3f,0xc8,&lt;br&gt;
  0x00,0x28,&lt;br&gt;
  0x00,0x18,&lt;br&gt;
  0x00,0x08,&lt;br&gt;
  0x00,0x00&lt;br&gt;
}; &lt;/p&gt;

&lt;p&gt;const unsigned char PROGMEM ICON_BITMAP_65[] = &lt;br&gt;
{    //bar signal&lt;br&gt;
  0x00,0x00,&lt;br&gt;
  0x00,0x00,&lt;br&gt;
  0x3f,0xe0,&lt;br&gt;
  0x10,0x40,&lt;br&gt;
  0x08,0x80,&lt;br&gt;
  0x05,0x00,&lt;br&gt;
  0x02,0x00,&lt;br&gt;
  0x02,0x00,&lt;br&gt;
  0x02,0x00,&lt;br&gt;
  0x00,0x0c,&lt;br&gt;
  0x00,0x6c,&lt;br&gt;
  0x03,0x6c,&lt;br&gt;
  0x1b,0x6c,&lt;br&gt;
  0x1b,0x6c,&lt;br&gt;
  0x00,0x00,&lt;br&gt;
  0x00,0x00&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;int i,c=0,t=0;&lt;/p&gt;

&lt;p&gt;boolean clockUp = true;&lt;br&gt;
boolean menuShow = false;&lt;br&gt;
boolean selectButtonbool = false;&lt;br&gt;
boolean newMessage = false;&lt;br&gt;
boolean newCall = false;&lt;br&gt;
boolean newCallR = false;&lt;br&gt;
boolean newNote = false;&lt;br&gt;
boolean newBuzz = false;&lt;/p&gt;

&lt;p&gt;byte hours = 0;&lt;br&gt;
byte minutes = 0;&lt;br&gt;
byte seconds = 0;&lt;br&gt;
byte day = 0;&lt;br&gt;
byte date = 0;&lt;br&gt;
byte month = 0;&lt;br&gt;
int year = 0;&lt;/p&gt;

&lt;p&gt;int k,j,n1,n2,n3,n4,n5,n6,n7,n8,N1,N2,N3,N4,N5,N6,N7,N8 = 0;&lt;br&gt;
float x1,x2,ans = 0.0;&lt;/p&gt;

&lt;p&gt;char DateBuffer[30];&lt;br&gt;
char* TimeStorage [6];&lt;br&gt;
char* vout;&lt;/p&gt;

&lt;p&gt;String monthw;&lt;br&gt;
String number;&lt;br&gt;
String numberR;&lt;br&gt;
String NoteS;&lt;br&gt;
String message;     //Variable for SMS messages&lt;br&gt;
String blReceived;    //Storage for strings received from bluetooth&lt;/p&gt;

&lt;p&gt;char msg[150];    //Char array for SMS&lt;br&gt;
char numb[15];&lt;br&gt;
char numbR[15];&lt;br&gt;
char note[300];&lt;br&gt;
String op[4]={"+","-","*","/"};&lt;/p&gt;

&lt;p&gt;byte menuSelection = 0;   //Menu&lt;br&gt;
byte menuSelections = 0;  //Settings&lt;br&gt;
byte menuSelectiona = 0;  //Apps&lt;br&gt;
byte len;         //Length of message&lt;br&gt;
byte len1;&lt;br&gt;
byte len2;&lt;br&gt;
byte l;&lt;/p&gt;

&lt;p&gt;static unsigned long lastTick = 0;&lt;/p&gt;

&lt;p&gt;//U8GLIB_SSD1306_ADAFRUIT_128X64 u8g(U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);&lt;br&gt;
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST); // I2C / TWI&lt;br&gt;
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);&lt;br&gt;
//U8GLIB_SH1106_128X64_2X u8g(13, 11, 10, 9,8); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8&lt;/p&gt;

&lt;p&gt;void setup(void) {&lt;br&gt;
  // flip screen, if required&lt;br&gt;
  //u8g.setRot180();&lt;/p&gt;

&lt;p&gt;pinMode(nextButton,INPUT);  //Set digital pins as inputs&lt;br&gt;
pinMode(previousButton,INPUT);&lt;br&gt;
pinMode(menuButton,INPUT);&lt;br&gt;
pinMode(mot,OUTPUT);&lt;br&gt;
pinMode(buzz,OUTPUT);&lt;/p&gt;

&lt;p&gt;Serial.begin(9600);&lt;br&gt;
bluetooth.begin(9600);&lt;/p&gt;

&lt;p&gt;digitalWrite(nextButton,HIGH);  //Enable internal pull up on all buttons&lt;br&gt;
digitalWrite(previousButton,HIGH);&lt;br&gt;
digitalWrite(menuButton,HIGH);&lt;br&gt;
digitalWrite(mot,HIGH);&lt;br&gt;
delay(500);&lt;br&gt;
digitalWrite(mot,LOW);&lt;br&gt;
drawStartUp();&lt;br&gt;&lt;br&gt;
delay(4000);&lt;/p&gt;

&lt;p&gt;}//end of setup&lt;/p&gt;

&lt;p&gt;void loop() {&lt;br&gt;
  int k,j,n1,n2,n3,n4,n5,n6,n7,n8,N1,N2,N3,N4,N5,N6,N7,N8 = 0;&lt;br&gt;
  float x1,x2,ans = 0.0;&lt;br&gt;
  t++;&lt;br&gt;
  if(t&amp;gt;160)&lt;br&gt;
  {&lt;br&gt;
    sleep();&lt;br&gt;
  }&lt;br&gt;
  if(digitalRead(menuButton)==LOW)&lt;br&gt;
    t=0; &lt;br&gt;
if(bluetooth.available() &amp;gt; 0 /&lt;em&gt;&amp;amp;&amp;amp; bluetooth.find("(")&lt;/em&gt;/)&lt;br&gt;
{&lt;br&gt;
  blReceived = bluetooth.readString();&lt;br&gt;
  if(blReceived.startsWith("1"))    //1 is the preamble date&lt;br&gt;
  {&lt;br&gt;
    digitalWrite(mot,HIGH);&lt;br&gt;
    delay(1000);&lt;br&gt;
    digitalWrite(mot,LOW);&lt;br&gt;
    seconds++;&lt;br&gt;
    blReceived.toCharArray(DateBuffer,blReceived.length()+1);&lt;br&gt;
    vout = strtok(DateBuffer,",");&lt;br&gt;
    for(int i=0;i&amp;lt;=6;i++)&lt;br&gt;
    {&lt;br&gt;
      //if(TimeStorage[i] = NULL)&lt;br&gt;
      //{Serial.println("Exited Loop");&lt;br&gt;
      //  break;}&lt;br&gt;
      TimeStorage[i] = strtok(NULL,",");&lt;br&gt;
      delay(10);&lt;br&gt;
    }&lt;br&gt;
    //int example = bluetooth.parseInt();&lt;br&gt;
    day = atoi(TimeStorage[0] - 1);&lt;br&gt;
    date = atoi(TimeStorage[1]);&lt;br&gt;
    month = atoi(TimeStorage[2]);&lt;br&gt;
    year = atoi(TimeStorage[3]);&lt;br&gt;
    hours = atoi(TimeStorage[4]);&lt;br&gt;
    minutes = atoi(TimeStorage[5]);&lt;br&gt;
    seconds = atoi(TimeStorage[6]);&lt;br&gt;
    blReceived="";&lt;br&gt;
    t=0;&lt;br&gt;
  }&lt;br&gt;
  else if (blReceived.startsWith("2"))&lt;br&gt;
  {&lt;br&gt;
    digitalWrite(mot,HIGH);&lt;br&gt;
    delay(1000);&lt;br&gt;
    digitalWrite(mot,LOW);&lt;br&gt;
    seconds++;&lt;br&gt;
    newMessage = true;&lt;br&gt;
    message = blReceived;&lt;br&gt;
    //sms();&lt;br&gt;
    //delay(300000);&lt;br&gt;
    blReceived="";&lt;br&gt;
    t=0;&lt;br&gt;
  }&lt;br&gt;
  else if (blReceived.startsWith("3"))&lt;br&gt;
  {&lt;br&gt;
    digitalWrite(mot,HIGH);&lt;br&gt;
    delay(1000);&lt;br&gt;
    digitalWrite(mot,LOW);&lt;br&gt;
    seconds++;&lt;br&gt;
    newCall = true;&lt;br&gt;
    number = blReceived;&lt;br&gt;
    //num();&lt;br&gt;
    //delay(300000);&lt;br&gt;
    blReceived="";&lt;br&gt;
    t=0;&lt;br&gt;
  }&lt;br&gt;
  else if (blReceived.startsWith("4"))&lt;br&gt;
  {&lt;br&gt;
      digitalWrite(mot,HIGH);&lt;br&gt;
      delay(1000);&lt;br&gt;
      digitalWrite(mot,LOW);&lt;br&gt;
      newCallR = true;&lt;br&gt;
      numberR = blReceived;&lt;br&gt;
      t=0;&lt;br&gt;
      u8g.firstPage();&lt;br&gt;
   do&lt;br&gt;
   {&lt;br&gt;
      u8g.setFont(u8g_font_unifont);&lt;br&gt;
      u8g.setPrintPos(0,20);&lt;br&gt;
      u8g.print("Calling...");&lt;br&gt;
      u8g.setPrintPos(0,40);&lt;br&gt;
      u8g.print(numberR);&lt;br&gt;
      len2 = numberR.length();&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  number.toCharArray(numbR, len2+1);
  //Serial.println(len2);
  if(len2&amp;lt;15)
  {
     //Serial.println("If");
     for (int i = 0;(i-1)&amp;lt;len2;i++)
     {
        //Serial.println("Enter for loop");
        u8g.setPrintPos(i*8,30);
        u8g.print(numbR[i-15]);
        delay(10);
        if(numbR[i-16] == '\0')
        { 
           //Serial.println("Break!!");
           break;
           //delay(3000);
        }
     }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  while (u8g.nextPage());&lt;br&gt;
  blReceived="";&lt;br&gt;
  delay(15000);&lt;br&gt;
  seconds=seconds+15;&lt;br&gt;
  newCallR = false;&lt;br&gt;
  }&lt;br&gt;
  else if (blReceived.startsWith("5"))&lt;br&gt;
  {&lt;br&gt;
    digitalWrite(mot,HIGH);&lt;br&gt;
    delay(1000);&lt;br&gt;
    digitalWrite(mot,LOW);&lt;br&gt;
    seconds++;&lt;br&gt;
    newNote = true;&lt;br&gt;
    NoteS = blReceived;&lt;br&gt;
    //notes();&lt;br&gt;
    //delay(300000);&lt;br&gt;
    blReceived="";&lt;br&gt;
    t=0;&lt;br&gt;
  }&lt;br&gt;
  else if (blReceived.startsWith("6"))&lt;br&gt;
  {&lt;br&gt;
    newBuzz = true;&lt;br&gt;
    Buzz();&lt;br&gt;
    blReceived="";&lt;br&gt;
    t=0;&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;/&lt;em&gt;Serial.println(day-1);&lt;br&gt;
  Serial.println(date);&lt;br&gt;
  Serial.println(month);&lt;br&gt;
  Serial.println(year);&lt;br&gt;
  Serial.println(hours);&lt;br&gt;
  Serial.println(minutes);&lt;br&gt;
  Serial.println(seconds);&lt;/em&gt;/&lt;br&gt;
}     //end of if for datetime&lt;/p&gt;

&lt;p&gt;/&lt;em&gt;Serial.println(day-1);&lt;br&gt;
  Serial.println(date);&lt;br&gt;
  Serial.println(month);&lt;br&gt;
  Serial.println(year);&lt;br&gt;
  Serial.println(hours);&lt;br&gt;
  Serial.println(minutes);&lt;br&gt;
  Serial.println(seconds);&lt;/em&gt;/&lt;/p&gt;

&lt;p&gt;/*else if(bluetooth.available() &amp;gt; 0 &amp;amp;&amp;amp; bluetooth.find("CMD")==true)&lt;br&gt;
{&lt;br&gt;
  Serial.println("ENTERED MESSAGE");&lt;br&gt;
  message = bluetooth.readString();&lt;br&gt;
  Serial.println(message);&lt;br&gt;
  //delay(300000);&lt;br&gt;
}&lt;br&gt;
*/&lt;/p&gt;

&lt;p&gt;if(digitalRead(previousButton)==LOW &amp;amp;&amp;amp; digitalRead(nextButton)==LOW)  //button is activated&lt;br&gt;
{&lt;br&gt;
  seconds=seconds+4;&lt;br&gt;&lt;br&gt;
  if(menuShow == false)    //To toggle the menu states&lt;br&gt;
  {&lt;br&gt;
     menuShow = true;&lt;br&gt;
     delay(100);&lt;br&gt;
     menu();  //Get back the menu selection number&lt;br&gt;&lt;br&gt;
     if(menuSelection == 4)&lt;br&gt;
     {&lt;br&gt;
        seconds=seconds+4;&lt;br&gt;
        delay(100);&lt;br&gt;
        menuSelection = 0;&lt;br&gt;
        while(digitalRead(menuButton)== HIGH)&lt;br&gt;
        {&lt;br&gt;
           HA();&lt;br&gt;
           delay(10);&lt;br&gt;
        }&lt;br&gt;
     }&lt;br&gt;
     if(menuSelection == 3)&lt;br&gt;
     {&lt;br&gt;
        seconds=seconds+4; &lt;br&gt;
        settings();&lt;br&gt;
        if(menuSelections == 2)&lt;br&gt;
        {&lt;br&gt;
           seconds=seconds+4;&lt;br&gt;
           delay(100);&lt;br&gt;
           menuSelections=0;&lt;br&gt;
           delay(100);&lt;br&gt;
           while(digitalRead(menuButton)== HIGH)&lt;br&gt;
           {&lt;br&gt;
              notice();&lt;br&gt;
           }&lt;br&gt;
           delay(100);&lt;br&gt;
        }&lt;br&gt;
        if(menuSelections == 3)&lt;br&gt;
        {&lt;br&gt;
           seconds=seconds+4;&lt;br&gt;
           delay(100);&lt;br&gt;
           menuSelections=0;&lt;br&gt;
           while(digitalRead(menuButton)==HIGH)&lt;br&gt;
           {&lt;br&gt;
              torch();&lt;br&gt;
              delay(10);&lt;br&gt;
           }&lt;br&gt;
        }&lt;br&gt;
        if(menuSelections == 4)&lt;br&gt;
        {&lt;br&gt;
           seconds=seconds+4;&lt;br&gt;
           delay(100);&lt;br&gt;
           menuSelections=0;&lt;br&gt;
           while(digitalRead(menuButton)==HIGH)&lt;br&gt;
           {&lt;br&gt;
             bluetooth.write("1");&lt;br&gt;
             delay(1000);&lt;br&gt;
             bluetooth.write("");&lt;br&gt;
           }&lt;br&gt;
        }&lt;br&gt;
        bluetooth.write("");&lt;br&gt;
        bluetooth.write("2");&lt;br&gt;
        bluetooth.write("");&lt;br&gt;
     }&lt;br&gt;
     if(menuSelection == 2)&lt;br&gt;
     {&lt;br&gt;
        seconds=seconds+4;&lt;br&gt;
        apps(); &lt;br&gt;
        if(menuSelectiona == 2)&lt;br&gt;
        {&lt;br&gt;&lt;br&gt;
           seconds=seconds+4;&lt;br&gt;
           delay(100);&lt;br&gt;
           menuSelectiona = 0;&lt;br&gt;
           while(digitalRead(menuButton)==HIGH)&lt;br&gt;
           {&lt;br&gt;
              Calc();&lt;br&gt;
           }&lt;br&gt;
           bluetooth.write("");&lt;br&gt;&lt;br&gt;
        }  &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    if(menuSelectiona == 3)
    {
       seconds=seconds+4;
       delay(100);
       menuSelectiona = 0;
       while(digitalRead(menuButton)== HIGH)
       {sms();}
       delay(100);
    }
    if(menuSelectiona == 4)
    {
       seconds=seconds+4;
       delay(100);
       menuSelectiona = 0;
       while(digitalRead(menuButton)== HIGH)
       {call();}
       delay(100);
    }
 }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  if(menuShow == true)&lt;br&gt;
  {&lt;br&gt;
     menuShow = false;&lt;br&gt;
     delay(100);&lt;br&gt;&lt;br&gt;
  }&lt;br&gt;
}//end of if&lt;br&gt;
advanceTime();&lt;br&gt;
delay(30);&lt;br&gt;
}//end of loop&lt;/p&gt;

&lt;p&gt;void sleep()&lt;br&gt;
{&lt;br&gt;
   u8g.firstPage();&lt;br&gt;
   do{}&lt;br&gt;
   while(u8g.nextPage());&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void advanceTime()&lt;br&gt;
{&lt;br&gt;
   if(millis()-lastTick&amp;gt;950)  //somehow&lt;br&gt;
   {&lt;br&gt;
      lastTick = millis();&lt;br&gt;
      seconds++;&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;if (seconds &amp;gt; 59)&lt;br&gt;
   {&lt;br&gt;
      minutes++;&lt;br&gt;
      seconds = 0;&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;if (minutes &amp;gt;59)&lt;br&gt;
   {&lt;br&gt;
      hours++;&lt;br&gt;
      minutes = 0;&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;if (hours &amp;gt; 23)&lt;br&gt;
   {&lt;br&gt;
      hours = 0;&lt;br&gt;
      minutes = 0;&lt;br&gt;
      date+=1;&lt;br&gt;
   }&lt;br&gt;
   draw();&lt;br&gt;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//**&lt;strong&gt;&lt;em&gt;------------------U8Glib Functions------------------&lt;/em&gt;&lt;/strong&gt;**&lt;br&gt;
void HA()&lt;br&gt;
{&lt;br&gt;
  u8g.firstPage();&lt;br&gt;&lt;br&gt;
  do {&lt;br&gt;
        bluetooth.write("3");&lt;br&gt;
        u8g.setFont(u8g_font_unifont);&lt;br&gt;
        u8g.setPrintPos(0,10);&lt;br&gt;
        u8g.print("Home Automation");&lt;br&gt;
        u8g.setFont(u8g_font_unifont);&lt;br&gt;
        u8g.setPrintPos(30,10);&lt;br&gt;
        u8g.print("In Development");&lt;br&gt;
        bluetooth.write("");&lt;br&gt;
  } while( u8g.nextPage() );&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void Buzz()&lt;br&gt;
{&lt;br&gt;
    while(c&amp;lt;5)&lt;br&gt;
    {&lt;br&gt;
      for(i=1;i&amp;lt;256;i++)&lt;br&gt;
      {&lt;br&gt;
        analogWrite(buzz,i);&lt;br&gt;
        delay(3.92);&lt;br&gt;
      }&lt;br&gt;
      for(i=256;i&amp;gt;0;i--)&lt;br&gt;
      {&lt;br&gt;
        analogWrite(buzz,i);&lt;br&gt;
        delay(3.92);&lt;br&gt;
      }&lt;br&gt;
      c++;&lt;br&gt;
    }&lt;br&gt;
    c=0;&lt;br&gt;
    newBuzz=false;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void drawStartUp()&lt;br&gt;
{&lt;br&gt;
  u8g.firstPage();&lt;br&gt;
  do&lt;br&gt;
  {&lt;br&gt;
    //u8g_prepare();&lt;br&gt;
    u8g.setColorIndex(0);&lt;br&gt;
    u8g.drawBox(0,0,127,63);&lt;br&gt;
    u8g.setColorIndex(1);&lt;br&gt;
    u8g.setFont(u8g_font_7x14r);&lt;br&gt;
    u8g.setPrintPos(5,10);&lt;br&gt;
    u8g.print("Developed By:-");&lt;br&gt;
    u8g.setFont(u8g_font_fur17r);&lt;br&gt;
    u8g.setPrintPos(10,38);&lt;br&gt;
    u8g.print("USER");&lt;br&gt;
    u8g.setFont(u8g_font_7x14r);&lt;br&gt;
    u8g.setPrintPos(5,62);&lt;br&gt;
    u8g.print("V402");&lt;br&gt;
  }&lt;br&gt;
  while(u8g.nextPage());&lt;br&gt;
}  //end of drawStartUp&lt;/p&gt;

&lt;p&gt;void menu()&lt;br&gt;
{&lt;br&gt;&lt;br&gt;
   u8g.setColorIndex(1);&lt;br&gt;
   //u8g.drawCircle(20,20,14);&lt;br&gt;
   menuSelection = 1;&lt;br&gt;
   while(digitalRead(menuButton) == HIGH)&lt;br&gt;
   {&lt;br&gt;
      if(digitalRead(nextButton) == LOW)&lt;br&gt;
      {&lt;br&gt;
         delay(20);&lt;br&gt;
         menuSelection++;&lt;br&gt;
         delay(50);&lt;br&gt;
      }  &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; if(digitalRead(previousButton) == LOW)
 {
    delay(20);
    menuSelection--;
    delay(50);
 }

 if(menuSelection &amp;gt; 4)
 {menuSelection = 1;}

 if(menuSelection &amp;lt; 1)
 {menuSelection = 4;}
 //draw picture here
 drawMenu();

 delay(50); //For debouncing

 //draw menus here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}//end of while loop&lt;br&gt;
}//end of menu&lt;/p&gt;

&lt;p&gt;void drawMenu()&lt;br&gt;
{&lt;br&gt;
   u8g.firstPage();&lt;br&gt;
   do&lt;br&gt;
   {&lt;br&gt;
      u8g.setFont(u8g_font_6x10r);&lt;br&gt;
      u8g.setPrintPos(30,8);&lt;br&gt;
      u8g.print("--- Menu ---");&lt;br&gt;
      //u8g.setPrintPos(0,10);&lt;br&gt;
      //u8g.print(menuSelection);&lt;br&gt;
      u8g.drawFrame(0,(menuSelection*13)-3,128,13); //Box height is 13 pixels&lt;br&gt;
      u8g.drawLine(0,10,128,10);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  //Draw menu options
  u8g.drawStr(3,20,"Return");
  u8g.drawStr(3,20+13,"Apps");
  u8g.drawStr(3,20+13+13,"Settings");
  u8g.drawStr(3,20+13+13+13,"Home Auto(Beta)");
  //u8g.drawStr(3,20+13+13+13,"More");   
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
   while(u8g.nextPage());&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void apps()&lt;br&gt;
{&lt;br&gt;
   u8g.setColorIndex(1);&lt;br&gt;
   //u8g.drawCircle(20,20,14);&lt;br&gt;
   menuSelectiona = 1;&lt;br&gt;
   delay(200);&lt;br&gt;
   while(digitalRead(menuButton) == HIGH)&lt;br&gt;
   {&lt;br&gt;
      if(digitalRead(nextButton) == LOW)&lt;br&gt;
      {&lt;br&gt;
         delay(20);&lt;br&gt;
         menuSelectiona++;&lt;br&gt;
         Serial.println("Up");&lt;br&gt;
         delay(50);&lt;br&gt;
      }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  if(digitalRead(previousButton) == LOW)
  {
     delay(20);
     menuSelectiona--;
     delay(50);
  }

  if(menuSelectiona &amp;gt; 4)
  {menuSelectiona = 1;}

  if(menuSelectiona &amp;lt; 1)
  {menuSelectiona = 4;}
  //draw picture here
drawApps();
delay(50); //For debouncing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}//end of while loop&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void notice()&lt;br&gt;
{&lt;br&gt;
   u8g.firstPage();&lt;br&gt;
   do&lt;br&gt;
   {&lt;br&gt;
      u8g.setFont(u8g_font_6x10r);&lt;br&gt;
      //u8g.print(NoteS);&lt;br&gt;
      l = NoteS.length();&lt;br&gt;
      NoteS.toCharArray(note, l+1);&lt;br&gt;
      //Serial.println(len);&lt;br&gt;
      if(l&amp;gt;0)&lt;br&gt;
      {&lt;br&gt;
        for(i=0;i&amp;lt;20;i++)&lt;br&gt;
        {&lt;br&gt;
           u8g.setPrintPos(i*6,8);&lt;br&gt;
           u8g.print(note[i]);&lt;br&gt;
           delay(10);&lt;br&gt;
        }&lt;br&gt;
      }&lt;br&gt;
      if(l&amp;gt;20)&lt;br&gt;
      {&lt;br&gt;
        for(i=20;i&amp;lt;40;i++)&lt;br&gt;
        {&lt;br&gt;
           u8g.setPrintPos((i-20)*6,17);&lt;br&gt;
           u8g.print(note[i]);&lt;br&gt;
           delay(10);&lt;br&gt;
        }&lt;br&gt;
      }&lt;br&gt;
      if(l&amp;gt;40)&lt;br&gt;
      {&lt;br&gt;
        for(i=40;i&amp;lt;60;i++)&lt;br&gt;
        {&lt;br&gt;
           u8g.setPrintPos((i-40)*6,26);&lt;br&gt;
           u8g.print(note[i]);&lt;br&gt;
           delay(10);&lt;br&gt;
        }&lt;br&gt;
      }&lt;br&gt;
      if(l&amp;gt;60)&lt;br&gt;
      {&lt;br&gt;
        for(i=60;i&amp;lt;80;i++)&lt;br&gt;
        {&lt;br&gt;
           u8g.setPrintPos((i-60)*6,35);&lt;br&gt;
           u8g.print(note[i]);&lt;br&gt;
           delay(10);&lt;br&gt;
        }&lt;br&gt;
      }&lt;br&gt;
      if(l&amp;gt;80)&lt;br&gt;
      {&lt;br&gt;
        for(i=80;i&amp;lt;100;i++)&lt;br&gt;
        {&lt;br&gt;
           u8g.setPrintPos((i-80)*6,43);&lt;br&gt;
           u8g.print(note[i]);&lt;br&gt;
           delay(10);&lt;br&gt;
        }&lt;br&gt;
      }&lt;br&gt;
      if(l&amp;gt;100)&lt;br&gt;
      {&lt;br&gt;
        for(i=100;i&amp;lt;120;i++)&lt;br&gt;
        {&lt;br&gt;
           u8g.setPrintPos((i-100)*6,51);&lt;br&gt;
           u8g.print(note[i]);&lt;br&gt;
           delay(10);&lt;br&gt;
        }&lt;br&gt;
      }&lt;br&gt;
      if(l&amp;gt;120)&lt;br&gt;
      {&lt;br&gt;
        for(i=120;i&amp;lt;140;i++)&lt;br&gt;
        {&lt;br&gt;
           u8g.setPrintPos((i-120)*6,59);&lt;br&gt;
           u8g.print(note[i]);&lt;br&gt;
           delay(10);&lt;br&gt;
        }&lt;br&gt;
      }&lt;br&gt;
  }&lt;br&gt;
  while (u8g.nextPage());&lt;br&gt;
  delay(30);&lt;br&gt;
  newNote = false;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void torch()&lt;br&gt;
{&lt;br&gt;
   u8g.firstPage();&lt;br&gt;
   do{u8g.drawBox(0,0,127,63);}&lt;br&gt;
   while(u8g.nextPage());&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void drawApps()&lt;br&gt;
{&lt;br&gt;
   u8g.firstPage();&lt;br&gt;
   do&lt;br&gt;
   {&lt;br&gt;
      u8g.setFont(u8g_font_6x10r);&lt;br&gt;
      u8g.setPrintPos(5,8);&lt;br&gt;
      u8g.print("--- Applications ---");&lt;br&gt;
      //u8g.setPrintPos(0,10);&lt;br&gt;
      //u8g.print(menuSelection);&lt;br&gt;
      u8g.drawFrame(0,(menuSelectiona*13)-3,128,13);  //Box height is 13 pixels&lt;br&gt;
      u8g.drawLine(0,10,128,10);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  //Draw menu options
  u8g.drawStr(3,20,"Return");
  u8g.drawStr(3,20+13,"CALC");
  u8g.drawStr(3,20+13+13,"SMS");
  u8g.drawStr(3,20+13+13+13,"CALLS");
  //u8g.drawStr(3,20+13+13+13,"More");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;&lt;br&gt;
   while(u8g.nextPage());&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void settings()&lt;br&gt;
{&lt;br&gt;
   u8g.setColorIndex(1);&lt;br&gt;
   //u8g.drawCircle(20,20,14);&lt;br&gt;
   menuSelections = 1;&lt;br&gt;
   delay(200);&lt;br&gt;
   while(digitalRead(menuButton) == HIGH)&lt;br&gt;
   {&lt;br&gt;&lt;br&gt;
      if(digitalRead(nextButton) == LOW)&lt;br&gt;
      {&lt;br&gt;
         delay(20);&lt;br&gt;
         menuSelections++;&lt;br&gt;
         Serial.println("Up");&lt;br&gt;
         delay(50);&lt;br&gt;
      }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  if(digitalRead(previousButton) == LOW)
  {
     delay(20);
     menuSelections--;
     delay(50);
  }

  if(menuSelections &amp;gt; 4)
  {menuSelections = 1;}

  if(menuSelections &amp;lt; 1)
  {menuSelections = 4;}
  //draw picture here
  drawSettings();

  delay(50); //For debouncing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}//end of while loop&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void sms()&lt;br&gt;
{&lt;br&gt;
   u8g.firstPage();&lt;br&gt;
   do&lt;br&gt;
   {&lt;br&gt;
      u8g.setFont(u8g_font_unifont);&lt;br&gt;
      u8g.setPrintPos(0,10);&lt;br&gt;
      u8g.print(message);&lt;br&gt;
      len = message.length();&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  message.toCharArray(msg, len+1);
  //Serial.println(len);
  if(len&amp;gt;16)
  {
     //Serial.println("If");
     for (int i = 0;(i-1)&amp;lt;len;i++)
     {
        //Serial.println("Enter for loop");
        u8g.setPrintPos(i*8,30);
        u8g.print(msg[i+16]);
        delay(10);
        if(msg[i+17] == '\0')
        { 
           //Serial.println("Break!!");
           break;
           //delay(3000);
        }
     }
  }

  if(len&amp;gt;32)
  {
     //Serial.println("If");
     for (int i = 0;(i-1)&amp;lt;len;i++)
     {
        //Serial.println("Enter for loop");
        u8g.setPrintPos(i*8,50);
        u8g.print(msg[i+32]);
        delay(10);
        if(msg[i+33] == '\0')
        { 
           //Serial.println("Break!!");
           break;
           //delay(3000);
        }
     }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  while (u8g.nextPage());&lt;br&gt;
  delay(30);&lt;br&gt;
  newMessage = false;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void call()&lt;br&gt;
{&lt;br&gt;
   u8g.firstPage();&lt;br&gt;
   do&lt;br&gt;
   {&lt;br&gt;
      u8g.setFont(u8g_font_unifont);&lt;br&gt;
      u8g.setPrintPos(0,10);&lt;br&gt;
      u8g.print(number);&lt;br&gt;
      len1 = number.length();&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  number.toCharArray(numb, len1+1);
  //Serial.println(len1);
  if(len1&amp;lt;15)
  {
     //Serial.println("If");
     for (int i = 0;(i-1)&amp;lt;len1;i++)
     {
        //Serial.println("Enter for loop");
        u8g.setPrintPos(i*8,30);
        u8g.print(numb[i-15]);
        delay(10);
        if(numb[i-16] == '\0')
        { 
           //Serial.println("Break!!");
           break;
           //delay(3000);
        }
     }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  while (u8g.nextPage());&lt;br&gt;
  delay(30);&lt;br&gt;
  newCall = false;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void drawSettings()&lt;br&gt;
{&lt;br&gt;
   u8g.firstPage();&lt;br&gt;
   do&lt;br&gt;
   {&lt;br&gt;
      u8g.setFont(u8g_font_6x10r);&lt;br&gt;
      u8g.setPrintPos(15,8);&lt;br&gt;
      u8g.print("--- Settings ---");&lt;br&gt;
      //u8g.setPrintPos(0,10);&lt;br&gt;
      //u8g.print(menuSelection);&lt;br&gt;
      u8g.drawFrame(0,(menuSelections*13)-3,128,13);  //Box height is 13 pixels&lt;br&gt;
      u8g.drawLine(0,10,128,10);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  //Draw menu options
  u8g.drawStr(3,20,"Return");
  u8g.drawStr(3,20+13,"Notes");
  u8g.drawStr(3,20+13+13,"Torch");
  u8g.drawStr(3,20+13+13+13,"Find My Phone");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  while(u8g.nextPage());&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void CalcPrintdata()&lt;br&gt;
{&lt;br&gt;
  u8g.setPrintPos(50,25);&lt;br&gt;
  u8g.print(n3);&lt;br&gt;
  u8g.setPrintPos(40,25);&lt;br&gt;
  u8g.print(n4);&lt;br&gt;
  u8g.setPrintPos(30,25);&lt;br&gt;
  u8g.print(n5);&lt;br&gt;
  u8g.setPrintPos(20,25);&lt;br&gt;
  u8g.print(n6);&lt;br&gt;
  u8g.setPrintPos(60,25);&lt;br&gt;
  u8g.print(".");&lt;br&gt;
  u8g.setPrintPos(70,25);&lt;br&gt;
  u8g.print(n7);&lt;br&gt;
  u8g.setPrintPos(80,25);&lt;br&gt;
  u8g.print(n8);&lt;br&gt;
  u8g.setPrintPos(3,37);&lt;br&gt;
  u8g.print(op[k]);&lt;br&gt;
  u8g.setPrintPos(50,37);&lt;br&gt;
  u8g.print(N3);&lt;br&gt;
  u8g.setPrintPos(40,37);&lt;br&gt;
  u8g.print(N4);&lt;br&gt;
  u8g.setPrintPos(30,37);&lt;br&gt;
  u8g.print(N5);&lt;br&gt;
  u8g.setPrintPos(20,37);&lt;br&gt;
  u8g.print(N6);&lt;br&gt;
  u8g.setPrintPos(60,37);&lt;br&gt;
  u8g.print(".");&lt;br&gt;
  u8g.setPrintPos(70,37);&lt;br&gt;
  u8g.print(N7);&lt;br&gt;
  u8g.setPrintPos(80,37);&lt;br&gt;
  u8g.print(N8);&lt;br&gt;
  u8g.setPrintPos(5,46);&lt;br&gt;
  u8g.print("---------------");&lt;br&gt;&lt;br&gt;
  u8g.setPrintPos(5,54);&lt;br&gt;
  u8g.print(ans);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void Calc()&lt;br&gt;
{&lt;br&gt;
   u8g.firstPage();&lt;br&gt;
   do{&lt;br&gt;
        u8g.setFont(u8g_font_unifont);&lt;br&gt;
        u8g.setPrintPos(0,10);&lt;br&gt;
        u8g.print("Calculator:-");&lt;br&gt;
        if(digitalRead(previousButton) == LOW)&lt;br&gt;
        {&lt;br&gt;
          j++;&lt;br&gt;
          delay(300);&lt;br&gt;
          if(j&amp;gt;12)&lt;br&gt;
            j = 0;&lt;br&gt;
        }&lt;br&gt;
        if(digitalRead(nextButton)==LOW &amp;amp;&amp;amp; digitalRead(previousButton)==LOW)&lt;br&gt;
        {&lt;br&gt;
          j=13;&lt;br&gt;
          delay(300);&lt;br&gt;
        }&lt;br&gt;
        if(j==0)&lt;br&gt;
        {&lt;br&gt;
          CalcPrintdata();&lt;br&gt;
          if(digitalRead(nextButton) == LOW)&lt;br&gt;
          {&lt;br&gt;
            n6++;&lt;br&gt;
            delay(300);&lt;br&gt;
          }&lt;br&gt;
          if(n6&amp;gt;9)&lt;br&gt;
            n6=0;&lt;br&gt;
        }&lt;br&gt;
        if(j==1)&lt;br&gt;
        {&lt;br&gt;
          CalcPrintdata();&lt;br&gt;
          if(digitalRead(nextButton) == LOW)&lt;br&gt;
          {&lt;br&gt;
            n5++;&lt;br&gt;
            delay(300);&lt;br&gt;
          }&lt;br&gt;
          if(n5&amp;gt;9)&lt;br&gt;
            n5=0;&lt;br&gt;
        }&lt;br&gt;
        if(j==2)&lt;br&gt;
        {&lt;br&gt;
          CalcPrintdata();&lt;br&gt;
          if(digitalRead(nextButton) == LOW)&lt;br&gt;
          {&lt;br&gt;
            n4++;&lt;br&gt;
            delay(300);&lt;br&gt;
          }&lt;br&gt;
          if(n4&amp;gt;9)&lt;br&gt;
            n4=0;&lt;br&gt;
        }&lt;br&gt;
        if(j==3)&lt;br&gt;
        {&lt;br&gt;
          CalcPrintdata();&lt;br&gt;
          if(digitalRead(nextButton) == LOW)&lt;br&gt;
          {&lt;br&gt;
            n3++;&lt;br&gt;
            delay(300);&lt;br&gt;
          }&lt;br&gt;
          if(n3&amp;gt;9)&lt;br&gt;
            n3=0;&lt;br&gt;
        }&lt;br&gt;
        if(j==4)&lt;br&gt;
        {&lt;br&gt;
          CalcPrintdata();&lt;br&gt;
          if(digitalRead(nextButton) == LOW)&lt;br&gt;
          {&lt;br&gt;
            n7++;&lt;br&gt;
            delay(300);&lt;br&gt;
          }&lt;br&gt;
          if(n7&amp;gt;9)&lt;br&gt;
            n7=0;&lt;br&gt;
        }&lt;br&gt;
        if(j==5)&lt;br&gt;
        {&lt;br&gt;
          CalcPrintdata();&lt;br&gt;
          if(digitalRead(nextButton) == LOW)&lt;br&gt;
          {&lt;br&gt;
            n8++;&lt;br&gt;
            delay(300);&lt;br&gt;
          }&lt;br&gt;
          if(n8&amp;gt;9)&lt;br&gt;
            n8=0;&lt;br&gt;
        }&lt;br&gt;
        if(j==6)&lt;br&gt;
        {&lt;br&gt;
          CalcPrintdata();&lt;br&gt;
          if(digitalRead(nextButton) == LOW)&lt;br&gt;
          {&lt;br&gt;
            k++;&lt;br&gt;
            delay(300);&lt;br&gt;
          }&lt;br&gt;
          if(k&amp;gt;3)&lt;br&gt;
            k=0;&lt;br&gt;
        }&lt;br&gt;
        if(j==7)&lt;br&gt;
        {&lt;br&gt;
          CalcPrintdata();&lt;br&gt;
          if(digitalRead(nextButton) == LOW)&lt;br&gt;
          {&lt;br&gt;
            N6++;&lt;br&gt;
            delay(300);&lt;br&gt;
...&lt;/p&gt;

</description>
    </item>
    <item>
      <title>notebook heater</title>
      <dc:creator>jay jordan</dc:creator>
      <pubDate>Mon, 25 Dec 2023 15:55:30 +0000</pubDate>
      <link>https://dev.to/jayjo87/notebook-heater-2ehn</link>
      <guid>https://dev.to/jayjo87/notebook-heater-2ehn</guid>
      <description>&lt;h1&gt;
  
  
  include "U8glib.h"
&lt;/h1&gt;

&lt;p&gt;int analogInput = 0;&lt;br&gt;
int Percent ;  //We want it as a whole number&lt;br&gt;
float Voltageout = 0.0;&lt;br&gt;
float Voltage = 0.0; //We want it with decimal places&lt;br&gt;
float R1 = 97000.0; //resistance &lt;br&gt;
float R2 = 10000.0;  //resistance &lt;br&gt;
int value = 0;&lt;/p&gt;

&lt;p&gt;U8GLIB_SH1106_128X64 u8g(10, 9, 12, 11, 13); // pinout, see page&lt;/p&gt;

&lt;p&gt;void draw(void) &lt;br&gt;
{&lt;br&gt;
  u8g.setFont(u8g_font_helvB14r); // font&lt;br&gt;
  u8g.drawStr(19, 16, "BATTERY"); &lt;br&gt;
  u8g.setPrintPos(7,55);&lt;br&gt;
  u8g.setFont(u8g_font_helvB18r);&lt;br&gt;
  u8g.println(Percent);           //Prints Percent&lt;br&gt;
  u8g.println("%");&lt;br&gt;
  u8g.setPrintPos(63,55);&lt;br&gt;
  u8g.setFont(u8g_font_helvB18r); //A slightly larger font&lt;br&gt;
   u8g.println(Voltage);             //Prints the voltage&lt;br&gt;
  u8g.println("V");&lt;br&gt;
  u8g.drawRFrame(0, 23, 128, 1, 0); &lt;br&gt;
}&lt;br&gt;
void setup(){&lt;br&gt;
   pinMode(analogInput, INPUT);&lt;br&gt;
}&lt;br&gt;
void loop(){&lt;br&gt;
   value = analogRead(analogInput);&lt;br&gt;
   Voltageout = (value * 5.0) / 1024.0; &lt;br&gt;
   Voltage = Voltageout / (R2/(R1+R2)); &lt;br&gt;
   if (Voltage&amp;lt;1) {&lt;br&gt;
   Voltage=0.0;  // get  rid of unwanted readings&lt;br&gt;
   }&lt;br&gt;
   if (Voltage&amp;gt;5.00) {  // if Reading are too large&lt;br&gt;
    Voltage= Voltage/10;&lt;br&gt;
   Percent = ((Voltage-3)/(4.2-3))&lt;em&gt;100; //votage divided by max cell votage times 100 = the cells current percentage&lt;br&gt;
} &lt;br&gt;
  u8g.firstPage();&lt;br&gt;&lt;br&gt;
  do &lt;br&gt;
    {&lt;br&gt;
     draw();&lt;br&gt;&lt;br&gt;
    }&lt;br&gt;
  while( u8g.nextPage() );&lt;br&gt;
delay(500);&lt;br&gt;
/&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Создано ArduinoGetStarted.com 
*&lt;/li&gt;
&lt;li&gt;Этот пример кода находится в общественном достоянии на странице учебного пособия
*
: &lt;a href="https://arduinogetstarted.com/tutorials/arduino-heating-system"&gt;https://arduinogetstarted.com/tutorials/arduino-heating-system&lt;/a&gt; 
*/&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  включить 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  включить &amp;lt;дальнюю температуру.h&amp;gt;
&lt;/h1&gt;

&lt;h1&gt;
  
  
  определить вывод ДАТЧИКА 2 // Вывод Arduino, подключенный к контакту DQ датчика DS18B20
&lt;/h1&gt;

&lt;h1&gt;
  
  
  определить вывод RELAY_PIN A5 // Вывод Arduino, подключенный к реле, которое подключено к нагревательному элементу
&lt;/h1&gt;

&lt;p&gt;TEMP_THRESHOLD_UPPER = 20; // верхний порог температуры, который, в свою очередь, связан с нагревательным элементом,  измените желаемое значение на&lt;br&gt;
int const TEMP_THRESHOLD_LOWER = 15; // нижний порог температуры, измените желаемое значение на&lt;/p&gt;

&lt;p&gt;OneWire(SENSOR_PIN); // настройте экземпляр OneWire сдатчиками &lt;br&gt;
(&amp;amp;OneWire); // передайте OneWire в библиотеку DallasTemperature&lt;/p&gt;

&lt;p&gt;// температура в Градусах Цельсия&lt;/p&gt;

&lt;p&gt;void .&lt;br&gt;
  Serial.begin(9600); // инициализировать последовательные&lt;br&gt;
 датчики.begin(); // инициализировать&lt;br&gt;
  pinMode датчика(RELAY_PIN, ВЫХОД); // инициализировать цифровой вывод в качестве выходного&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;loop void() {&lt;br&gt;
 sensors.requestTemperatures(); // отправить команду для получения температуры&lt;br&gt;
 temperature = sensors.getTempCByIndex(0); / / считывание температуры в градусах Цельсия&lt;/p&gt;

&lt;p&gt;если(температура &amp;gt; TEMP_THRESHOLD_UPPER) {&lt;br&gt;
    Серийный номер.println(,,,)"Нагревательный элемент выключен");&lt;br&gt;
    digitalWrite(RELAY_PIN, НИЗКИЙ уровень); // выключить&lt;br&gt;
 } else if(температура &amp;lt; TEMP_THRESHOLD_LOWER){&lt;br&gt;
    Serial.println("Нагревательный элемент включен");&lt;br&gt;
    digitalWrite(RELAY_PIN, ВЫСОКИЙ уровень); // включить&lt;br&gt;
 }&lt;/p&gt;

&lt;p&gt;задержка(500) ;&lt;br&gt;
}&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>aws</category>
      <category>html</category>
      <category>github</category>
    </item>
    <item>
      <title>portable television with hologram function</title>
      <dc:creator>jay jordan</dc:creator>
      <pubDate>Mon, 25 Dec 2023 15:54:02 +0000</pubDate>
      <link>https://dev.to/jayjo87/portable-television-with-hologram-function-17lb</link>
      <guid>https://dev.to/jayjo87/portable-television-with-hologram-function-17lb</guid>
      <description>&lt;p&gt;/***&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Required libraries:&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/moononournation/Arduino_GFX.git"&gt;https://github.com/moononournation/Arduino_GFX.git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pschatzmann/arduino-libhelix.git"&gt;https://github.com/pschatzmann/arduino-libhelix.git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/bitbank2/JPEGDEC.git"&gt;https://github.com/bitbank2/JPEGDEC.git&lt;/a&gt;
*/&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;//  Audio and video code&lt;/p&gt;

&lt;p&gt;//  ffmpeg -i  office1.mp4 -ar 44100 -ac 1 -ab 24k -filter:a loudnorm -filter:a "volume=-5dB" office1.aac&lt;br&gt;
// ffmpeg -i office1.mp4 -vf "fps=25,scale=-1:240:flags=lanczos,crop=288:in_h:(in_w-288)/2:0" -q:v 11 office1.mjpeg&lt;br&gt;
// auto fall back to MP3 if AAC file not available&lt;/p&gt;

&lt;h1&gt;
  
  
  define AAC_FILENAME "/.aac"
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define MP3_FILENAME "/.mp3"
&lt;/h1&gt;

&lt;p&gt;// #define MP3_FILENAME "/EP05.mp3"&lt;/p&gt;

&lt;h1&gt;
  
  
  define MJPEG_FILENAME "/.mjpeg"
&lt;/h1&gt;

&lt;p&gt;// #define MJPEG_FILENAME "/EP05.mjpeg"&lt;br&gt;
// #define MJPEG_FILENAME "/320_30fps.mjpeg"&lt;/p&gt;

&lt;h1&gt;
  
  
  define FPS 25
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define MJPEG_BUFFER_SIZE (288 * 240 * 2 / 8)
&lt;/h1&gt;

&lt;p&gt;// #define MJPEG_BUFFER_SIZE (320 * 240 * 2 / 8)&lt;/p&gt;

&lt;h1&gt;
  
  
  define AUDIOASSIGNCORE 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define DECODEASSIGNCORE 0
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define DRAWASSIGNCORE 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;p&gt;/* Arduino_GFX */&lt;/p&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define GFX_BL DF_GFX_BL // default backlight pin, you may replace DF_GFX_BL to actual backlight pin
&lt;/h1&gt;

&lt;p&gt;Arduino_DataBus &lt;em&gt;bus = create_default_Arduino_DataBus();&lt;br&gt;
// Arduino_GFX *gfx = new Arduino_ILI9341(bus, DF_GFX_RST, 3 /&lt;/em&gt; rotation &lt;em&gt;/, false /&lt;/em&gt; IPS &lt;em&gt;/);&lt;br&gt;
Arduino_GFX *gfx = new Arduino_ST7789(bus, DF_GFX_RST, 1 /&lt;/em&gt; rotation &lt;em&gt;/, true /&lt;/em&gt; IPS &lt;em&gt;/, 240 /&lt;/em&gt; width &lt;em&gt;/, 288 /&lt;/em&gt; height &lt;em&gt;/, 0 /&lt;/em&gt; col offset 1 &lt;em&gt;/, 20 /&lt;/em&gt; row offset 1 &lt;em&gt;/, 0 /&lt;/em&gt; col offset 2 &lt;em&gt;/, 12 /&lt;/em&gt; row offset 2 */);&lt;/p&gt;

&lt;p&gt;/* variables */&lt;br&gt;
static int next_frame = 0;&lt;br&gt;
static int skipped_frames = 0;&lt;br&gt;
static unsigned long start_ms, curr_ms, next_frame_ms;&lt;/p&gt;

&lt;p&gt;/* audio */&lt;/p&gt;

&lt;h1&gt;
  
  
  include "esp32_audio_task.h"
&lt;/h1&gt;

&lt;p&gt;/* MJPEG Video */&lt;/p&gt;

&lt;h1&gt;
  
  
  include "mjpeg_decode_draw_task.h"
&lt;/h1&gt;

&lt;p&gt;// pixel drawing callback&lt;br&gt;
static int drawMCU(JPEGDRAW &lt;em&gt;pDraw)&lt;br&gt;
{&lt;br&gt;
  // Serial.printf("Draw pos = (%d, %d), size = %d x %d\n", pDraw-&amp;gt;x, pDraw-&amp;gt;y, pDraw-&amp;gt;iWidth, pDraw-&amp;gt;iHeight);&lt;br&gt;
  unsigned long s = millis();&lt;br&gt;
  gfx-&amp;gt;draw16bitRGBBitmap(pDraw-&amp;gt;x, pDraw-&amp;gt;y, pDraw-&amp;gt;pPixels, pDraw-&amp;gt;iWidth, pDraw-&amp;gt;iHeight);&lt;br&gt;
  total_show_video_ms += millis() - s;&lt;br&gt;
  return 1;&lt;br&gt;
} /&lt;/em&gt; drawMCU() */&lt;/p&gt;

&lt;p&gt;void setup()&lt;br&gt;
{&lt;br&gt;
  disableCore0WDT();&lt;/p&gt;

&lt;p&gt;WiFi.mode(WIFI_OFF);&lt;br&gt;
  Serial.begin(115200);&lt;br&gt;
  // while (!Serial);&lt;/p&gt;

&lt;p&gt;// Init Display&lt;br&gt;
  gfx-&amp;gt;begin(80000000);&lt;br&gt;
  gfx-&amp;gt;fillScreen(BLACK);&lt;/p&gt;

&lt;h1&gt;
  
  
  ifdef GFX_BL
&lt;/h1&gt;

&lt;p&gt;pinMode(GFX_BL, OUTPUT);&lt;br&gt;
  digitalWrite(GFX_BL, HIGH);&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;Serial.println("Init I2S");&lt;br&gt;
  gfx-&amp;gt;println("Init I2S");&lt;/p&gt;

&lt;h1&gt;
  
  
  if defined(ESP32) &amp;amp;&amp;amp; (CONFIG_IDF_TARGET_ESP32)
&lt;/h1&gt;

&lt;p&gt;esp_err_t ret_val = i2s_init(I2S_NUM_0, 44100, -1 /* MCLK &lt;em&gt;/, 25 /&lt;/em&gt; SCLK &lt;em&gt;/, 26 /&lt;/em&gt; LRCK &lt;em&gt;/, 32 /&lt;/em&gt; DOUT &lt;em&gt;/, -1 /&lt;/em&gt; DIN */);&lt;/p&gt;

&lt;h1&gt;
  
  
  elif defined(ESP32) &amp;amp;&amp;amp; (CONFIG_IDF_TARGET_ESP32S2)
&lt;/h1&gt;

&lt;p&gt;esp_err_t ret_val = i2s_init(I2S_NUM_0, 44100, -1 /* MCLK &lt;em&gt;/, 4 /&lt;/em&gt; SCLK &lt;em&gt;/, 5 /&lt;/em&gt; LRCK &lt;em&gt;/, 18 /&lt;/em&gt; DOUT &lt;em&gt;/, -1 /&lt;/em&gt; DIN */);&lt;/p&gt;

&lt;h1&gt;
  
  
  elif defined(ESP32) &amp;amp;&amp;amp; (CONFIG_IDF_TARGET_ESP32S3)
&lt;/h1&gt;

&lt;p&gt;esp_err_t ret_val = i2s_init(I2S_NUM_0, 44100, 42 /* MCLK &lt;em&gt;/, 46 /&lt;/em&gt; SCLK &lt;em&gt;/, 45 /&lt;/em&gt; LRCK &lt;em&gt;/, 43 /&lt;/em&gt; DOUT &lt;em&gt;/, 44 /&lt;/em&gt; DIN */);&lt;/p&gt;

&lt;h1&gt;
  
  
  elif defined(ESP32) &amp;amp;&amp;amp; (CONFIG_IDF_TARGET_ESP32C3)
&lt;/h1&gt;

&lt;p&gt;esp_err_t ret_val = i2s_init(I2S_NUM_0, 44100, -1 /* MCLK &lt;em&gt;/, 10 /&lt;/em&gt; SCLK &lt;em&gt;/, 19 /&lt;/em&gt; LRCK &lt;em&gt;/, 18 /&lt;/em&gt; DOUT &lt;em&gt;/, -1 /&lt;/em&gt; DIN */);&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;if (ret_val != ESP_OK)&lt;br&gt;
  {&lt;br&gt;
    Serial.printf("i2s_init failed: %d\n", ret_val);&lt;br&gt;
  }&lt;br&gt;
  i2s_zero_dma_buffer(I2S_NUM_0);&lt;/p&gt;

&lt;p&gt;Serial.println("Init FS");&lt;br&gt;
  gfx-&amp;gt;println("Init FS");&lt;br&gt;
  // if (!LittleFS.begin(false, "/root"))&lt;br&gt;
  // if (!SPIFFS.begin(false, "/root"))&lt;br&gt;
  // if (!FFat.begin(false, "/root"))&lt;br&gt;
  SPIClass spi = SPIClass(HSPI);&lt;br&gt;
  // spi.begin(14 /* SCK &lt;em&gt;/, 2 /&lt;/em&gt; MISO &lt;em&gt;/, 15 /&lt;/em&gt; MOSI &lt;em&gt;/, 13 /&lt;/em&gt; CS &lt;em&gt;/);&lt;br&gt;
  spi.begin(14 /&lt;/em&gt; SCK &lt;em&gt;/, 4 /&lt;/em&gt; MISO &lt;em&gt;/, 15 /&lt;/em&gt; MOSI &lt;em&gt;/, 13 /&lt;/em&gt; CS &lt;em&gt;/);&lt;br&gt;
  if (!SD.begin(13, spi, 80000000))&lt;br&gt;
  // if ((!SD_MMC.begin("/root")) &amp;amp;&amp;amp; (!SD_MMC.begin("/root")) &amp;amp;&amp;amp; (!SD_MMC.begin("/root")) &amp;amp;&amp;amp; (!SD_MMC.begin("/root"))) /&lt;/em&gt; 4-bit SD bus mode &lt;em&gt;/&lt;br&gt;
  // if ((!SD_MMC.begin("/root", true)) &amp;amp;&amp;amp; (!SD_MMC.begin("/root", true)) &amp;amp;&amp;amp; (!SD_MMC.begin("/root", true)) &amp;amp;&amp;amp; (!SD_MMC.begin("/root", true))) /&lt;/em&gt; 1-bit SD bus mode */&lt;br&gt;
  {&lt;br&gt;
    Serial.println("ERROR: File system mount failed!");&lt;br&gt;
    gfx-&amp;gt;println("ERROR: File system mount failed!");&lt;br&gt;
  }&lt;br&gt;
  else&lt;br&gt;
  {&lt;br&gt;
    bool aac_file_available = false;&lt;br&gt;
    Serial.println("Open AAC file: " AAC_FILENAME);&lt;br&gt;
    gfx-&amp;gt;println("Open AAC file: " AAC_FILENAME);&lt;br&gt;
    // File aFile = LittleFS.open(AAC_FILENAME);&lt;br&gt;
    // File aFile = SPIFFS.open(AAC_FILENAME);&lt;br&gt;
    // File aFile = FFat.open(AAC_FILENAME);&lt;br&gt;
    File aFile = SD.open(AAC_FILENAME);&lt;br&gt;
    // File aFile = SD_MMC.open(AAC_FILENAME);&lt;br&gt;
    if (aFile)&lt;br&gt;
    {&lt;br&gt;
      aac_file_available = true;&lt;br&gt;
    }&lt;br&gt;
    else&lt;br&gt;
    {&lt;br&gt;
      Serial.println("Open MP3 file: " MP3_FILENAME);&lt;br&gt;
      gfx-&amp;gt;println("Open MP3 file: " MP3_FILENAME);&lt;br&gt;
      // aFile = LittleFS.open(MP3_FILENAME);&lt;br&gt;
      // aFile = SPIFFS.open(MP3_FILENAME);&lt;br&gt;
      // aFile = FFat.open(MP3_FILENAME);&lt;br&gt;
      aFile = SD.open(MP3_FILENAME);&lt;br&gt;
      // aFile = SD_MMC.open(MP3_FILENAME);&lt;br&gt;
    }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (!aFile || aFile.isDirectory())
{
  Serial.println("ERROR: Failed to open " AAC_FILENAME " or " MP3_FILENAME " file for reading");
  gfx-&amp;gt;println("ERROR: Failed to open " AAC_FILENAME " or " MP3_FILENAME " file for reading");
}
else
{
  Serial.println("Open MJPEG file: " MJPEG_FILENAME);
  gfx-&amp;gt;println("Open MJPEG file: " MJPEG_FILENAME);
  // File vFile = LittleFS.open(MJPEG_FILENAME);
  // File vFile = SPIFFS.open(MJPEG_FILENAME);
  // File vFile = FFat.open(MJPEG_FILENAME);
  File vFile = SD.open(MJPEG_FILENAME);
  // File vFile = SD_MMC.open(MJPEG_FILENAME);
  if (!vFile || vFile.isDirectory())
  {
    Serial.println("ERROR: Failed to open " MJPEG_FILENAME " file for reading");
    gfx-&amp;gt;println("ERROR: Failed to open " MJPEG_FILENAME " file for reading");
  }
  else
  {
    Serial.println("Init video");
    gfx-&amp;gt;println("Init video");
    mjpeg_setup(&amp;amp;vFile, MJPEG_BUFFER_SIZE, drawMCU,
                false /* useBigEndian */, DECODEASSIGNCORE, DRAWASSIGNCORE);

    Serial.println("Start play audio task");
    gfx-&amp;gt;println("Start play audio task");
    BaseType_t ret_val;
    if (aac_file_available)
    {
      ret_val = aac_player_task_start(&amp;amp;aFile, AUDIOASSIGNCORE);
    }
    else
    {
      ret_val = mp3_player_task_start(&amp;amp;aFile, AUDIOASSIGNCORE);
    }
    if (ret_val != pdPASS)
    {
      Serial.printf("Audio player task start failed: %d\n", ret_val);
      gfx-&amp;gt;printf("Audio player task start failed: %d\n", ret_val);
    }

    Serial.println("Start play video");
    gfx-&amp;gt;println("Start play video");
    start_ms = millis();
    curr_ms = millis();
    next_frame_ms = start_ms + (++next_frame * 1000 / FPS / 2);
    while (vFile.available() &amp;amp;&amp;amp; mjpeg_read_frame()) // Read video
    {
      total_read_video_ms += millis() - curr_ms;
      curr_ms = millis();

      if (millis() &amp;lt; next_frame_ms) // check show frame or skip frame
      {
        // Play video
        mjpeg_draw_frame();
        total_decode_video_ms += millis() - curr_ms;
        curr_ms = millis();
      }
      else
      {
        ++skipped_frames;
        Serial.println("Skip frame");
      }

      while (millis() &amp;lt; next_frame_ms)
      {
        vTaskDelay(pdMS_TO_TICKS(1));
      }

      curr_ms = millis();
      next_frame_ms = start_ms + (++next_frame * 1000 / FPS);
    }
    int time_used = millis() - start_ms;
    int total_frames = next_frame - 1;
    Serial.println("AV end");
    vFile.close();
    aFile.close();

    int played_frames = total_frames - skipped_frames;
    float fps = 1000.0 * played_frames / time_used;
    total_decode_audio_ms -= total_play_audio_ms;
    // total_decode_video_ms -= total_show_video_ms;
    Serial.printf("Played frames: %d\n", played_frames);
    Serial.printf("Skipped frames: %d (%0.1f %%)\n", skipped_frames, 100.0 * skipped_frames / total_frames);
    Serial.printf("Time used: %d ms\n", time_used);
    Serial.printf("Expected FPS: %d\n", FPS);
    Serial.printf("Actual FPS: %0.1f\n", fps);
    Serial.printf("Read audio: %lu ms (%0.1f %%)\n", total_read_audio_ms, 100.0 * total_read_audio_ms / time_used);
    Serial.printf("Decode audio: %lu ms (%0.1f %%)\n", total_decode_audio_ms, 100.0 * total_decode_audio_ms / time_used);
    Serial.printf("Play audio: %lu ms (%0.1f %%)\n", total_play_audio_ms, 100.0 * total_play_audio_ms / time_used);
    Serial.printf("Read video: %lu ms (%0.1f %%)\n", total_read_video_ms, 100.0 * total_read_video_ms / time_used);
    Serial.printf("Decode video: %lu ms (%0.1f %%)\n", total_decode_video_ms, 100.0 * total_decode_video_ms / time_used);
    Serial.printf("Show video: %lu ms (%0.1f %%)\n", total_show_video_ms, 100.0 * total_show_video_ms / time_used);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  define CHART_MARGIN 64
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LEGEND_A_COLOR 0x1BB6
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LEGEND_B_COLOR 0xFBE1
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LEGEND_C_COLOR 0x2D05
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LEGEND_D_COLOR 0xD125
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LEGEND_E_COLOR 0x9337
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LEGEND_F_COLOR 0x8AA9
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LEGEND_G_COLOR 0xE3B8
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LEGEND_H_COLOR 0x7BEF
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LEGEND_I_COLOR 0xBDE4
&lt;/h1&gt;
&lt;h1&gt;
  
  
  define LEGEND_J_COLOR 0x15F9
&lt;/h1&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    // gfx-&amp;gt;setCursor(0, 0);
    gfx-&amp;gt;setTextColor(WHITE);
    gfx-&amp;gt;printf("Played frames: %d\n", played_frames);
    gfx-&amp;gt;printf("Skipped frames: %d (%0.1f %%)\n", skipped_frames, 100.0 * skipped_frames / total_frames);
    gfx-&amp;gt;printf("Time used: %d ms\n", time_used);
    gfx-&amp;gt;printf("Expected FPS: %d\n", FPS);
    gfx-&amp;gt;printf("Actual FPS: %0.1f\n\n", fps);

    int16_t r1 = ((gfx-&amp;gt;height() - CHART_MARGIN - CHART_MARGIN) / 2);
    int16_t r2 = r1 / 2;
    int16_t cx = gfx-&amp;gt;width() - r1 - 10;
    int16_t cy = r1 + CHART_MARGIN;

    float arc_start1 = 0;
    float arc_end1 = arc_start1 + max(2.0, 360.0 * total_read_audio_ms / time_used);
    for (int i = arc_start1 + 1; i &amp;lt; arc_end1; i += 2)
    {
      gfx-&amp;gt;fillArc(cx, cy, r1, r2, arc_start1 - 90.0, i - 90.0, LEGEND_A_COLOR);
    }
    gfx-&amp;gt;fillArc(cx, cy, r1, r2, arc_start1 - 90.0, arc_end1 - 90.0, LEGEND_A_COLOR);
    gfx-&amp;gt;setTextColor(LEGEND_A_COLOR);
    gfx-&amp;gt;printf("Read audio: %lu ms (%0.1f %%)\n", total_read_audio_ms, 100.0 * total_read_audio_ms / time_used);

    float arc_start2 = arc_end1;
    float arc_end2 = arc_start2 + max(2.0, 360.0 * total_decode_audio_ms / time_used);
    for (int i = arc_start2 + 1; i &amp;lt; arc_end2; i += 2)
    {
      gfx-&amp;gt;fillArc(cx, cy, r1, r2, arc_start2 - 90.0, i - 90.0, LEGEND_B_COLOR);
    }
    gfx-&amp;gt;fillArc(cx, cy, r1, r2, arc_start2 - 90.0, arc_end2 - 90.0, LEGEND_B_COLOR);
    gfx-&amp;gt;setTextColor(LEGEND_B_COLOR);
    gfx-&amp;gt;printf("Decode audio: %lu ms (%0.1f %%)\n", total_decode_audio_ms, 100.0 * total_decode_audio_ms / time_used);
    gfx-&amp;gt;setTextColor(LEGEND_J_COLOR);
    gfx-&amp;gt;printf("Play audio: %lu ms (%0.1f %%)\n", total_play_audio_ms, 100.0 * total_play_audio_ms / time_used);

    float arc_start3 = arc_end2;
    float arc_end3 = arc_start3 + max(2.0, 360.0 * total_read_video_ms / time_used);
    for (int i = arc_start3 + 1; i &amp;lt; arc_end3; i += 2)
    {
      gfx-&amp;gt;fillArc(cx, cy, r1, r2, arc_start3 - 90.0, i - 90.0, LEGEND_C_COLOR);
    }
    gfx-&amp;gt;fillArc(cx, cy, r1, r2, arc_start3 - 90.0, arc_end3 - 90.0, LEGEND_C_COLOR);
    gfx-&amp;gt;setTextColor(LEGEND_C_COLOR);
    gfx-&amp;gt;printf("Read video: %lu ms (%0.1f %%)\n", total_read_video_ms, 100.0 * total_read_video_ms / time_used);

    float arc_start4 = arc_end3;
    float arc_end4 = arc_start4 + max(2.0, 360.0 * total_show_video_ms / time_used);
    for (int i = arc_start4 + 1; i &amp;lt; arc_end4; i += 2)
    {
      gfx-&amp;gt;fillArc(cx, cy, r1, r2, arc_start4 - 90.0, i - 90.0, LEGEND_D_COLOR);
    }
    gfx-&amp;gt;fillArc(cx, cy, r1, r2, arc_start4 - 90.0, arc_end4 - 90.0, LEGEND_D_COLOR);
    gfx-&amp;gt;setTextColor(LEGEND_D_COLOR);
    gfx-&amp;gt;printf("Show video: %lu ms (%0.1f %%)\n", total_show_video_ms, 100.0 * total_show_video_ms / time_used);

    float arc_start5 = 0;
    float arc_end5 = arc_start5 + max(2.0, 360.0 * total_decode_video_ms / time_used);
    for (int i = arc_start5 + 1; i &amp;lt; arc_end5; i += 2)
    {
      gfx-&amp;gt;fillArc(cx, cy, r2, 0, arc_start5 - 90.0, i - 90.0, LEGEND_E_COLOR);
    }
    gfx-&amp;gt;fillArc(cx, cy, r2, 0, arc_start5 - 90.0, arc_end5 - 90.0, LEGEND_E_COLOR);
    gfx-&amp;gt;setTextColor(LEGEND_E_COLOR);
    gfx-&amp;gt;printf("Decode video: %lu ms (%0.1f %%)\n", total_decode_video_ms, 100.0 * total_decode_video_ms / time_used);
  }
  // delay(60000);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  ifdef GFX_BL
&lt;/h1&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  // digitalWrite(GFX_BL, LOW);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  // gfx-&amp;gt;displayOff();
  // esp_deep_sleep_start();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void loop()&lt;br&gt;
{&lt;br&gt;
}&lt;/p&gt;

&lt;h1&gt;
  
  
  include "driver/i2s.h"
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include "AACDecoderHelix.h"
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include "MP3DecoderHelix.h"
&lt;/h1&gt;

&lt;p&gt;static unsigned long total_read_audio_ms = 0;&lt;br&gt;
static unsigned long total_decode_audio_ms = 0;&lt;br&gt;
static unsigned long total_play_audio_ms = 0;&lt;/p&gt;

&lt;p&gt;static i2s_port_t _i2s_num;&lt;br&gt;
static esp_err_t i2s_init(i2s_port_t i2s_num, uint32_t sample_rate,&lt;br&gt;
                          int mck_io_num,   /&lt;em&gt;!&amp;lt; MCK in out pin. Note that ESP32 supports setting MCK on GPIO0/GPIO1/GPIO3 only&lt;/em&gt;/&lt;br&gt;
                          int bck_io_num,   /&lt;em&gt;!&amp;lt; BCK in out pin&lt;/em&gt;/&lt;br&gt;
                          int ws_io_num,    /&lt;em&gt;!&amp;lt; WS in out pin&lt;/em&gt;/&lt;br&gt;
                          int data_out_num, /&lt;em&gt;!&amp;lt; DATA out pin&lt;/em&gt;/&lt;br&gt;
                          int data_in_num   /&lt;em&gt;!&amp;lt; DATA in pin&lt;/em&gt;/&lt;br&gt;
)&lt;br&gt;
{&lt;br&gt;
    _i2s_num = i2s_num;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;esp_err_t ret_val = ESP_OK;

i2s_config_t i2s_config;
i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX);
i2s_config.sample_rate = sample_rate;
i2s_config.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT;
i2s_config.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT;
i2s_config.communication_format = I2S_COMM_FORMAT_STAND_I2S;
i2s_config.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1;
i2s_config.dma_buf_count = 8;
i2s_config.dma_buf_len = 160;
i2s_config.use_apll = false;
i2s_config.tx_desc_auto_clear = true;
i2s_config.fixed_mclk = 0;
i2s_config.mclk_multiple = I2S_MCLK_MULTIPLE_DEFAULT;
i2s_config.bits_per_chan = I2S_BITS_PER_CHAN_16BIT;

i2s_pin_config_t pin_config;
pin_config.mck_io_num = mck_io_num;
pin_config.bck_io_num = bck_io_num;
pin_config.ws_io_num = ws_io_num;
pin_config.data_out_num = data_out_num;
pin_config.data_in_num = data_in_num;

ret_val |= i2s_driver_install(i2s_num, &amp;amp;i2s_config, 0, NULL);
ret_val |= i2s_set_pin(i2s_num, &amp;amp;pin_config);

return ret_val;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;static int _samprate = 0;&lt;br&gt;
static void aacAudioDataCallback(AACFrameInfo &amp;amp;info, int16_t &lt;em&gt;pwm_buffer, size_t len)&lt;br&gt;
{&lt;br&gt;
    unsigned long s = millis();&lt;br&gt;
    if (_samprate != info.sampRateOut)&lt;br&gt;
    {&lt;br&gt;
        // log_i("bitRate: %d, nChans: %d, sampRateCore: %d, sampRateOut: %d, bitsPerSample: %d, outputSamps: %d, profile: %d, tnsUsed: %d, pnsUsed: %d",&lt;br&gt;
        //       info.bitRate, info.nChans, info.sampRateCore, info.sampRateOut, info.bitsPerSample, info.outputSamps, info.profile, info.tnsUsed, info.pnsUsed);&lt;br&gt;
        i2s_set_clk(_i2s_num, info.sampRateOut /&lt;/em&gt; sample_rate &lt;em&gt;/, info.bitsPerSample /&lt;/em&gt; bits_cfg &lt;em&gt;/, (info.nChans == 2) ? I2S_CHANNEL_STEREO : I2S_CHANNEL_MONO /&lt;/em&gt; channel &lt;em&gt;/);&lt;br&gt;
        _samprate = info.sampRateOut;&lt;br&gt;
    }&lt;br&gt;
    size_t i2s_bytes_written = 0;&lt;br&gt;
    i2s_write(_i2s_num, pwm_buffer, len * 2, &amp;amp;i2s_bytes_written, portMAX_DELAY);&lt;br&gt;
    // log_i("len: %d, i2s_bytes_written: %d", len, i2s_bytes_written);&lt;br&gt;
    total_play_audio_ms += millis() - s;&lt;br&gt;
}&lt;br&gt;
static void mp3AudioDataCallback(MP3FrameInfo &amp;amp;info, int16_t *pwm_buffer, size_t len)&lt;br&gt;
{&lt;br&gt;
    unsigned long s = millis();&lt;br&gt;
    if (_samprate != info.samprate)&lt;br&gt;
    {&lt;br&gt;
        log_i("bitrate: %d, nChans: %d, samprate: %d, bitsPerSample: %d, outputSamps: %d, layer: %d, version: %d",&lt;br&gt;
              info.bitrate, info.nChans, info.samprate, info.bitsPerSample, info.outputSamps, info.layer, info.version);&lt;br&gt;
        i2s_set_clk(_i2s_num, info.samprate /&lt;/em&gt; sample_rate &lt;em&gt;/, info.bitsPerSample /&lt;/em&gt; bits_cfg &lt;em&gt;/, (info.nChans == 2) ? I2S_CHANNEL_STEREO : I2S_CHANNEL_MONO /&lt;/em&gt; channel */);&lt;br&gt;
        _samprate = info.samprate;&lt;br&gt;
    }&lt;br&gt;
    size_t i2s_bytes_written = 0;&lt;br&gt;
    i2s_write(_i2s_num, pwm_buffer, len * 2, &amp;amp;i2s_bytes_written, portMAX_DELAY);&lt;br&gt;
    // log_i("len: %d, i2s_bytes_written: %d", len, i2s_bytes_written);&lt;br&gt;
    total_play_audio_ms += millis() - s;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;static uint8_t _frame[MP3_MAX_FRAME_SIZE]; // MP3_MAX_FRAME_SIZE is smaller, so always use MP3_MAX_FRAME_SIZE&lt;/p&gt;

&lt;p&gt;static libhelix::AACDecoderHelix _aac(aacAudioDataCallback);&lt;br&gt;
static void aac_player_task(void *pvParam)&lt;br&gt;
{&lt;br&gt;
    Stream *input = (Stream *)pvParam;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;int r, w;
unsigned long ms = millis();
while (r = input-&amp;gt;readBytes(_frame, MP3_MAX_FRAME_SIZE))
{
    total_read_audio_ms += millis() - ms;
    ms = millis();

    while (r &amp;gt; 0)
    {
        w = _aac.write(_frame, r);
        // log_i("r: %d, w: %d\n", r, w);
        r -= w;
    }
    total_decode_audio_ms += millis() - ms;
    ms = millis();
}
log_i("AAC stop.");

vTaskDelete(NULL);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;static libhelix::MP3DecoderHelix _mp3(mp3AudioDataCallback);&lt;br&gt;
static void mp3_player_task(void *pvParam)&lt;br&gt;
{&lt;br&gt;
    Stream *input = (Stream *)pvParam;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;int r, w;
unsigned long ms = millis();
while (r = input-&amp;gt;readBytes(_frame, MP3_MAX_FRAME_SIZE))
{
    total_read_audio_ms += millis() - ms;
    ms = millis();

    while (r &amp;gt; 0)
    {
        w = _mp3.write(_frame, r);
        // log_i("r: %d, w: %d\n", r, w);
        r -= w;
    }
    total_decode_audio_ms += millis() - ms;
    ms = millis();
}
log_i("MP3 stop.");

vTaskDelete(NULL);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;static BaseType_t aac_player_task_start(Stream *input, BaseType_t audioAssignCore)&lt;br&gt;
{&lt;br&gt;
    _aac.begin();&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return xTaskCreatePinnedToCore(
    (TaskFunction_t)aac_player_task,
    (const char *const)"AAC Player Task",
    (const uint32_t)2000,
    (void *const)input,
    (UBaseType_t)configMAX_PRIORITIES - 1,
    (TaskHandle_t *const)NULL,
    (const BaseType_t)audioAssignCore);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;static BaseType_t mp3_player_task_start(Stream *input, BaseType_t audioAssignCore)&lt;br&gt;
{&lt;br&gt;
    _mp3.begin();&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return xTaskCreatePinnedToCore(
    (TaskFunction_t)mp3_player_task,
    (const char *const)"MP3 Player Task",
    (const uint32_t)2000,
    (void *const)input,
    (UBaseType_t)configMAX_PRIORITIES - 1,
    (TaskHandle_t *const)NULL,
    (const BaseType_t)audioAssignCore);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;h1&gt;
  
  
  define READ_BUFFER_SIZE 1024
&lt;/h1&gt;

&lt;p&gt;// #define MAXOUTPUTSIZE (MAX_BUFFERED_PIXELS / 16 / 16)&lt;/p&gt;

&lt;h1&gt;
  
  
  define MAXOUTPUTSIZE (288 / 3 / 16)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define NUMBER_OF_DECODE_BUFFER 3
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define NUMBER_OF_DRAW_BUFFER 9
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;p&gt;typedef struct&lt;br&gt;
{&lt;br&gt;
  int32_t size;&lt;br&gt;
  uint8_t *buf;&lt;br&gt;
} mjpegBuf;&lt;/p&gt;

&lt;p&gt;typedef struct&lt;br&gt;
{&lt;br&gt;
  xQueueHandle xqh;&lt;br&gt;
  JPEG_DRAW_CALLBACK *drawFunc;&lt;br&gt;
} paramDrawTask;&lt;/p&gt;

&lt;p&gt;typedef struct&lt;br&gt;
{&lt;br&gt;
  xQueueHandle xqh;&lt;br&gt;
  mjpegBuf *mBuf;&lt;br&gt;
  JPEG_DRAW_CALLBACK *drawFunc;&lt;br&gt;
} paramDecodeTask;&lt;/p&gt;

&lt;p&gt;static JPEGDRAW jpegdraws[NUMBER_OF_DRAW_BUFFER];&lt;br&gt;
static int _draw_queue_cnt = 0;&lt;br&gt;
static JPEGDEC _jpegDec;&lt;br&gt;
static xQueueHandle _xqh;&lt;br&gt;
static bool _useBigEndian;&lt;/p&gt;

&lt;p&gt;static unsigned long total_read_video_ms = 0;&lt;br&gt;
static unsigned long total_decode_video_ms = 0;&lt;br&gt;
static unsigned long total_show_video_ms = 0;&lt;/p&gt;

&lt;p&gt;Stream *_input;&lt;/p&gt;

&lt;p&gt;int32_t _mjpegBufSize;&lt;/p&gt;

&lt;p&gt;uint8_t *_read_buf;&lt;br&gt;
int32_t _mjpeg_buf_offset = 0;&lt;/p&gt;

&lt;p&gt;TaskHandle_t _decodeTask;&lt;br&gt;
TaskHandle_t _draw_task;&lt;br&gt;
paramDecodeTask _pDecodeTask;&lt;br&gt;
paramDrawTask _pDrawTask;&lt;br&gt;
uint8_t *_mjpeg_buf;&lt;br&gt;
uint8_t _mBufIdx = 0;&lt;/p&gt;

&lt;p&gt;int32_t _inputindex = 0;&lt;br&gt;
int32_t _buf_read;&lt;br&gt;
int32_t _remain = 0;&lt;br&gt;
mjpegBuf _mjpegBufs[NUMBER_OF_DECODE_BUFFER];&lt;/p&gt;

&lt;p&gt;static int queueDrawMCU(JPEGDRAW *pDraw)&lt;br&gt;
{&lt;br&gt;
  int len = pDraw-&amp;gt;iWidth * pDraw-&amp;gt;iHeight * 2;&lt;br&gt;
  JPEGDRAW *j = &amp;amp;jpegdraws[_draw_queue_cnt % NUMBER_OF_DRAW_BUFFER];&lt;br&gt;
  j-&amp;gt;x = pDraw-&amp;gt;x;&lt;br&gt;
  j-&amp;gt;y = pDraw-&amp;gt;y;&lt;br&gt;
  j-&amp;gt;iWidth = pDraw-&amp;gt;iWidth;&lt;br&gt;
  j-&amp;gt;iHeight = pDraw-&amp;gt;iHeight;&lt;br&gt;
  memcpy(j-&amp;gt;pPixels, pDraw-&amp;gt;pPixels, len);&lt;/p&gt;

&lt;p&gt;// log_i("queueDrawMCU start.");&lt;br&gt;
  ++_draw_queue_cnt;&lt;br&gt;
  xQueueSend(_xqh, &amp;amp;j, portMAX_DELAY);&lt;br&gt;
  // log_i("queueDrawMCU end.");&lt;/p&gt;

&lt;p&gt;return 1;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;static void decode_task(void *arg)&lt;br&gt;
{&lt;br&gt;
  paramDecodeTask *p = (paramDecodeTask *)arg;&lt;br&gt;
  mjpegBuf *mBuf;&lt;br&gt;
  log_i("decode_task start.");&lt;br&gt;
  while (xQueueReceive(p-&amp;gt;xqh, &amp;amp;mBuf, portMAX_DELAY))&lt;br&gt;
  {&lt;br&gt;
    // log_i("mBuf-&amp;gt;size: %d", mBuf-&amp;gt;size);&lt;br&gt;
    // log_i("mBuf-&amp;gt;buf start: %X %X, end: %X, %X.", mBuf-&amp;gt;buf[0], mBuf-&amp;gt;buf[1], mBuf-&amp;gt;buf[mBuf-&amp;gt;size - 2], mBuf-&amp;gt;buf[mBuf-&amp;gt;size - 1]);&lt;br&gt;
    unsigned long s = millis();&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_jpegDec.openRAM(mBuf-&amp;gt;buf, mBuf-&amp;gt;size, p-&amp;gt;drawFunc);

// _jpegDec.setMaxOutputSize(MAXOUTPUTSIZE);
if (_useBigEndian)
{
  _jpegDec.setPixelType(RGB565_BIG_ENDIAN);
}
_jpegDec.setMaxOutputSize(MAXOUTPUTSIZE);
_jpegDec.decode(0, 0, 0);
_jpegDec.close();

total_decode_video_ms += millis() - s;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  vQueueDelete(p-&amp;gt;xqh);&lt;br&gt;
  log_i("decode_task end.");&lt;br&gt;
  vTaskDelete(NULL);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;static void draw_task(void *arg)&lt;br&gt;
{&lt;br&gt;
  paramDrawTask *p = (paramDrawTask *)arg;&lt;br&gt;
  JPEGDRAW *pDraw;&lt;br&gt;
  log_i("draw_task start.");&lt;br&gt;
  while (xQueueReceive(p-&amp;gt;xqh, &amp;amp;pDraw, portMAX_DELAY))&lt;br&gt;
  {&lt;br&gt;
    // log_i("draw_task work start: x: %d, y: %d, iWidth: %d, iHeight: %d.", pDraw-&amp;gt;x, pDraw-&amp;gt;y, pDraw-&amp;gt;iWidth, pDraw-&amp;gt;iHeight);&lt;br&gt;
    p-&amp;gt;drawFunc(pDraw);&lt;br&gt;
    // log_i("draw_task work end.");&lt;br&gt;
  }&lt;br&gt;
  vQueueDelete(p-&amp;gt;xqh);&lt;br&gt;
  log_i("draw_task end.");&lt;br&gt;
  vTaskDelete(NULL);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;bool mjpeg_setup(Stream *input, int32_t mjpegBufSize, JPEG_DRAW_CALLBACK *pfnDraw,&lt;br&gt;
                 bool useBigEndian, BaseType_t decodeAssignCore, BaseType_t drawAssignCore)&lt;br&gt;
{&lt;br&gt;
  _input = input;&lt;br&gt;
  _mjpegBufSize = mjpegBufSize;&lt;br&gt;
  _useBigEndian = useBigEndian;&lt;/p&gt;

&lt;p&gt;for (int i = 0; i &amp;lt; NUMBER_OF_DECODE_BUFFER; ++i)&lt;br&gt;
  {&lt;br&gt;
    _mjpegBufs[i].buf = (uint8_t *)malloc(mjpegBufSize);&lt;br&gt;
    if (_mjpegBufs[i].buf)&lt;br&gt;
    {&lt;br&gt;
      log_i("#%d decode buffer allocated.", i);&lt;br&gt;
    }&lt;br&gt;
    else&lt;br&gt;
    {&lt;br&gt;
      log_e("#%d decode buffer allocat failed.", i);&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
  _mjpeg_buf = _mjpegBufs[_mBufIdx].buf;&lt;/p&gt;

&lt;p&gt;if (!_read_buf)&lt;br&gt;
  {&lt;br&gt;
    _read_buf = (uint8_t *)malloc(READ_BUFFER_SIZE);&lt;br&gt;
  }&lt;br&gt;
  if (_read_buf)&lt;br&gt;
  {&lt;br&gt;
    log_i("Read buffer allocated.");&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;_xqh = xQueueCreate(NUMBER_OF_DRAW_BUFFER, sizeof(JPEGDRAW));&lt;br&gt;
  _pDrawTask.xqh = _xqh;&lt;br&gt;
  _pDrawTask.drawFunc = pfnDraw;&lt;br&gt;
  _pDecodeTask.xqh = xQueueCreate(NUMBER_OF_DECODE_BUFFER, sizeof(mjpegBuf));&lt;br&gt;
  _pDecodeTask.drawFunc = queueDrawMCU;&lt;/p&gt;

&lt;p&gt;xTaskCreatePinnedToCore(&lt;br&gt;
      (TaskFunction_t)decode_task,&lt;br&gt;
      (const char *const)"MJPEG decode Task",&lt;br&gt;
      (const uint32_t)2000,&lt;br&gt;
      (void *const)&amp;amp;_pDecodeTask,&lt;br&gt;
      (UBaseType_t)configMAX_PRIORITIES - 1,&lt;br&gt;
      (TaskHandle_t *const)&amp;amp;_decodeTask,&lt;br&gt;
      (const BaseType_t)decodeAssignCore);&lt;br&gt;
  xTaskCreatePinnedToCore(&lt;br&gt;
      (TaskFunction_t)draw_task,&lt;br&gt;
      (const char *const)"MJPEG Draw Task",&lt;br&gt;
      (const uint32_t)2000,&lt;br&gt;
      (void *const)&amp;amp;_pDrawTask,&lt;br&gt;
      (UBaseType_t)configMAX_PRIORITIES - 1,&lt;br&gt;
      (TaskHandle_t *const)&amp;amp;_draw_task,&lt;br&gt;
      (const BaseType_t)drawAssignCore);&lt;/p&gt;

&lt;p&gt;for (int i = 0; i &amp;lt; NUMBER_OF_DRAW_BUFFER; i++)&lt;br&gt;
  {&lt;br&gt;
    if (!jpegdraws[i].pPixels)&lt;br&gt;
    {&lt;br&gt;
      jpegdraws[i].pPixels = (uint16_t *)heap_caps_malloc(MAXOUTPUTSIZE * 16 * 16 * 2, MALLOC_CAP_DMA);&lt;br&gt;
    }&lt;br&gt;
    if (jpegdraws[i].pPixels)&lt;br&gt;
    {&lt;br&gt;
      log_i("#%d draw buffer allocated.", i);&lt;br&gt;
    }&lt;br&gt;
    else&lt;br&gt;
    {&lt;br&gt;
      log_e("#%d draw buffer allocat failed.", i);&lt;br&gt;
    }&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;return true;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;bool mjpeg_read_frame()&lt;br&gt;
{&lt;br&gt;
  if (_inputindex == 0)&lt;br&gt;
  {&lt;br&gt;
    _buf_read = _input-&amp;gt;readBytes(_read_buf, READ_BUFFER_SIZE);&lt;br&gt;
    _inputindex += _buf_read;&lt;br&gt;
  }&lt;br&gt;
  _mjpeg_buf_offset = 0;&lt;br&gt;
  int i = 0;&lt;br&gt;
  bool found_FFD8 = false;&lt;br&gt;
  while ((_buf_read &amp;gt; 0) &amp;amp;&amp;amp; (!found_FFD8))&lt;br&gt;
  {&lt;br&gt;
    i = 0;&lt;br&gt;
    while ((i &amp;lt; _buf_read) &amp;amp;&amp;amp; (!found_FFD8))&lt;br&gt;
    {&lt;br&gt;
      if ((_read_buf[i] == 0xFF) &amp;amp;&amp;amp; (_read_buf[i + 1] == 0xD8)) // JPEG header&lt;br&gt;
      {&lt;br&gt;
        // log_i("Found FFD8 at: %d.", i);&lt;br&gt;
        found_FFD8 = true;&lt;br&gt;
      }&lt;br&gt;
      ++i;&lt;br&gt;
    }&lt;br&gt;
    if (found_FFD8)&lt;br&gt;
    {&lt;br&gt;
      --i;&lt;br&gt;
    }&lt;br&gt;
    else&lt;br&gt;
    {&lt;br&gt;
      _buf_read = _input-&amp;gt;readBytes(_read_buf, READ_BUFFER_SIZE);&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
  uint8_t *_p = _read_buf + i;&lt;br&gt;
  _buf_read -= i;&lt;br&gt;
  bool found_FFD9 = false;&lt;br&gt;
  if (_buf_read &amp;gt; 0)&lt;br&gt;
  {&lt;br&gt;
    i = 3;&lt;br&gt;
    while ((_buf_read &amp;gt; 0) &amp;amp;&amp;amp; (!found_FFD9))&lt;br&gt;
    {&lt;br&gt;
      if ((_mjpeg_buf_offset &amp;gt; 0) &amp;amp;&amp;amp; (_mjpeg_buf[_mjpeg_buf_offset - 1] == 0xFF) &amp;amp;&amp;amp; (_p[0] == 0xD9)) // JPEG trailer&lt;br&gt;
      {&lt;br&gt;
        found_FFD9 = true;&lt;br&gt;
      }&lt;br&gt;
      else&lt;br&gt;
      {&lt;br&gt;
        while ((i &amp;lt; _buf_read) &amp;amp;&amp;amp; (!found_FFD9))&lt;br&gt;
        {&lt;br&gt;
          if ((_p[i] == 0xFF) &amp;amp;&amp;amp; (_p[i + 1] == 0xD9)) // JPEG trailer&lt;br&gt;
          {&lt;br&gt;
            found_FFD9 = true;&lt;br&gt;
            ++i;&lt;br&gt;
          }&lt;br&gt;
          ++i;&lt;br&gt;
        }&lt;br&gt;
      }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  // log_i("i: %d", i);
  memcpy(_mjpeg_buf + _mjpeg_buf_offset, _p, i);
  _mjpeg_buf_offset += i;
  int32_t o = _buf_read - i;
  if (o &amp;gt; 0)
  {
    // log_i("o: %d", o);
    memcpy(_read_buf, _p + i, o);
    _buf_read = _input-&amp;gt;readBytes(_read_buf + o, READ_BUFFER_SIZE - o);
    _p = _read_buf;
    _inputindex += _buf_read;
    _buf_read += o;
    // log_i("_buf_read: %d", _buf_read);
  }
  else
  {
    _buf_read = _input-&amp;gt;readBytes(_read_buf, READ_BUFFER_SIZE);
    _p = _read_buf;
    _inputindex += _buf_read;
  }
  i = 0;
}
if (found_FFD9)
{
  // log_i("Found FFD9 at: %d.", _mjpeg_buf_offset);
  if (_mjpeg_buf_offset &amp;gt; _mjpegBufSize) {
    log_e("_mjpeg_buf_offset(%d) &amp;gt; _mjpegBufSize (%d)", _mjpeg_buf_offset, _mjpegBufSize);
  }
  return true;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;return false;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;bool mjpeg_draw_frame()&lt;br&gt;
{&lt;br&gt;
  mjpegBuf *mBuf = &amp;amp;_mjpegBufs[_mBufIdx];&lt;br&gt;
  mBuf-&amp;gt;size = _mjpeg_buf_offset;&lt;br&gt;
  // log_i("_mjpegBufs[%d].size: %d.", _mBufIdx, _mjpegBufs[_mBufIdx].size);&lt;br&gt;
  // log_i("_mjpegBufs[%d].buf start: %X %X, end: %X, %X.", _mjpegBufs, _mjpegBufs[_mBufId].buf[0], _mjpegBufs[_mBufIdx].buf[1], _mjpegBufs[_mBufIdx].buf[_mjpeg_buf_offset - 2], _mjpegBufs[_mBufIdx].buf[_mjpeg_buf_offset - 1]);&lt;br&gt;
  xQueueSend(_pDecodeTask.xqh, &amp;amp;mBuf, portMAX_DELAY);&lt;br&gt;
  ++_mBufIdx;&lt;br&gt;
  if (_mBufIdx &amp;gt;= NUMBER_OF_DECODE_BUFFER)&lt;br&gt;
  {&lt;br&gt;
    _mBufIdx = 0;&lt;br&gt;
  }&lt;br&gt;
  _mjpeg_buf = _mjpegBufs[_mBufIdx].buf;&lt;br&gt;
  // log_i("queue decode_task end");&lt;/p&gt;

&lt;p&gt;return true;&lt;br&gt;
}&lt;br&gt;
//include libraries:&lt;/p&gt;

&lt;h1&gt;
  
  
  include "LedControl.h"
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include                 // Font library
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include                         // DS1307 clock
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include "RTClib.h"                      // DS1307 clock
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include                       // Button library by Alexander Brevig
&lt;/h1&gt;

&lt;p&gt;// Setup LED Matrix&lt;/p&gt;

&lt;p&gt;// pin 10 is connected to the DataIn on the display&lt;br&gt;
// pin 12 is connected to the CLK on the display&lt;br&gt;
// pin 11 is connected to LOAD on the display(cs)&lt;br&gt;
LedControl lc = LedControl(10, 12, 11, 4); //sets the 3 pins as 12, 11 &amp;amp; 10 and then sets 4 displays (max is 8 displays)&lt;/p&gt;

&lt;p&gt;//global variables&lt;br&gt;
byte intensity = 7;                      // Default intensity/brightness (0-15)&lt;br&gt;
byte clock_mode = 0;                     // Default clock mode. Default = 0 (basic_mode)&lt;br&gt;
bool random_mode = 0;                    // Define random mode - changes the display type every few hours. Default = 0 (off)&lt;br&gt;
byte old_mode = clock_mode;              // Stores the previous clock mode, so if we go to date or whatever, we know what mode to go back to after.&lt;br&gt;
bool ampm = 0;                           // Define 12 or 24 hour time. 0 = 24 hour. 1 = 12 hour&lt;br&gt;
byte change_mode_time = 0;               // Holds hour when clock mode will next change if in random mode.&lt;br&gt;
unsigned long delaytime = 500;           // We always wait a bit between updates of the display&lt;br&gt;
int rtc[7];                              // Holds real time clock output&lt;/p&gt;

&lt;p&gt;char days[7][4] = {&lt;br&gt;
  "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"&lt;br&gt;
}; //day array - used in slide, basic_mode and jumble modes (The DS1307 outputs 1-7 values for day of week)&lt;br&gt;
char daysfull[7][9] = {&lt;br&gt;
  "Sunday", "Monday", "Tuesday", "Wed", "Thursday", "Friday", "Saturday"&lt;br&gt;
};&lt;br&gt;
char suffix[4][3] = {&lt;br&gt;
  "st", "nd", "rd", "th"&lt;br&gt;
};  //date suffix array, used in slide, basic_mode and jumble modes. e,g, 1st 2nd ...&lt;/p&gt;

&lt;p&gt;//define constants&lt;/p&gt;

&lt;h1&gt;
  
  
  define NUM_DISPLAY_MODES 3              // Number display modes (conting zero as the first mode)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define NUM_SETTINGS_MODES 4             // Number settings modes = 6 (conting zero as the first mode)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define SLIDE_DELAY 20                   // The time in milliseconds for the slide effect per character in slide mode. Make this higher for a slower effect
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define cls          clear_display       // Clear display
&lt;/h1&gt;

&lt;p&gt;RTC_DS1307 ds1307;                              // Create RTC object&lt;/p&gt;

&lt;p&gt;Button buttonA = Button(2, BUTTON_PULLUP);      // Setup button A (using button library)&lt;br&gt;
Button buttonB = Button(3, BUTTON_PULLUP);      // Setup button B (using button library)&lt;/p&gt;

&lt;p&gt;void setup() {&lt;/p&gt;

&lt;p&gt;digitalWrite(2, HIGH);                 // turn on pullup resistor for button on pin 2&lt;br&gt;
  digitalWrite(3, HIGH);                 // turn on pullup resistor for button on pin 3&lt;br&gt;
  digitalWrite(4, HIGH);                 // turn on pullup resistor for button on pin 4&lt;/p&gt;

&lt;p&gt;Serial.begin(9600); //start serial&lt;/p&gt;

&lt;p&gt;//initialize the 4 matrix panels&lt;br&gt;
  //we have already set the number of devices when we created the LedControl&lt;br&gt;
  int devices = lc.getDeviceCount();&lt;br&gt;
  //we have to init all devices in a loop&lt;br&gt;
  for (int address = 0; address &amp;lt; devices; address++) {&lt;br&gt;
    /&lt;em&gt;The MAX72XX is in power-saving mode on startup&lt;/em&gt;/&lt;br&gt;
    lc.shutdown(address, false);&lt;br&gt;
    /* Set the brightness to a medium values &lt;em&gt;/&lt;br&gt;
    lc.setIntensity(address, intensity);&lt;br&gt;
    /&lt;/em&gt; and clear the display */&lt;br&gt;
    lc.clearDisplay(address);&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;//Setup DS1307 RTC&lt;/p&gt;

&lt;h1&gt;
  
  
  ifdef AVR
&lt;/h1&gt;

&lt;p&gt;Wire.begin();&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;p&gt;Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;ds1307.begin(); //start RTC Clock&lt;/p&gt;

&lt;p&gt;if (! ds1307.isrunning()) {&lt;br&gt;
    Serial.println("RTC is NOT running!");&lt;br&gt;
    ds1307.adjust(DateTime(&lt;strong&gt;DATE&lt;/strong&gt;, &lt;strong&gt;TIME&lt;/strong&gt;));  // sets the RTC to the date &amp;amp; time this sketch was compiled&lt;br&gt;
  }&lt;br&gt;
  //Show software version &amp;amp; hello message&lt;br&gt;
  printver();&lt;/p&gt;

&lt;p&gt;//enable red led&lt;br&gt;
  digitalWrite(13, HIGH);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void loop() {&lt;/p&gt;

&lt;p&gt;//run the clock with whatever mode is set by clock_mode - the default is set at top of code.&lt;br&gt;
  switch (clock_mode){&lt;/p&gt;

&lt;p&gt;case 0: &lt;br&gt;
    basic_mode();&lt;br&gt;
    break; &lt;br&gt;
  case 1: &lt;br&gt;
   small_mode(); &lt;br&gt;
    break;&lt;br&gt;
  case 2: &lt;br&gt;
    slide(); &lt;br&gt;
    break;&lt;br&gt;
  case 3: &lt;br&gt;
    word_clock(); &lt;br&gt;
    break;&lt;br&gt;
  case 4: &lt;br&gt;
    setup_menu(); &lt;br&gt;
    break;&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//plot a point on the display&lt;br&gt;
void plot (byte x, byte y, byte val) {&lt;/p&gt;

&lt;p&gt;//select which matrix depending on the x coord&lt;br&gt;
  byte address;&lt;br&gt;
  if (x &amp;gt;= 0 &amp;amp;&amp;amp; x &amp;lt;= 7)   {&lt;br&gt;
    address = 3;&lt;br&gt;
  }&lt;br&gt;
  if (x &amp;gt;= 8 &amp;amp;&amp;amp; x &amp;lt;= 15)  {&lt;br&gt;
    address = 2;&lt;br&gt;
    x = x - 8;&lt;br&gt;
  }&lt;br&gt;
  if (x &amp;gt;= 16 &amp;amp;&amp;amp; x &amp;lt;= 23) {&lt;br&gt;
    address = 1;&lt;br&gt;
    x = x - 16;&lt;br&gt;
  }&lt;br&gt;
  if (x &amp;gt;= 24 &amp;amp;&amp;amp; x &amp;lt;= 31) {&lt;br&gt;
    address = 0;&lt;br&gt;
    x = x - 24;&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;if (val == 1) {&lt;br&gt;
   // lc.setLed(address, y, x, true);&lt;br&gt;
   lc.setLed(address, 7-y, x, true);&lt;br&gt;
  } else {&lt;br&gt;
  //  lc.setLed(address, y, x, false);&lt;br&gt;
  lc.setLed(address, 7-y, x, false);&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//clear screen&lt;br&gt;
void clear_display() {&lt;br&gt;
  for (byte address = 0; address &amp;lt; 4; address++) {&lt;br&gt;
    lc.clearDisplay(address);&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//fade screen down&lt;br&gt;
void fade_down() {&lt;/p&gt;

&lt;p&gt;//fade from global intensity to 1&lt;br&gt;
  for (byte i = intensity; i &amp;gt; 0; i--) {&lt;br&gt;
    for (byte address = 0; address &amp;lt; 4; address++) {&lt;br&gt;
      lc.setIntensity(address, i);&lt;br&gt;
    }&lt;br&gt;
    delay(30); //change this to change fade down speed&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;clear_display(); //clear display completely (off)&lt;/p&gt;

&lt;p&gt;//reset intentsity to global val&lt;br&gt;
  for (byte address = 0; address &amp;lt; 4; address++) {&lt;br&gt;
    lc.setIntensity(address, intensity);&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//power up led test &amp;amp; display software version number&lt;br&gt;
void printver() {&lt;/p&gt;

&lt;p&gt;byte i = 0;&lt;br&gt;
  char ver_a[9] = "Vers 1.0";&lt;br&gt;
  char ver_b[9] = " Hello! ";&lt;/p&gt;

&lt;p&gt;//test all leds.&lt;br&gt;
  for (byte x = 0; x &amp;lt;= 31; x++) {&lt;br&gt;
    for (byte y = 0; y &amp;lt;= 7; y++) {&lt;br&gt;
      plot(x, y, 1);&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
  delay(500);&lt;br&gt;
  fade_down();&lt;/p&gt;

&lt;p&gt;while (ver_a[i]) {&lt;br&gt;
    puttinychar((i * 4), 1, ver_a[i]);&lt;br&gt;
    delay(35);&lt;br&gt;
    i++;&lt;br&gt;
  }&lt;br&gt;
  delay(700);&lt;br&gt;
  fade_down();&lt;br&gt;
  i = 0;&lt;br&gt;
  while (ver_b[i]) {&lt;br&gt;
    puttinychar((i * 4), 1, ver_b[i]);&lt;br&gt;
    delay(35);&lt;br&gt;
    i++;&lt;br&gt;
  }&lt;br&gt;
  delay(700);&lt;br&gt;
  fade_down();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// puttinychar&lt;br&gt;
// Copy a 3x5 character glyph from the myfont data structure to display memory, with its upper left at the given coordinate&lt;br&gt;
// This is unoptimized and simply uses plot() to draw each dot.&lt;br&gt;
void puttinychar(byte x, byte y, char c)&lt;br&gt;
{&lt;br&gt;
  byte dots;&lt;br&gt;
  if (c &amp;gt;= 'A' &amp;amp;&amp;amp; c &amp;lt;= 'Z' || (c &amp;gt;= 'a' &amp;amp;&amp;amp; c &amp;lt;= 'z') ) {&lt;br&gt;
    c &amp;amp;= 0x1F;   // A-Z maps to 1-26&lt;br&gt;
  }&lt;br&gt;
  else if (c &amp;gt;= '0' &amp;amp;&amp;amp; c &amp;lt;= '9') {&lt;br&gt;
    c = (c - '0') + 32;&lt;br&gt;
  }&lt;br&gt;
  else if (c == ' ') {&lt;br&gt;
    c = 0; // space&lt;br&gt;
  }&lt;br&gt;
  else if (c == '.') {&lt;br&gt;
    c = 27; // full stop&lt;br&gt;
  }&lt;br&gt;
  else if (c == ':') {&lt;br&gt;
    c = 28; // colon&lt;br&gt;
  }&lt;br&gt;
  else if (c == '\'') {&lt;br&gt;
    c = 29; // single quote mark&lt;br&gt;
  }&lt;br&gt;
  else if (c == '!') {&lt;br&gt;
    c = 30; // single quote mark&lt;br&gt;
  }&lt;br&gt;
  else if (c == '?') {&lt;br&gt;
    c = 31; // single quote mark&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;for (byte col = 0; col &amp;lt; 3; col++) {&lt;br&gt;
    dots = pgm_read_byte_near(&amp;amp;mytinyfont[c][col]);&lt;br&gt;
    for (char row = 0; row &amp;lt; 5; row++) {&lt;br&gt;
      if (dots &amp;amp; (16 &amp;gt;&amp;gt; row))&lt;br&gt;
        plot(x + col, y + row, 1);&lt;br&gt;
      else&lt;br&gt;
        plot(x + col, y + row, 0);&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void putnormalchar(byte x, byte y, char c)&lt;br&gt;
{&lt;/p&gt;

&lt;p&gt;byte dots;&lt;br&gt;
  //  if (c &amp;gt;= 'A' &amp;amp;&amp;amp; c &amp;lt;= 'Z' || (c &amp;gt;= 'a' &amp;amp;&amp;amp; c &amp;lt;= 'z') ) {&lt;br&gt;
  //    c &amp;amp;= 0x1F;   // A-Z maps to 1-26&lt;br&gt;
  //  }&lt;br&gt;
  if (c &amp;gt;= 'A' &amp;amp;&amp;amp; c &amp;lt;= 'Z' ) {&lt;br&gt;
    c &amp;amp;= 0x1F;   // A-Z maps to 1-26&lt;br&gt;
  }&lt;br&gt;
  else if (c &amp;gt;= 'a' &amp;amp;&amp;amp; c &amp;lt;= 'z') {&lt;br&gt;
    c = (c - 'a') + 41;   // A-Z maps to 41-67&lt;br&gt;
  }&lt;br&gt;
  else if (c &amp;gt;= '0' &amp;amp;&amp;amp; c &amp;lt;= '9') {&lt;br&gt;
    c = (c - '0') + 31;&lt;br&gt;
  }&lt;br&gt;
  else if (c == ' ') {&lt;br&gt;
    c = 0; // space&lt;br&gt;
  }&lt;br&gt;
  else if (c == '.') {&lt;br&gt;
    c = 27; // full stop&lt;br&gt;
  }&lt;br&gt;
  else if (c == '\'') {&lt;br&gt;
    c = 28; // single quote mark&lt;br&gt;
  }&lt;br&gt;
  else if (c == ':') {&lt;br&gt;
    c = 29; // clock_mode selector arrow&lt;br&gt;
  }&lt;br&gt;
  else if (c == '&amp;gt;') {&lt;br&gt;
    c = 30; // clock_mode selector arrow&lt;br&gt;
  }&lt;br&gt;
  else if (c &amp;gt;= -80 &amp;amp;&amp;amp; c &amp;lt;= -67) {&lt;br&gt;
    c *= -1;&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;for (char col = 0; col &amp;lt; 5; col++) {&lt;br&gt;
    dots = pgm_read_byte_near(&amp;amp;myfont[c][col]);&lt;br&gt;
    for (char row = 0; row &amp;lt; 7; row++) {&lt;br&gt;
      //check coords are on screen before trying to plot&lt;br&gt;
      //if ((x &amp;gt;= 0) &amp;amp;&amp;amp; (x &amp;lt;= 31) &amp;amp;&amp;amp; (y &amp;gt;= 0) &amp;amp;&amp;amp; (y &amp;lt;= 7)){&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  if (dots &amp;amp; (64 &amp;gt;&amp;gt; row)) {   // only 7 rows.
    plot(x + col, y + row, 1);
  } else {
    plot(x + col, y + row, 0);
  }
  //}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//small_mode&lt;br&gt;
//show the time in small 3x5 characters with seconds display&lt;/p&gt;

&lt;p&gt;void small_mode() {&lt;/p&gt;

&lt;p&gt;char textchar[8]; // the 16 characters on the display&lt;br&gt;
  byte mins = 100; //mins&lt;br&gt;
  byte secs = rtc[0]; //seconds&lt;br&gt;
  byte old_secs = secs; //holds old seconds value - from last time seconds were updated o display - used to check if seconds have changed&lt;/p&gt;

&lt;p&gt;cls();&lt;/p&gt;

&lt;p&gt;//run clock main loop as long as run_mode returns true&lt;br&gt;
  while (run_mode()) {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;get_time();

//check for button press
if (buttonA.uniquePress()) {
  switch_mode();
  return;
}
if (buttonB.uniquePress()) {
  display_date();
  return;
}

//if secs changed then update them on the display
secs = rtc[0];
if (secs != old_secs) {

  //secs
  char buffer[3];
  itoa(secs, buffer, 10);

  //fix - as otherwise if num has leading zero, e.g. "03" secs, itoa coverts this to chars with space "3 ".
  if (secs &amp;lt; 10) {
    buffer[1] = buffer[0];
    buffer[0] = '0';
  }

  puttinychar( 20, 1, ':'); //seconds colon
  puttinychar( 24, 1, buffer[0]); //seconds
  puttinychar( 28, 1, buffer[1]); //seconds
  old_secs = secs;
}

//if minute changes change time
if (mins != rtc[1]) {

  //reset these for comparison next time
  mins = rtc[1];
  byte hours = rtc[2];
  if (hours &amp;gt; 12) {
    hours = hours - ampm * 12;
  }
  if (hours &amp;lt; 1) {
    hours = hours + ampm * 12;
  }


  //byte dow  = rtc[3]; // the DS1307 outputs 0 - 6 where 0 = Sunday0 - 6 where 0 = Sunday.
  //byte date = rtc[4];

  //set characters
  char buffer[3];
  itoa(hours, buffer, 10);

  //fix - as otherwise if num has leading zero, e.g. "03" hours, itoa coverts this to chars with space "3 ".
  if (hours &amp;lt; 10) {
    buffer[1] = buffer[0];
    //if we are in 12 hour mode blank the leading zero.
    if (ampm) {
      buffer[0] = ' ';
    }
    else {
      buffer[0] = '0';
    }
  }
  //set hours chars
  textchar[0] = buffer[0];
  textchar[1] = buffer[1];
  textchar[2] = ':';

  itoa (mins, buffer, 10);
  if (mins &amp;lt; 10) {
    buffer[1] = buffer[0];
    buffer[0] = '0';
  }
  //set mins characters
  textchar[3] = buffer[0];
  textchar[4] = buffer[1];

  //do seconds
  textchar[5] = ':';
  buffer[3];
  secs = rtc[0];
  itoa(secs, buffer, 10);

  //fix - as otherwise if num has leading zero, e.g. "03" secs, itoa coverts this to chars with space "3 ".
  if (secs &amp;lt; 10) {
    buffer[1] = buffer[0];
    buffer[0] = '0';
  }
  //set seconds
  textchar[6] = buffer[0];
  textchar[7] = buffer[1];

  byte x = 0;
  byte y = 0;

  //print each char
  for (byte x = 0; x &amp;lt; 6 ; x++) {
    puttinychar( x * 4, 1, textchar[x]);
  }
}
delay(50);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  fade_down();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// basic_mode()&lt;br&gt;
// show the time in 5x7 characters&lt;br&gt;
void basic_mode()&lt;br&gt;
{&lt;br&gt;
  cls();&lt;/p&gt;

&lt;p&gt;char buffer[3];   //for int to char conversion to turn rtc values into chars we can print on screen&lt;br&gt;
  byte offset = 0;  //used to offset the x postition of the digits and centre the display when we are in 12 hour mode and the clock shows only 3 digits. e.g. 3:21&lt;br&gt;
  byte x, y;        //used to draw a clear box over the left hand "1" of the display when we roll from 12:59 -&amp;gt; 1:00am in 12 hour mode.&lt;/p&gt;

&lt;p&gt;//do 12/24 hour conversion if ampm set to 1&lt;br&gt;
  byte hours = rtc[2];&lt;/p&gt;

&lt;p&gt;if (hours &amp;gt; 12) {&lt;br&gt;
    hours = hours - ampm * 12;&lt;br&gt;
  }&lt;br&gt;
  if (hours &amp;lt; 1) {&lt;br&gt;
    hours = hours + ampm * 12;&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;//do offset conversion&lt;br&gt;
  if (ampm &amp;amp;&amp;amp; hours &amp;lt; 10) {&lt;br&gt;
    offset = 2;&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;//set the next minute we show the date at&lt;br&gt;
  //set_next_date();&lt;/p&gt;

&lt;p&gt;// initially set mins to value 100 - so it wll never equal rtc[1] on the first loop of the clock, meaning we draw the clock display when we enter the function&lt;br&gt;
  byte secs = 100;&lt;br&gt;
  byte mins = 100;&lt;br&gt;
  int count = 0;&lt;/p&gt;

&lt;p&gt;//run clock main loop as long as run_mode returns true&lt;br&gt;
  while (run_mode()) {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//get the time from the clock chip
get_time();

//check for button press
if (buttonA.uniquePress()) {
  switch_mode();
  return;
}
if (buttonB.uniquePress()) {
  display_date();
  return;
}

//check whether it's time to automatically display the date
//check_show_date();

//draw the flashing : as on if the secs have changed.
if (secs != rtc[0]) {

  //update secs with new value
  secs = rtc[0];

  //draw :
  plot (15 - offset, 2, 1); //top point
  plot (15 - offset, 5, 1); //bottom point
  count = 400;
}

//if count has run out, turn off the :
if (count == 0) {
  plot (15 - offset, 2, 0); //top point
  plot (15 - offset, 5, 0); //bottom point
}
else {
  count--;
}

//re draw the display if button pressed or if mins != rtc[1] i.e. if the time has changed from what we had stored in mins, (also trigggered on first entering function when mins is 100)
if (mins != rtc[1]) {

  //update mins and hours with the new values
  mins = rtc[1];
  hours = rtc[2];

  //adjust hours of ampm set to 12 hour mode
  if (hours &amp;gt; 12) {
    hours = hours - ampm * 12;
  }
  if (hours &amp;lt; 1) {
    hours = hours + ampm * 12;
  }

  itoa(hours, buffer, 10);

  //if hours &amp;lt; 10 the num e.g. "3" hours, itoa coverts this to chars with space "3 " which we dont want
  if (hours &amp;lt; 10) {
    buffer[1] = buffer[0];
    buffer[0] = '0';
  }

  //print hours
  //if we in 12 hour mode and hours &amp;lt; 10, then don't print the leading zero, and set the offset so we centre the display with 3 digits.
  if (ampm &amp;amp;&amp;amp; hours &amp;lt; 10) {
    offset = 2;

    //if the time is 1:00am clear the entire display as the offset changes at this time and we need to blank out the old 12:59
    if ((hours == 1 &amp;amp;&amp;amp; mins == 0) ) {
      cls();
    }
  }
  else {
    //else no offset and print hours tens digit
    offset = 0;

    //if the time is 10:00am clear the entire display as the offset changes at this time and we need to blank out the old 9:59
    if (hours == 10 &amp;amp;&amp;amp; mins == 0) {
      cls();
    }


    putnormalchar(1,  0, buffer[0]);
  }
  //print hours ones digit
  putnormalchar(7 - offset, 0, buffer[1]);


  //print mins
  //add leading zero if mins &amp;lt; 10
  itoa (mins, buffer, 10);
  if (mins &amp;lt; 10) {
    buffer[1] = buffer[0];
    buffer[0] = '0';
  }
  //print mins tens and ones digits
  putnormalchar(19 - offset, 0, buffer[0]);
  putnormalchar(25 - offset, 0, buffer[1]);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  fade_down();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//like basic_mode but with slide effect&lt;br&gt;
void slide() {&lt;/p&gt;

&lt;p&gt;byte digits_old[4] = {99, 99, 99, 99}; //old values  we store time in. Set to somthing that will never match the time initially so all digits get drawn wnen the mode starts&lt;br&gt;
  byte digits_new[4]; //new digits time will slide to reveal&lt;br&gt;
  byte digits_x_pos[4] = {25, 19, 7, 1}; //x pos for which to draw each digit at&lt;/p&gt;

&lt;p&gt;char old_char[2]; //used when we use itoa to transpose the current digit (type byte) into a char to pass to the animation function&lt;br&gt;
  char new_char[2]; //used when we use itoa to transpose the new digit (type byte) into a char to pass to the animation function&lt;/p&gt;

&lt;p&gt;//old_chars - stores the 5 day and date suffix chars on the display. e.g. "mon" and "st". We feed these into the slide animation as the current char when these chars are updated.&lt;br&gt;
  //We sent them as A initially, which are used when the clocl enters the mode and no last chars are stored.&lt;br&gt;
  //char old_chars[6] = "AAAAA";&lt;/p&gt;

&lt;p&gt;//plot the clock colon on the display&lt;br&gt;
  cls();&lt;br&gt;
  putnormalchar( 13, 0, ':');&lt;/p&gt;

&lt;p&gt;byte old_secs = rtc[0]; //store seconds in old_secs. We compare secs and old secs. WHen they are different we redraw the display&lt;/p&gt;

&lt;p&gt;//run clock main loop as long as run_mode returns true&lt;br&gt;
  while (run_mode()) {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;get_time();

//check for button press
if (buttonA.uniquePress()) {
  switch_mode();
  return;
}
  if (buttonB.uniquePress()) {
  display_date();
  return;
}

//if secs have changed then update the display
if (rtc[0] != old_secs) {
  old_secs = rtc[0];

  //do 12/24 hour conversion if ampm set to 1
  byte hours = rtc[2];
  if (hours &amp;gt; 12) {
    hours = hours - ampm * 12;
  }
  if (hours &amp;lt; 1) {
    hours = hours + ampm * 12;
  }

  //split all date and time into individual digits - stick in digits_new array

  //rtc[0] = secs                        //array pos and digit stored
  //digits_new[0] = (rtc[0]%10);           //0 - secs ones
  //digits_new[1] = ((rtc[0]/10)%10);      //1 - secs tens
  //rtc[1] = mins
  digits_new[0] = (rtc[1] % 10);         //2 - mins ones
  digits_new[1] = ((rtc[1] / 10) % 10);  //3 - mins tens
  //rtc[2] = hours
  digits_new[2] = (hours % 10);         //4 - hour ones
  digits_new[3] = ((hours / 10) % 10);  //5 - hour tens
  //rtc[4] = date
  //digits_new[6] = (rtc[4]%10);           //6 - date ones
  //digits_new[7] = ((rtc[4]/10)%10);      //7 - date tens

  //draw initial screen of all chars. After this we just draw the changes.

  //compare digits 0 to 3 (mins and hours)
  for (byte i = 0; i &amp;lt;= 3; i++) {
    //see if digit has changed...
    if (digits_old[i] != digits_new[i]) {

      //run 9 step animation sequence for each in turn
      for (byte seq = 0; seq &amp;lt;= 8 ; seq++) {

        //convert digit to string
        itoa(digits_old[i], old_char, 10);
        itoa(digits_new[i], new_char, 10);

        //if set to 12 hour mode and we're on digit 2 (hours tens mode) then check to see if this is a zero. If it is, blank it instead so we get 2.00pm not 02.00pm
        if (ampm &amp;amp;&amp;amp; i == 3) {
          if (digits_new[3] == 0) {
            new_char[0] = ' ';
          }
          if (digits_old[3] == 0) {
            old_char[0] = ' ';
          }
        }
        //draw the animation frame for each digit
        slideanim(digits_x_pos[i], 0, seq, old_char[0], new_char[0]);
        delay(SLIDE_DELAY);
      }
    }
  }

  /*
  //compare date digit 6 (ones) and (7) tens - if either of these change we need to update the date line. We compare date tens as say from Jan 31 -&amp;gt; Feb 01 then ones digit doesn't change
  if ((digits_old[6] != digits_new[6]) || (digits_old[7] != digits_new[7])) {
    //change the day shown. Loop below goes through each of the 3 chars in turn e.g. "MON"
    for (byte day_char = 0; day_char &amp;lt;=2 ; day_char++){
      //run the anim sequence for each char
      for (byte seq = 0; seq &amp;lt;=8 ; seq++){
        //the day (0 - 6) Read this number into the days char array. the seconds number in the array 0-2 gets the 3 chars of the day name, e.g. m o n
        slideanim(6*day_char,8,seq,old_chars[day_char],days[rtc[3]][day_char]); //6 x day_char gives us the x pos for the char
        delay(SLIDE_DELAY);
      }
      //save the old day chars into the old_chars array at array pos 0-2. We use this next time we change the day and feed it to the animation as the current char. The updated char is fed in as the new char.
      old_chars[day_char] = days[rtc[3]][day_char];
    }

    //change the date tens digit (if needed) and ones digit. (the date ones digit wil alwaus change, but putting this in the 'if' loop makes it a bit neater code wise.)
    for (byte i = 7; i &amp;gt;= 6; i--){
      if (digits_old[i] != digits_new[i]) {
        for (byte seq = 0; seq &amp;lt;=8 ; seq++){
          itoa(digits_old[i],old_char,10);
          itoa(digits_new[i],new_char,10);
          slideanim(digits_x_pos[i],8,seq,old_char[0],new_char[0]);
          delay(SLIDE_DELAY);
        }
      }
    }

    //print the day suffix "nd" "rd" "th" etc. First work out date 2 letter suffix - eg st, nd, rd, th
    byte s = 3; //the pos to read our suffix array from.
    byte date = rtc[4];
    if(date == 1 || date == 21 || date == 31) {
      s = 0;
    }
    else if (date == 2 || date == 22) {
      s = 1;
    }
    else if (date == 3 || date == 23) {
      s = 2;
    }

    for (byte suffix_char = 0; suffix_char &amp;lt;=1 ; suffix_char++){
      for (byte seq = 0; seq &amp;lt;=8 ; seq++){
        slideanim((suffix_char*6)+36,8,seq,old_chars[suffix_char+3],suffix[s][suffix_char]); // we pass in the old_char array char as the current char and the suffix array as the new char
        delay(SLIDE_DELAY);
      }
      //save the suffic char in the old chars array at array pos 3 and 5.  We use these chars next time we change the suffix and feed it to the animation as the current char. The updated char is fed in as the new char.
      old_chars[suffix_char+3] = suffix[s][suffix_char];
    }
  }//end do date line
  */


  //save digita array tol old for comparison next loop
  for (byte i = 0; i &amp;lt;= 3; i++) {
    digits_old[i] =  digits_new[i];
  }
}//secs/oldsecs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}//while loop&lt;br&gt;
  fade_down();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//called by slide&lt;br&gt;
//this draws the animation of one char sliding on and the other sliding off. There are 8 steps in the animation, we call the function to draw one of the steps from 0-7&lt;br&gt;
//inputs are are char x and y, animation frame sequence (0-7) and the current and new chars being drawn.&lt;br&gt;
void slideanim(byte x, byte y, byte sequence, char current_c, char new_c) {&lt;/p&gt;

&lt;p&gt;//  To slide one char off and another on we need 9 steps or frames in sequence...&lt;/p&gt;

&lt;p&gt;//  seq# 0123456 &amp;lt;-rows of the display&lt;br&gt;
  //   |   |||||||&lt;br&gt;
  //  seq0 0123456  START - all rows of the display 0-6 show the current characters rows 0-6&lt;br&gt;
  //  seq1  012345  current char moves down one row on the display. We only see it's rows 0-5. There are at display positions 1-6 There is a blank row inserted at the top&lt;br&gt;
  //  seq2 6 01234  current char moves down 2 rows. we now only see rows 0-4 at display rows 2-6 on the display. Row 1 of the display is blank. Row 0 shows row 6 of the new char&lt;br&gt;
  //  seq3 56 0123&lt;br&gt;
  //  seq4 456 012  half old / half new char&lt;br&gt;
  //  seq5 3456 01&lt;br&gt;
  //  seq6 23456 0&lt;br&gt;
  //  seq7 123456&lt;br&gt;
  //  seq8 0123456  END - all rows show the new char&lt;/p&gt;

&lt;p&gt;//from above we can see...&lt;br&gt;
  //currentchar runs 0-6 then 0-5 then 0-4 all the way to 0. starting Y position increases by 1 row each time.&lt;br&gt;
  //new char runs 6 then 5-6 then 4-6 then 3-6. starting Y position increases by 1 row each time.&lt;/p&gt;

&lt;p&gt;//if sequence number is below 7, we need to draw the current char&lt;br&gt;
  if (sequence &amp;lt; 7) {&lt;br&gt;
    byte dots;&lt;br&gt;
    // if (current_c &amp;gt;= 'A' &amp;amp;&amp;amp;  || (current_c &amp;gt;= 'a' &amp;amp;&amp;amp; current_c &amp;lt;= 'z') ) {&lt;br&gt;
    //   current_c &amp;amp;= 0x1F;   // A-Z maps to 1-26&lt;br&gt;
    // }&lt;br&gt;
    if (current_c &amp;gt;= 'A' &amp;amp;&amp;amp; current_c &amp;lt;= 'Z' ) {&lt;br&gt;
      current_c &amp;amp;= 0x1F;   // A-Z maps to 1-26&lt;br&gt;
    }&lt;br&gt;
    else if (current_c &amp;gt;= 'a' &amp;amp;&amp;amp; current_c &amp;lt;= 'z') {&lt;br&gt;
      current_c = (current_c - 'a') + 41;   // A-Z maps to 41-67&lt;br&gt;
    }&lt;br&gt;
    else if (current_c &amp;gt;= '0' &amp;amp;&amp;amp; current_c &amp;lt;= '9') {&lt;br&gt;
      current_c = (current_c - '0') + 31;&lt;br&gt;
    }&lt;br&gt;
    else if (current_c == ' ') {&lt;br&gt;
      current_c = 0; // space&lt;br&gt;
    }&lt;br&gt;
    else if (current_c == '.') {&lt;br&gt;
      current_c = 27; // full stop&lt;br&gt;
    }&lt;br&gt;
    else if (current_c == '\'') {&lt;br&gt;
      current_c = 28; // single quote mark&lt;br&gt;
    }&lt;br&gt;
    else if (current_c == ':') {&lt;br&gt;
      current_c = 29; //colon&lt;br&gt;
    }&lt;br&gt;
    else if (current_c == '&amp;gt;') {&lt;br&gt;
      current_c = 30; // clock_mode selector arrow&lt;br&gt;
    }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;byte curr_char_row_max = 7 - sequence; //the maximum number of rows to draw is 6 - sequence number
byte start_y = sequence; //y position to start at - is same as sequence number. We inc this each loop

//plot each row up to row maximum (calculated from sequence number)
for (byte curr_char_row = 0; curr_char_row &amp;lt;= curr_char_row_max; curr_char_row++) {
  for (byte col = 0; col &amp;lt; 5; col++) {
    dots = pgm_read_byte_near(&amp;amp;myfont[current_c][col]);
    if (dots &amp;amp; (64 &amp;gt;&amp;gt; curr_char_row))
      plot(x + col, y + start_y, 1); //plot led on
    else
      plot(x + col, y + start_y, 0); //else plot led off
  }
  start_y++;//add one to y so we draw next row one down
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;//draw a blank line between the characters if sequence is between 1 and 7. If we don't do this we get the remnants of the current chars last position left on the display&lt;br&gt;
  if (sequence &amp;gt;= 1 &amp;amp;&amp;amp; sequence &amp;lt;= 8) {&lt;br&gt;
    for (byte col = 0; col &amp;lt; 5; col++) {&lt;br&gt;
      plot(x + col, y + (sequence - 1), 0); //the y position to draw the line is equivalent to the sequence number - 1&lt;br&gt;
    }&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;//if sequence is above 2, we also need to start drawing the new char&lt;br&gt;
  if (sequence &amp;gt;= 2) {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//work out char
byte dots;
//if (new_c &amp;gt;= 'A' &amp;amp;&amp;amp; new_c &amp;lt;= 'Z' || (new_c &amp;gt;= 'a' &amp;amp;&amp;amp; new_c &amp;lt;= 'z') ) {
//  new_c &amp;amp;= 0x1F;   // A-Z maps to 1-26
//}
if (new_c &amp;gt;= 'A' &amp;amp;&amp;amp; new_c &amp;lt;= 'Z' ) {
  new_c &amp;amp;= 0x1F;   // A-Z maps to 1-26
}
else if (new_c &amp;gt;= 'a' &amp;amp;&amp;amp; new_c &amp;lt;= 'z') {
  new_c = (new_c - 'a') + 41;   // A-Z maps to 41-67
}
else if (new_c &amp;gt;= '0' &amp;amp;&amp;amp; new_c &amp;lt;= '9') {
  new_c = (new_c - '0') + 31;
}
else if (new_c == ' ') {
  new_c = 0; // space
}
else if (new_c == '.') {
  new_c = 27; // full stop
}
else if (new_c == '\'') {
  new_c = 28; // single quote mark
}
else if (new_c == ':') {
  new_c = 29; // clock_mode selector arrow
}
else if (new_c == '&amp;gt;') {
  new_c = 30; // clock_mode selector arrow
}

byte newcharrowmin = 6 - (sequence - 2); //minimumm row num to draw for new char - this generates an output of 6 to 0 when fed sequence numbers 2-8. This is the minimum row to draw for the new char
byte start_y = 0; //y position to start at - is same as sequence number. we inc it each row

//plot each row up from row minimum (calculated by sequence number) up to 6
for (byte newcharrow = newcharrowmin; newcharrow &amp;lt;= 6; newcharrow++) {
  for (byte col = 0; col &amp;lt; 5; col++) {
    dots = pgm_read_byte_near(&amp;amp;myfont[new_c][col]);
    if (dots &amp;amp; (64 &amp;gt;&amp;gt; newcharrow))
      plot(x + col, y + start_y, 1); //plot led on
    else
      plot(x + col, y + start_y, 0); //else plot led off
  }
  start_y++;//add one to y so we draw next row one down
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//print a clock using words rather than numbers&lt;br&gt;
void word_clock() {&lt;/p&gt;

&lt;p&gt;cls();&lt;/p&gt;

&lt;p&gt;char numbers[19][10]   = {&lt;br&gt;
    "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten",&lt;br&gt;
    "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"&lt;br&gt;
  };&lt;br&gt;
  char numberstens[5][7] = {&lt;br&gt;
    "ten", "twenty", "thirty", "forty", "fifty"&lt;br&gt;
  };&lt;/p&gt;

&lt;p&gt;//potentially 3 lines to display&lt;br&gt;
  char str_a[8];&lt;br&gt;
  char str_b[8];&lt;br&gt;
  char str_c[8];&lt;/p&gt;

&lt;p&gt;//byte hours_y, mins_y; //hours and mins and positions for hours and mins lines&lt;/p&gt;

&lt;p&gt;byte hours = rtc[2];&lt;br&gt;
  if (hours &amp;gt; 12) {&lt;br&gt;
    hours = hours - ampm * 12;&lt;br&gt;
  }&lt;br&gt;
  if (hours &amp;lt; 1) {&lt;br&gt;
    hours = hours + ampm * 12;&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;get_time(); //get the time from the clock chip&lt;br&gt;
  byte old_mins = 100; //store mins in old_mins. We compare mins and old mins &amp;amp; when they are different we redraw the display. Set this to 100 initially so display is drawn when mode starts.&lt;br&gt;
  byte mins;&lt;/p&gt;

&lt;p&gt;//run clock main loop as long as run_mode returns true&lt;br&gt;
  while (run_mode()) {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//check for button press
if (buttonA.uniquePress()) {
  switch_mode();
  return;
}
if (buttonB.uniquePress()) {
  display_date();
}

get_time(); //get the time from the clock chip
mins = rtc[1];  //get mins


//if mins is different from old_mins - redraw display
if (mins != old_mins) {

  //update old_mins with current mins value
  old_mins = mins;

  //reset these for comparison next time
  mins = rtc[1];
  hours = rtc[2];

  //make hours into 12 hour format
  if (hours &amp;gt; 12) {
    hours = hours - 12;
  }
  if (hours == 0) {
    hours = 12;
  }

  //split mins value up into two separate digits
  int minsdigit = rtc[1] % 10;
  byte minsdigitten = (rtc[1] / 10) % 10;

  //if mins &amp;lt;= 10 , then top line has to read "minsdigti past" and bottom line reads hours
  if (mins &amp;lt; 10) {
    strcpy (str_a, numbers[minsdigit - 1]);
    strcpy (str_b, "PAST");
    strcpy (str_c, numbers[hours - 1]);
  }

  //if mins = 10, cant use minsdigit as above, so soecial case to print 10 past /n hour.
  if (mins == 10) {
    strcpy (str_a, numbers[9]);
    strcpy (str_b, " PAST");
    strcpy (str_c, numbers[hours - 1]);
  }

  //if time is not on the hour - i.e. both mins digits are not zero,
  //then make first line read "hours" and 2 &amp;amp; 3rd lines read "minstens"  "mins" e.g. "three /n twenty /n one"
  else if (minsdigitten != 0 &amp;amp;&amp;amp; minsdigit != 0  ) {

    strcpy (str_a, numbers[hours - 1]);

    //if mins is in the teens, use teens from the numbers array for the 2nd line, e.g. "fifteen"
    //if (mins &amp;gt;= 11 &amp;amp;&amp;amp; mins &amp;lt;= 19) {
    if (mins &amp;lt;= 19) {
      strcpy (str_b, numbers[mins - 1]);
    }
    else {
      strcpy (str_b, numberstens[minsdigitten - 1]);

      strcpy (str_c, numbers[minsdigit - 1]);
    }
  }
  // if mins digit is zero, don't print it. read read "hours" "minstens" e.g. "three /n twenty"
  else if (minsdigitten != 0 &amp;amp;&amp;amp; minsdigit == 0  ) {
    strcpy (str_a, numbers[hours - 1]);
    strcpy (str_b, numberstens[minsdigitten - 1]);
    strcpy (str_c, "");
  }

  //if both mins are zero, i.e. it is on the hour, the top line reads "hours" and bottom line reads "o'clock"
  else if (minsdigitten == 0 &amp;amp;&amp;amp; minsdigit == 0  ) {
    strcpy (str_a, numbers[hours - 1]);
    strcpy (str_b, "O'CLOCK");
    strcpy (str_c, "");
  }

}//end worknig out time

//run in a loop
//print line a "twelve"
byte len = 0;
while (str_a[len]) {
  len++;
}; //get length of message
byte offset_top = (31 - ((len - 1) * 4)) / 2; //

//plot hours line
byte i = 0;
while (str_a[i]) {
  puttinychar((i * 4) + offset_top, 1, str_a[i]);
  i++;
}

//hold display but check for button presses
int counter = 1000;
while (counter &amp;gt; 0){
  //check for button press
  if (buttonA.uniquePress()) {
    switch_mode();
    return;
  }
  if (buttonB.uniquePress()) {
    display_date();
  }
delay(1);
counter--;
}
fade_down();

//print line b
len = 0;
while (str_b[len]) {
  len++;
}; //get length of message
offset_top = (31 - ((len - 1) * 4)) / 2; 

i = 0;
while (str_b[i]) {
  puttinychar((i * 4) + offset_top, 1, str_b[i]);
  i++;
}

//hold display but check for button presses
counter = 1000;
while (counter &amp;gt; 0){
  if (buttonA.uniquePress()) {
    switch_mode();
    return;
  }
  if (buttonB.uniquePress()) {
    display_date();
  }
  delay(1);
  counter--;
}
fade_down();

//print line c if there.
len = 0;
while (str_c[len]) {
  len++;
}; //get length of message
offset_top = (31 - ((len - 1) * 4)) / 2; 

i = 0;
while (str_c[i]) {
  puttinychar((i * 4) + offset_top, 1, str_c[i]);
  i++;
}
counter = 1000;
while (counter &amp;gt; 0){
  //check for button press
  if (buttonA.uniquePress()) {
    switch_mode();
    return;
  }
  if (buttonB.uniquePress()) {
    display_date();
  }  
  delay(1);
  counter--;
}
fade_down();


//hold display blank but check for button presses before starting again.
counter = 1000;
while (counter &amp;gt; 0){
   //check for button press
  if (buttonA.uniquePress()) {
    switch_mode();
    return;
  }
  if (buttonB.uniquePress()) {
    display_date();
  }  
  delay(1);
  counter--;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  fade_down();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;/// scroll message - not used at present - too slow.&lt;br&gt;
void scroll() {&lt;/p&gt;

&lt;p&gt;char message[] = {"Hello There "};&lt;/p&gt;

&lt;p&gt;cls();&lt;br&gt;
  byte p = 6;      //current pos in string&lt;br&gt;
  byte chara[] = {0, 1, 2, 3, 4, 5}; //chars from string&lt;br&gt;
  int x[] = {0, 6, 12, 18, 24, 30}; //xpos for each char&lt;br&gt;
  byte y = 0;                   //y pos&lt;/p&gt;

&lt;p&gt;// clear_buffer();&lt;/p&gt;

&lt;p&gt;while (message[p] != '\0') {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//draw all 6 chars
for (byte c = 0; c &amp;lt; 6; c++) {

  putnormalchar(x[c],y,message[ chara[c] ]);


  //draw a line of pixels turned off after each char,otherwise the gaps between the chars have pixels left in them from the previous char
  for (byte yy = 0 ; yy &amp;lt; 8; yy ++) {
    plot(x[c] + 5, yy, 0);
  }

  //take one off each chars position
  x[c] = x[c] - 1;
}

//reset a char if it's gone off screen
for (byte i = 0; i &amp;lt;= 5; i++) {
  if (x[i] &amp;lt; -5 ) {
    x[i] = 31;
    chara[i] = p;
    p++;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//display_date - print the day of week, date and month with a flashing cursor effect&lt;br&gt;
void display_date()&lt;br&gt;
{&lt;/p&gt;

&lt;p&gt;cls();&lt;br&gt;
  //read the date from the DS1307&lt;/p&gt;

&lt;p&gt;byte dow = rtc[3]; // day of week 0 = Sunday&lt;br&gt;
  byte date = rtc[4];&lt;br&gt;
  byte month = rtc[5] - 1;&lt;/p&gt;

&lt;p&gt;//array of month names to print on the display. Some are shortened as we only have 8 characters across to play with&lt;br&gt;
  char monthnames[12][9] = {&lt;br&gt;
    "January", "February", "March", "April", "May", "June", "July", "August", "Sept", "October", "November", "December"&lt;br&gt;
  };&lt;/p&gt;

&lt;p&gt;//print the day name&lt;/p&gt;

&lt;p&gt;//get length of text in pixels, that way we can centre it on the display by divindin the remaining pixels b2 and using that as an offset&lt;br&gt;
  byte len = 0;&lt;br&gt;
  while(daysfull[dow][len]) { &lt;br&gt;
    len++; &lt;br&gt;
  }; &lt;br&gt;
  byte offset = (31 - ((len-1)*4)) / 2; //our offset to centre up the text&lt;/p&gt;

&lt;p&gt;//print the name&lt;br&gt;&lt;br&gt;
  int i = 0;&lt;br&gt;
  while(daysfull[dow][i])&lt;br&gt;
  {&lt;br&gt;
    puttinychar((i*4) + offset , 1, daysfull[dow][i]); &lt;br&gt;
    i++;&lt;br&gt;
  }&lt;br&gt;
  delay(1000);&lt;br&gt;
  fade_down();&lt;br&gt;
  cls();&lt;/p&gt;

&lt;p&gt;// print date numerals&lt;br&gt;
  char buffer[3];&lt;br&gt;
  itoa(date,buffer,10);&lt;br&gt;
  offset = 10; //offset to centre text if 3 chars - e.g. 3rd&lt;/p&gt;

&lt;p&gt;// first work out date 2 letter suffix - eg st, nd, rd, th etc&lt;br&gt;
  // char suffix[4][3]={"st", "nd", "rd", "th"  }; is defined at top of code&lt;br&gt;
  byte s = 3; &lt;br&gt;
  if(date == 1 || date == 21 || date == 31) {&lt;br&gt;
    s = 0;&lt;br&gt;
  } &lt;br&gt;
  else if (date == 2 || date == 22) {&lt;br&gt;
    s = 1;&lt;br&gt;
  } &lt;br&gt;
  else if (date == 3 || date == 23) {&lt;br&gt;
    s = 2;&lt;br&gt;
  } &lt;/p&gt;

&lt;p&gt;//print the 1st date number&lt;br&gt;
  puttinychar(0+offset, 1, buffer[0]);&lt;/p&gt;

&lt;p&gt;//if date is under 10 - then we only have 1 digit so set positions of sufix etc one character nearer&lt;br&gt;
  byte suffixposx = 4;&lt;/p&gt;

&lt;p&gt;//if date over 9 then print second number and set xpos of suffix to be 1 char further away&lt;br&gt;
  if (date &amp;gt; 9){&lt;br&gt;
    suffixposx = 8;&lt;br&gt;
    puttinychar(4+offset, 1, buffer[1]);&lt;br&gt;
    offset = 8; //offset to centre text if 4 chars&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;//print the 2 suffix characters&lt;br&gt;
  puttinychar(suffixposx+offset, 1, suffix[s][0]); &lt;br&gt;
  puttinychar(suffixposx+4+offset, 1, suffix[s][1]); &lt;/p&gt;

&lt;p&gt;delay(1000);&lt;br&gt;
  fade_down();&lt;/p&gt;

&lt;p&gt;//print the month name &lt;/p&gt;

&lt;p&gt;//get length of text in pixels, that way we can centre it on the display by divindin the remaining pixels b2 and using that as an offset&lt;br&gt;
  len = 0;&lt;br&gt;
  while(monthnames[month][len]) { &lt;br&gt;
    len++; &lt;br&gt;
  }; &lt;br&gt;
  offset = (31 - ((len-1)*4)) / 2; //our offset to centre up the text&lt;br&gt;
  i = 0;&lt;br&gt;
  while(monthnames[month][i])&lt;br&gt;
  {&lt;br&gt;&lt;br&gt;
    puttinychar((i*4) +offset, 1, monthnames[month][i]); &lt;br&gt;
    i++; &lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;delay(1000);&lt;br&gt;
  fade_down();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//dislpay menu to change the clock mode&lt;br&gt;
void switch_mode() {&lt;/p&gt;

&lt;p&gt;//remember mode we are in. We use this value if we go into settings mode, so we can change back from settings mode (6) to whatever mode we were in.&lt;br&gt;
  old_mode = clock_mode;&lt;/p&gt;

&lt;p&gt;char* modes[] = {&lt;br&gt;
    "Basic", "Small", "Slide", "Words", "Setup"&lt;br&gt;
  };&lt;/p&gt;

&lt;p&gt;byte next_clock_mode;&lt;br&gt;
  byte firstrun = 1;&lt;/p&gt;

&lt;p&gt;//loop waiting for button (timeout after 35 loops to return to mode X)&lt;br&gt;
  for (int count = 0; count &amp;lt; 35 ; count++) {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//if user hits button, change the clock_mode
if (buttonA.uniquePress() || firstrun == 1) {

  count = 0;
  cls();

  if (firstrun == 0) {
    clock_mode++;
  }
  if (clock_mode &amp;gt; NUM_DISPLAY_MODES + 1 ) {
    clock_mode = 0;
  }

  //print arrown and current clock_mode name on line one and print next clock_mode name on line two
  char str_top[9];

  //strcpy (str_top, "-");
  strcpy (str_top, modes[clock_mode]);

  next_clock_mode = clock_mode + 1;
  if (next_clock_mode &amp;gt;  NUM_DISPLAY_MODES + 1 ) {
    next_clock_mode = 0;
  }

  byte i = 0;
  while (str_top[i]) {
    putnormalchar(i * 6, 0, str_top[i]);
    i++;
  }
  firstrun = 0;
}
delay(50);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//run clock main loop as long as run_mode returns true&lt;br&gt;
byte run_mode() {&lt;/p&gt;

&lt;p&gt;//if random mode is on... check the hour when we change mode.&lt;br&gt;
  if (random_mode) {&lt;br&gt;
    //if hour value in change mode time = hours. then reurn false = i.e. exit mode.&lt;br&gt;
    if (change_mode_time == rtc[2]) {&lt;br&gt;
      //set the next random clock mode and time to change it&lt;br&gt;
      set_next_random();&lt;br&gt;
      //exit the current mode.&lt;br&gt;
      return 0;&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
  //else return 1 - keep running in this mode&lt;br&gt;
  return 1;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//set the next hour the clock will change mode when random mode is on&lt;br&gt;
void set_next_random() {&lt;/p&gt;

&lt;p&gt;//set the next hour the clock mode will change - current time plus 1 - 4 hours&lt;br&gt;
  get_time();&lt;br&gt;
  change_mode_time = rtc[2] + random (1, 5);&lt;/p&gt;

&lt;p&gt;//if change_mode_time now happens to be over 23, then set it to between 1 and 3am&lt;br&gt;
  if (change_mode_time &amp;gt; 23) {&lt;br&gt;
    change_mode_time = random (1, 4);&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;//set the new clock mode&lt;br&gt;
  clock_mode = random(0, NUM_DISPLAY_MODES + 1);  //pick new random clock mode&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//dislpay menu to change the clock settings&lt;br&gt;
void setup_menu() {&lt;/p&gt;

&lt;p&gt;char* set_modes[] = {&lt;br&gt;
     "Rndom", "24 Hr","Set", "Brght", "Exit"}; &lt;br&gt;
  if (ampm == 0) { &lt;br&gt;
    set_modes[1] = ("12 Hr"); &lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;byte setting_mode = 0;&lt;br&gt;
  byte next_setting_mode;&lt;br&gt;
  byte firstrun = 1;&lt;/p&gt;

&lt;p&gt;//loop waiting for button (timeout after 35 loops to return to mode X)&lt;br&gt;
  for(int count=0; count &amp;lt; 35 ; count++) {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//if user hits button, change the clock_mode
if(buttonA.uniquePress() || firstrun == 1){

  count = 0;
  cls();

  if (firstrun == 0) { 
    setting_mode++; 
  } 
  if (setting_mode &amp;gt; NUM_SETTINGS_MODES) { 
    setting_mode = 0; 
  }

  //print arrown and current clock_mode name on line one and print next clock_mode name on line two
  char str_top[9];

  strcpy (str_top, set_modes[setting_mode]);

  next_setting_mode = setting_mode + 1;
  if (next_setting_mode &amp;gt; NUM_SETTINGS_MODES) { 
    next_setting_mode = 0; 
  }

  byte i = 0;
  while(str_top[i]) {
    putnormalchar(i*6, 0, str_top[i]); 
    i++;
  }

  firstrun = 0;
}
delay(50); 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;//pick the mode &lt;br&gt;
  switch(setting_mode){&lt;br&gt;
    case 0: &lt;br&gt;
      set_random(); &lt;br&gt;
      break;&lt;br&gt;
    case 1: &lt;br&gt;
       set_ampm(); &lt;br&gt;
      break;&lt;br&gt;
    case 2: &lt;br&gt;
      set_time(); &lt;br&gt;
      break;&lt;br&gt;
    case 3: &lt;br&gt;
       set_intensity(); &lt;br&gt;
      break;&lt;br&gt;
    case 4: &lt;br&gt;
      //exit menu&lt;br&gt;
      break;&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;//change the clock from mode 6 (settings) back to the one it was in before &lt;br&gt;
  clock_mode=old_mode;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//toggle random mode - pick a different clock mode every few hours&lt;br&gt;
void set_random(){&lt;br&gt;
  cls();&lt;/p&gt;

&lt;p&gt;char text_a[9] = "Off";&lt;br&gt;
  char text_b[9] = "On";&lt;br&gt;
  byte i = 0;&lt;/p&gt;

&lt;p&gt;//if random mode is on, turn it off&lt;br&gt;
  if (random_mode){&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//turn random mode off
random_mode = 0;

//print a message on the display
while(text_a[i]) {
  putnormalchar((i*6), 0, text_a[i]);
  i++;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;} else {&lt;br&gt;
    //turn randome mode on. &lt;br&gt;
    random_mode = 1;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//set hour mode will change
set_next_random();

//print a message on the display
while(text_b[i]) {
  putnormalchar((i*6), 0, text_b[i]);
  i++;
}  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;} &lt;br&gt;
  delay(1500); //leave the message up for a second or so&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//set 12 or 24 hour clock&lt;br&gt;
void set_ampm() {&lt;/p&gt;

&lt;p&gt;// AM/PM or 24 hour clock mode - flip the bit (makes 0 into 1, or 1 into 0 for ampm mode)&lt;br&gt;
  ampm = (ampm ^ 1);&lt;br&gt;
  cls();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//change screen intensityintensity&lt;br&gt;
void set_intensity() {&lt;/p&gt;

&lt;p&gt;cls();&lt;/p&gt;

&lt;p&gt;byte i = 0;&lt;br&gt;
  char text[7] = "Bright";&lt;br&gt;
  while(text[i]) {&lt;br&gt;
    puttinychar((i*4)+4, 0, text[i]);&lt;br&gt;
    i++;&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;//wait for button input&lt;br&gt;
  while (!buttonA.uniquePress()) {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;levelbar (0,6,(intensity*2)+2,2);    //display the intensity level as a bar
while (buttonB.isPressed()) {

  if(intensity == 15) { 
    intensity = 0;
    cls (); 
  } 
  else {
    intensity++; 
  }
  //print the new value 
  i = 0;
  while(text[i]) {
    puttinychar((i*4)+4, 0, text[i]);
    i++;
  }

  //display the intensity level as a bar
  levelbar (0,6,(intensity*2)+2,2);    

  //change the brightness setting on the displays
  for (byte address = 0; address &amp;lt; 4; address++) {
    lc.setIntensity(address, intensity);
  }
  delay(150);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// display a horizontal bar on the screen at offset xposr by ypos with height and width of xbar, ybar&lt;br&gt;
void levelbar (byte xpos, byte ypos, byte xbar, byte ybar) {&lt;br&gt;
  for (byte x = 0; x &amp;lt; xbar; x++) {&lt;br&gt;
    for (byte y = 0; y &amp;lt;= ybar; y++) {&lt;br&gt;
      plot(x+xpos, y+ypos, 1);&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//set time and date routine&lt;br&gt;
void set_time() {&lt;/p&gt;

&lt;p&gt;cls();&lt;/p&gt;

&lt;p&gt;//fill settings with current clock values read from clock&lt;br&gt;
  get_time();&lt;br&gt;
  byte set_min   = rtc[1];&lt;br&gt;
  byte set_hr    = rtc[2];&lt;br&gt;
  byte set_date  = rtc[4];&lt;br&gt;
  byte set_mnth  = rtc[5];&lt;br&gt;
  int  set_yr    = rtc[6]; &lt;/p&gt;

&lt;p&gt;//Set function - we pass in: which 'set' message to show at top, current value, reset value, and rollover limit.&lt;br&gt;
  set_date = set_value(2, set_date, 1, 31);&lt;br&gt;
  set_mnth = set_value(3, set_mnth, 1, 12);&lt;br&gt;
  set_yr   = set_value(4, set_yr, 2013, 2099);&lt;br&gt;
  set_hr   = set_value(1, set_hr, 0, 23);&lt;br&gt;
  set_min  = set_value(0, set_min, 0, 59);&lt;/p&gt;

&lt;p&gt;ds1307.adjust(DateTime(set_yr, set_mnth, set_date, set_hr, set_min));&lt;/p&gt;

&lt;p&gt;cls();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//used to set min, hr, date, month, year values. pass &lt;br&gt;
//message = which 'set' message to print, &lt;br&gt;
//current value = current value of property we are setting&lt;br&gt;
//reset_value = what to reset value to if to rolls over. E.g. mins roll from 60 to 0, months from 12 to 1&lt;br&gt;
//rollover limit = when value rolls over&lt;br&gt;
int set_value(byte message, int current_value, int reset_value, int rollover_limit){&lt;/p&gt;

&lt;p&gt;cls();&lt;br&gt;
  char messages[6][17]   = {&lt;br&gt;
    "Set Mins", "Set Hour", "Set Day", "Set Mnth", "Set Year"};&lt;/p&gt;

&lt;p&gt;//Print "set xyz" top line&lt;br&gt;
  byte i = 0;&lt;br&gt;
  while(messages[message][i])&lt;br&gt;
  {&lt;br&gt;
    puttinychar(i*4 , 1, messages[message][i]); &lt;br&gt;
    i++;&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;delay(2000);&lt;br&gt;
  cls();&lt;/p&gt;

&lt;p&gt;//print digits bottom line&lt;br&gt;
  char buffer[5] = "    ";&lt;br&gt;
  itoa(current_value,buffer,10);&lt;br&gt;
  puttinychar(0 , 1, buffer[0]); &lt;br&gt;
  puttinychar(4 , 1, buffer[1]); &lt;br&gt;
  puttinychar(8 , 1, buffer[2]); &lt;br&gt;
  puttinychar(12, 1, buffer[3]); &lt;/p&gt;

&lt;p&gt;delay(300);&lt;br&gt;
  //wait for button input&lt;br&gt;
  while (!buttonA.uniquePress()) {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;while (buttonB.isPressed()){

  if(current_value &amp;lt; rollover_limit) { 
    current_value++;
  } 
  else {
    current_value = reset_value;
  }
  //print the new value
  itoa(current_value, buffer ,10);
  puttinychar(0 , 1, buffer[0]); 
  puttinychar(4 , 1, buffer[1]); 
  puttinychar(8 , 1, buffer[2]); 
  puttinychar(12, 1, buffer[3]);    
  delay(150);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  return current_value;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void get_time()&lt;br&gt;
{&lt;br&gt;
  //get time&lt;br&gt;
  DateTime now = ds1307.now();&lt;br&gt;
  //save time to array&lt;br&gt;
  rtc[6] = now.year();&lt;br&gt;
  rtc[5] = now.month();&lt;br&gt;
  rtc[4] = now.day();&lt;br&gt;
  rtc[3] = now.dayOfTheWeek(); //returns 0-6 where 0 = Sunday&lt;br&gt;
  rtc[2] = now.hour();&lt;br&gt;
  rtc[1] = now.minute();&lt;br&gt;
  rtc[0] = now.second();&lt;/p&gt;

&lt;p&gt;//flash arduino led on pin 13 every second&lt;br&gt;
  //if ( (rtc[0] % 2) == 0) {&lt;br&gt;
  //  digitalWrite(13, HIGH);&lt;br&gt;
  //}&lt;br&gt;
  //else {&lt;br&gt;
  //  digitalWrite(13, LOW);&lt;br&gt;
  //}&lt;/p&gt;

&lt;p&gt;//print the time to the serial port - useful for debuging RTC issues&lt;br&gt;
  /*&lt;br&gt;
  Serial.print(rtc[2]);&lt;br&gt;
  Serial.print(":");&lt;br&gt;
  Serial.print(rtc[1]);&lt;br&gt;
  Serial.print(":");&lt;br&gt;
  Serial.println(rtc[0]);&lt;br&gt;
  */&lt;br&gt;
}&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>css</category>
      <category>news</category>
    </item>
    <item>
      <title>mini computer with hologram function</title>
      <dc:creator>jay jordan</dc:creator>
      <pubDate>Mon, 25 Dec 2023 15:51:27 +0000</pubDate>
      <link>https://dev.to/jayjo87/mini-computer-with-hologram-function-2bpg</link>
      <guid>https://dev.to/jayjo87/mini-computer-with-hologram-function-2bpg</guid>
      <description>&lt;h1&gt;
  
  
  Copyright (c) 2017 Adafruit Industries
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Author: Tony DiCola &amp;amp; James DeVito
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
&lt;/h1&gt;

&lt;h1&gt;
  
  
  of this software and associated documentation files (the "Software"), to deal
&lt;/h1&gt;

&lt;h1&gt;
  
  
  in the Software without restriction, including without limitation the rights
&lt;/h1&gt;

&lt;h1&gt;
  
  
  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
&lt;/h1&gt;

&lt;h1&gt;
  
  
  copies of the Software, and to permit persons to whom the Software is
&lt;/h1&gt;

&lt;h1&gt;
  
  
  furnished to do so, subject to the following conditions:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  The above copyright notice and this permission notice shall be included in
&lt;/h1&gt;

&lt;h1&gt;
  
  
  all copies or substantial portions of the Software.
&lt;/h1&gt;

&lt;h1&gt;
  
  
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
&lt;/h1&gt;

&lt;h1&gt;
  
  
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
&lt;/h1&gt;

&lt;h1&gt;
  
  
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
&lt;/h1&gt;

&lt;h1&gt;
  
  
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
&lt;/h1&gt;

&lt;h1&gt;
  
  
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
&lt;/h1&gt;

&lt;h1&gt;
  
  
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
&lt;/h1&gt;

&lt;h1&gt;
  
  
  THE SOFTWARE.
&lt;/h1&gt;

&lt;p&gt;import time&lt;/p&gt;

&lt;p&gt;import Adafruit_GPIO.SPI as SPI&lt;br&gt;
import Adafruit_SSD1306&lt;/p&gt;

&lt;p&gt;from PIL import Image&lt;br&gt;
from PIL import ImageDraw&lt;br&gt;
from PIL import ImageFont&lt;/p&gt;

&lt;p&gt;import subprocess&lt;/p&gt;

&lt;h1&gt;
  
  
  Raspberry Pi pin configuration:
&lt;/h1&gt;

&lt;p&gt;RST = None     # on the PiOLED this pin isnt used&lt;/p&gt;

&lt;h1&gt;
  
  
  Note the following are only used with SPI:
&lt;/h1&gt;

&lt;p&gt;DC = 23&lt;br&gt;
SPI_PORT = 0&lt;br&gt;
SPI_DEVICE = 0&lt;/p&gt;

&lt;h1&gt;
  
  
  Beaglebone Black pin configuration:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  RST = 'P9_12'
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Note the following are only used with SPI:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  DC = 'P9_15'
&lt;/h1&gt;

&lt;h1&gt;
  
  
  SPI_PORT = 1
&lt;/h1&gt;

&lt;h1&gt;
  
  
  SPI_DEVICE = 0
&lt;/h1&gt;

&lt;h1&gt;
  
  
  128x32 display with hardware I2C:
&lt;/h1&gt;

&lt;p&gt;disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST)&lt;/p&gt;

&lt;h1&gt;
  
  
  128x64 display with hardware I2C:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Note you can change the I2C address by passing an i2c_address parameter like:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, i2c_address=0x3C)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Alternatively you can specify an explicit I2C bus number, for example
&lt;/h1&gt;

&lt;h1&gt;
  
  
  with the 128x32 display you would use:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, i2c_bus=2)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  128x32 display with hardware SPI:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, dc=DC, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=8000000))
&lt;/h1&gt;

&lt;h1&gt;
  
  
  128x64 display with hardware SPI:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, dc=DC, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=8000000))
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Alternatively you can specify a software SPI implementation by providing
&lt;/h1&gt;

&lt;h1&gt;
  
  
  digital GPIO pin numbers for all the required display pins.  For example
&lt;/h1&gt;

&lt;h1&gt;
  
  
  on a Raspberry Pi with the 128x32 display you might use:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, dc=DC, sclk=18, din=25, cs=22)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Initialize library.
&lt;/h1&gt;

&lt;p&gt;disp.begin()&lt;/p&gt;

&lt;h1&gt;
  
  
  Clear display.
&lt;/h1&gt;

&lt;p&gt;disp.clear()&lt;br&gt;
disp.display()&lt;/p&gt;

&lt;h1&gt;
  
  
  Create blank image for drawing.
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Make sure to create image with mode '1' for 1-bit color.
&lt;/h1&gt;

&lt;p&gt;width = disp.width&lt;br&gt;
height = disp.height&lt;br&gt;
image = Image.new('1', (width, height))&lt;/p&gt;

&lt;h1&gt;
  
  
  Get drawing object to draw on image.
&lt;/h1&gt;

&lt;p&gt;draw = ImageDraw.Draw(image)&lt;/p&gt;

&lt;h1&gt;
  
  
  Draw a black filled box to clear the image.
&lt;/h1&gt;

&lt;p&gt;draw.rectangle((0,0,width,height), outline=0, fill=0)&lt;/p&gt;

&lt;h1&gt;
  
  
  Draw some shapes.
&lt;/h1&gt;

&lt;h1&gt;
  
  
  First define some constants to allow easy resizing of shapes.
&lt;/h1&gt;

&lt;p&gt;padding = -2&lt;br&gt;
top = padding&lt;br&gt;
bottom = height-padding&lt;/p&gt;

&lt;h1&gt;
  
  
  Move left to right keeping track of the current x position for drawing shapes.
&lt;/h1&gt;

&lt;p&gt;x = 0&lt;/p&gt;

&lt;h1&gt;
  
  
  Load default font.
&lt;/h1&gt;

&lt;p&gt;font = ImageFont.load_default()&lt;/p&gt;

&lt;h1&gt;
  
  
  Alternatively load a TTF font.  Make sure the .ttf font file is in the same directory as the python script!
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Some other nice fonts to try: &lt;a href="http://www.dafont.com/bitmap.php"&gt;http://www.dafont.com/bitmap.php&lt;/a&gt;
&lt;/h1&gt;

&lt;h1&gt;
  
  
  font = ImageFont.truetype('Minecraftia.ttf', 8)
&lt;/h1&gt;

&lt;p&gt;while True:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Draw a black filled box to clear the image.
draw.rectangle((0,0,width,height), outline=0, fill=0)

# Shell scripts for system monitoring from here : https://unix.stackexchange.com/questions/119126/command-to-display-memory-usage-disk-usage-and-cpu-load
cmd = "hostname -I |cut -f 2 -d ' '"
IP = subprocess.check_output(cmd, shell = True )
cmd = "top -bn1 | grep load | awk '{printf \"CPU Load: %.2f\", $(NF-2)}'"
CPU = subprocess.check_output(cmd, shell = True )
cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%sMB %.2f%%\", $3,$2,$3*100/$2 }'"
MemUsage = subprocess.check_output(cmd, shell = True )
cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%dGB %s\", $3,$2,$5}'"
Disk = subprocess.check_output(cmd, shell = True )
cmd = "vcgencmd measure_temp |cut -f 2 -d '='"
temp = subprocess.check_output(cmd, shell = True )

# Write two lines of text.

draw.text((x, top), "IP: " + str(IP,'utf-8'), font=font, fill=255)
draw.text((x, top+8), str(CPU,'utf-8') + " " + str(temp,'utf-8') , font=font, fill=255)
draw.text((x, top+16), str(MemUsage,'utf-8'), font=font, fill=255)
draw.text((x, top+25), str(Disk,'utf-8'), font=font, fill=255)

# Display image.
disp.image(image)
disp.display()
time.sleep(.1)
# Copyright (c) 2014 Adafruit Industries
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  Author: Tony DiCola
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
&lt;/h1&gt;
&lt;h1&gt;
  
  
  of this software and associated documentation files (the "Software"), to deal
&lt;/h1&gt;
&lt;h1&gt;
  
  
  in the Software without restriction, including without limitation the rights
&lt;/h1&gt;
&lt;h1&gt;
  
  
  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
&lt;/h1&gt;
&lt;h1&gt;
  
  
  copies of the Software, and to permit persons to whom the Software is
&lt;/h1&gt;
&lt;h1&gt;
  
  
  furnished to do so, subject to the following conditions:
&lt;/h1&gt;
&lt;h1&gt;
  
  
  The above copyright notice and this permission notice shall be included in
&lt;/h1&gt;
&lt;h1&gt;
  
  
  all copies or substantial portions of the Software.
&lt;/h1&gt;
&lt;h1&gt;
  
  
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
&lt;/h1&gt;
&lt;h1&gt;
  
  
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
&lt;/h1&gt;
&lt;h1&gt;
  
  
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
&lt;/h1&gt;
&lt;h1&gt;
  
  
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
&lt;/h1&gt;
&lt;h1&gt;
  
  
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
&lt;/h1&gt;
&lt;h1&gt;
  
  
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
&lt;/h1&gt;
&lt;h1&gt;
  
  
  THE SOFTWARE.
&lt;/h1&gt;

&lt;p&gt;from &lt;strong&gt;future&lt;/strong&gt; import division&lt;br&gt;
import logging&lt;br&gt;
import time&lt;/p&gt;

&lt;p&gt;import Adafruit_GPIO as GPIO&lt;br&gt;
import Adafruit_GPIO.SPI as SPI&lt;/p&gt;
&lt;h1&gt;
  
  
  Constants
&lt;/h1&gt;

&lt;p&gt;SSD1306_I2C_ADDRESS = 0x3C    # 011110+SA0+RW - 0x3C or 0x3D&lt;br&gt;
SSD1306_SETCONTRAST = 0x81&lt;br&gt;
SSD1306_DISPLAYALLON_RESUME = 0xA4&lt;br&gt;
SSD1306_DISPLAYALLON = 0xA5&lt;br&gt;
SSD1306_NORMALDISPLAY = 0xA6&lt;br&gt;
SSD1306_INVERTDISPLAY = 0xA7&lt;br&gt;
SSD1306_DISPLAYOFF = 0xAE&lt;br&gt;
SSD1306_DISPLAYON = 0xAF&lt;br&gt;
SSD1306_SETDISPLAYOFFSET = 0xD3&lt;br&gt;
SSD1306_SETCOMPINS = 0xDA&lt;br&gt;
SSD1306_SETVCOMDETECT = 0xDB&lt;br&gt;
SSD1306_SETDISPLAYCLOCKDIV = 0xD5&lt;br&gt;
SSD1306_SETPRECHARGE = 0xD9&lt;br&gt;
SSD1306_SETMULTIPLEX = 0xA8&lt;br&gt;
SSD1306_SETLOWCOLUMN = 0x00&lt;br&gt;
SSD1306_SETHIGHCOLUMN = 0x10&lt;br&gt;
SSD1306_SETSTARTLINE = 0x40&lt;br&gt;
SSD1306_MEMORYMODE = 0x20&lt;br&gt;
SSD1306_COLUMNADDR = 0x21&lt;br&gt;
SSD1306_PAGEADDR = 0x22&lt;br&gt;
SSD1306_COMSCANINC = 0xC0&lt;br&gt;
SSD1306_COMSCANDEC = 0xC8&lt;br&gt;
SSD1306_SEGREMAP = 0xA0&lt;br&gt;
SSD1306_CHARGEPUMP = 0x8D&lt;br&gt;
SSD1306_EXTERNALVCC = 0x1&lt;br&gt;
SSD1306_SWITCHCAPVCC = 0x2&lt;/p&gt;
&lt;h1&gt;
  
  
  Scrolling constants
&lt;/h1&gt;

&lt;p&gt;SSD1306_ACTIVATE_SCROLL = 0x2F&lt;br&gt;
SSD1306_DEACTIVATE_SCROLL = 0x2E&lt;br&gt;
SSD1306_SET_VERTICAL_SCROLL_AREA = 0xA3&lt;br&gt;
SSD1306_RIGHT_HORIZONTAL_SCROLL = 0x26&lt;br&gt;
SSD1306_LEFT_HORIZONTAL_SCROLL = 0x27&lt;br&gt;
SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL = 0x29&lt;br&gt;
SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL = 0x2A&lt;/p&gt;

&lt;p&gt;class SSD1306Base(object):&lt;br&gt;
    """Base class for SSD1306-based OLED displays.  Implementors should subclass&lt;br&gt;
    and provide an implementation for the _initialize function.&lt;br&gt;
    """&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def __init__(self, width, height, rst, dc=None, sclk=None, din=None, cs=None,
             gpio=None, spi=None, i2c_bus=None, i2c_address=SSD1306_I2C_ADDRESS,
             i2c=None):
    self._log = logging.getLogger('Adafruit_SSD1306.SSD1306Base')
    self._spi = None
    self._i2c = None
    self.width = width
    self.height = height
    self._pages = height//8
    self._buffer = [0]*(width*self._pages)
    # Default to platform GPIO if not provided.
    self._gpio = gpio
    if self._gpio is None:
        self._gpio = GPIO.get_platform_gpio()
    # Setup reset pin.
    self._rst = rst
    if not self._rst is None:
        self._gpio.setup(self._rst, GPIO.OUT)
    # Handle hardware SPI
    if spi is not None:
        self._log.debug('Using hardware SPI')
        self._spi = spi
        self._spi.set_clock_hz(8000000)
    # Handle software SPI
    elif sclk is not None and din is not None and cs is not None:
        self._log.debug('Using software SPI')
        self._spi = SPI.BitBang(self._gpio, sclk, din, None, cs)
    # Handle hardware I2C
    elif i2c is not None:
        self._log.debug('Using hardware I2C with custom I2C provider.')
        self._i2c = i2c.get_i2c_device(i2c_address)
    else:
        self._log.debug('Using hardware I2C with platform I2C provider.')
        import Adafruit_GPIO.I2C as I2C
        if i2c_bus is None:
            self._i2c = I2C.get_i2c_device(i2c_address)
        else:
            self._i2c = I2C.get_i2c_device(i2c_address, busnum=i2c_bus)
    # Initialize DC pin if using SPI.
    if self._spi is not None:
        if dc is None:
            raise ValueError('DC pin must be provided when using SPI.')
        self._dc = dc
        self._gpio.setup(self._dc, GPIO.OUT)

def _initialize(self):
    raise NotImplementedError

def command(self, c):
    """Send command byte to display."""
    if self._spi is not None:
        # SPI write.
        self._gpio.set_low(self._dc)
        self._spi.write([c])
    else:
        # I2C write.
        control = 0x00   # Co = 0, DC = 0
        self._i2c.write8(control, c)

def data(self, c):
    """Send byte of data to display."""
    if self._spi is not None:
        # SPI write.
        self._gpio.set_high(self._dc)
        self._spi.write([c])
    else:
        # I2C write.
        control = 0x40   # Co = 0, DC = 0
        self._i2c.write8(control, c)

def begin(self, vccstate=SSD1306_SWITCHCAPVCC):
    """Initialize display."""
    # Save vcc state.
    self._vccstate = vccstate
    # Reset and initialize display.
    self.reset()
    self._initialize()
    # Turn on the display.
    self.command(SSD1306_DISPLAYON)

def reset(self):
    """Reset the display."""
    if self._rst is None:
        return
    # Set reset high for a millisecond.
    self._gpio.set_high(self._rst)
    time.sleep(0.001)
    # Set reset low for 10 milliseconds.
    self._gpio.set_low(self._rst)
    time.sleep(0.010)
    # Set reset high again.
    self._gpio.set_high(self._rst)

def display(self):
    """Write display buffer to physical display."""
    self.command(SSD1306_COLUMNADDR)
    self.command(0)              # Column start address. (0 = reset)
    self.command(self.width-1)   # Column end address.
    self.command(SSD1306_PAGEADDR)
    self.command(0)              # Page start address. (0 = reset)
    self.command(self._pages-1)  # Page end address.
    # Write buffer data.
    if self._spi is not None:
        # Set DC high for data.
        self._gpio.set_high(self._dc)
        # Write buffer.
        self._spi.write(self._buffer)
    else:
        for i in range(0, len(self._buffer), 16):
            control = 0x40   # Co = 0, DC = 0
            self._i2c.writeList(control, self._buffer[i:i+16])

def image(self, image):
    """Set buffer to value of Python Imaging Library image.  The image should
    be in 1 bit mode and a size equal to the display size.
    """
    if image.mode != '1':
        raise ValueError('Image must be in mode 1.')
    imwidth, imheight = image.size
    if imwidth != self.width or imheight != self.height:
        raise ValueError('Image must be same dimensions as display ({0}x{1}).' \
            .format(self.width, self.height))
    # Grab all the pixels from the image, faster than getpixel.
    pix = image.load()
    # Iterate through the memory pages
    index = 0
    for page in range(self._pages):
        # Iterate through all x axis columns.
        for x in range(self.width):
            # Set the bits for the column of pixels at the current position.
            bits = 0
            # Don't use range here as it's a bit slow
            for bit in [0, 1, 2, 3, 4, 5, 6, 7]:
                bits = bits &amp;lt;&amp;lt; 1
                bits |= 0 if pix[(x, page*8+7-bit)] == 0 else 1
            # Update buffer byte and increment to next byte.
            self._buffer[index] = bits
            index += 1

def clear(self):
    """Clear contents of image buffer."""
    self._buffer = [0]*(self.width*self._pages)

def set_contrast(self, contrast):
    """Sets the contrast of the display.  Contrast should be a value between
    0 and 255."""
    if contrast &amp;lt; 0 or contrast &amp;gt; 255:
        raise ValueError('Contrast must be a value from 0 to 255 (inclusive).')
    self.command(SSD1306_SETCONTRAST)
    self.command(contrast)

def dim(self, dim):
    """Adjusts contrast to dim the display if dim is True, otherwise sets the
    contrast to normal brightness if dim is False.
    """
    # Assume dim display.
    contrast = 0
    # Adjust contrast based on VCC if not dimming.
    if not dim:
        if self._vccstate == SSD1306_EXTERNALVCC:
            contrast = 0x9F
        else:
            contrast = 0xCF
        self.set_contrast(contrast)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;class SSD1306_128_64(SSD1306Base):&lt;br&gt;
    def &lt;strong&gt;init&lt;/strong&gt;(self, rst, dc=None, sclk=None, din=None, cs=None, gpio=None,&lt;br&gt;
                 spi=None, i2c_bus=None, i2c_address=SSD1306_I2C_ADDRESS,&lt;br&gt;
                 i2c=None):&lt;br&gt;
        # Call base class constructor.&lt;br&gt;
        super(SSD1306_128_64, self).&lt;strong&gt;init&lt;/strong&gt;(128, 64, rst, dc, sclk, din, cs,&lt;br&gt;
                                             gpio, spi, i2c_bus, i2c_address, i2c)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def _initialize(self):
    # 128x64 pixel specific initialization.
    self.command(SSD1306_DISPLAYOFF)                    # 0xAE
    self.command(SSD1306_SETDISPLAYCLOCKDIV)            # 0xD5
    self.command(0x80)                                  # the suggested ratio 0x80
    self.command(SSD1306_SETMULTIPLEX)                  # 0xA8
    self.command(0x3F)
    self.command(SSD1306_SETDISPLAYOFFSET)              # 0xD3
    self.command(0x0)                                   # no offset
    self.command(SSD1306_SETSTARTLINE | 0x0)            # line #0
    self.command(SSD1306_CHARGEPUMP)                    # 0x8D
    if self._vccstate == SSD1306_EXTERNALVCC:
        self.command(0x10)
    else:
        self.command(0x14)
    self.command(SSD1306_MEMORYMODE)                    # 0x20
    self.command(0x00)                                  # 0x0 act like ks0108
    self.command(SSD1306_SEGREMAP | 0x1)
    self.command(SSD1306_COMSCANDEC)
    self.command(SSD1306_SETCOMPINS)                    # 0xDA
    self.command(0x12)
    self.command(SSD1306_SETCONTRAST)                   # 0x81
    if self._vccstate == SSD1306_EXTERNALVCC:
        self.command(0x9F)
    else:
        self.command(0xCF)
    self.command(SSD1306_SETPRECHARGE)                  # 0xd9
    if self._vccstate == SSD1306_EXTERNALVCC:
        self.command(0x22)
    else:
        self.command(0xF1)
    self.command(SSD1306_SETVCOMDETECT)                 # 0xDB
    self.command(0x40)
    self.command(SSD1306_DISPLAYALLON_RESUME)           # 0xA4
    self.command(SSD1306_NORMALDISPLAY)                 # 0xA6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;class SSD1306_128_32(SSD1306Base):&lt;br&gt;
    def &lt;strong&gt;init&lt;/strong&gt;(self, rst, dc=None, sclk=None, din=None, cs=None, gpio=None,&lt;br&gt;
                 spi=None, i2c_bus=None, i2c_address=SSD1306_I2C_ADDRESS,&lt;br&gt;
                 i2c=None):&lt;br&gt;
        # Call base class constructor.&lt;br&gt;
        super(SSD1306_128_32, self).&lt;strong&gt;init&lt;/strong&gt;(128, 32, rst, dc, sclk, din, cs,&lt;br&gt;
                                             gpio, spi, i2c_bus, i2c_address, i2c)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def _initialize(self):
    # 128x32 pixel specific initialization.
    self.command(SSD1306_DISPLAYOFF)                    # 0xAE
    self.command(SSD1306_SETDISPLAYCLOCKDIV)            # 0xD5
    self.command(0x80)                                  # the suggested ratio 0x80
    self.command(SSD1306_SETMULTIPLEX)                  # 0xA8
    self.command(0x1F)
    self.command(SSD1306_SETDISPLAYOFFSET)              # 0xD3
    self.command(0x0)                                   # no offset
    self.command(SSD1306_SETSTARTLINE | 0x0)            # line #0
    self.command(SSD1306_CHARGEPUMP)                    # 0x8D
    if self._vccstate == SSD1306_EXTERNALVCC:
        self.command(0x10)
    else:
        self.command(0x14)
    self.command(SSD1306_MEMORYMODE)                    # 0x20
    self.command(0x00)                                  # 0x0 act like ks0108
    self.command(SSD1306_SEGREMAP | 0x1)
    self.command(SSD1306_COMSCANDEC)
    self.command(SSD1306_SETCOMPINS)                    # 0xDA
    self.command(0x02)
    self.command(SSD1306_SETCONTRAST)                   # 0x81
    self.command(0x8F)
    self.command(SSD1306_SETPRECHARGE)                  # 0xd9
    if self._vccstate == SSD1306_EXTERNALVCC:
        self.command(0x22)
    else:
        self.command(0xF1)
    self.command(SSD1306_SETVCOMDETECT)                 # 0xDB
    self.command(0x40)
    self.command(SSD1306_DISPLAYALLON_RESUME)           # 0xA4
    self.command(SSD1306_NORMALDISPLAY)                 # 0xA6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;class SSD1306_96_16(SSD1306Base):&lt;br&gt;
    def &lt;strong&gt;init&lt;/strong&gt;(self, rst, dc=None, sclk=None, din=None, cs=None, gpio=None,&lt;br&gt;
                 spi=None, i2c_bus=None, i2c_address=SSD1306_I2C_ADDRESS,&lt;br&gt;
                 i2c=None):&lt;br&gt;
        # Call base class constructor.&lt;br&gt;
        super(SSD1306_96_16, self).&lt;strong&gt;init&lt;/strong&gt;(96, 16, rst, dc, sclk, din, cs,&lt;br&gt;
                                            gpio, spi, i2c_bus, i2c_address, i2c)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def _initialize(self):
    # 128x32 pixel specific initialization.
    self.command(SSD1306_DISPLAYOFF)                    # 0xAE
    self.command(SSD1306_SETDISPLAYCLOCKDIV)            # 0xD5
    self.command(0x60)                                  # the suggested ratio 0x60
    self.command(SSD1306_SETMULTIPLEX)                  # 0xA8
    self.command(0x0F)
    self.command(SSD1306_SETDISPLAYOFFSET)              # 0xD3
    self.command(0x0)                                   # no offset
    self.command(SSD1306_SETSTARTLINE | 0x0)            # line #0
    self.command(SSD1306_CHARGEPUMP)                    # 0x8D
    if self._vccstate == SSD1306_EXTERNALVCC:
        self.command(0x10)
    else:
        self.command(0x14)
    self.command(SSD1306_MEMORYMODE)                    # 0x20
    self.command(0x00)                                  # 0x0 act like ks0108
    self.command(SSD1306_SEGREMAP | 0x1)
    self.command(SSD1306_COMSCANDEC)
    self.command(SSD1306_SETCOMPINS)                    # 0xDA
    self.command(0x02)
    self.command(SSD1306_SETCONTRAST)                   # 0x81
    self.command(0x8F)
    self.command(SSD1306_SETPRECHARGE)                  # 0xd9
    if self._vccstate == SSD1306_EXTERNALVCC:
        self.command(0x22)
    else:
        self.command(0xF1)
    self.command(SSD1306_SETVCOMDETECT)                 # 0xDB
    self.command(0x40)
    self.command(SSD1306_DISPLAYALLON_RESUME)           # 0xA4
    self.command(SSD1306_NORMALDISPLAY)                 # 0xA6
    /***********************************************************************
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Mini Clock v1.0, Jul 2014 by Nick Hall&lt;br&gt;
Distributed under the terms of the GPL.&lt;/p&gt;

&lt;p&gt;For help on how to build the clock see my blog:&lt;br&gt;
&lt;a href="http://123led.wordpress.com/"&gt;http://123led.wordpress.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tested on IDE v1.6.5 &lt;/p&gt;

&lt;p&gt;***********************************************************************/&lt;/p&gt;

&lt;p&gt;//include libraries:&lt;/p&gt;

&lt;h1&gt;
  
  
  include "LedControl.h"
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include                 // Font library
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include                         // DS1307 clock
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include "RTClib.h"                      // DS1307 clock
&lt;/h1&gt;

&lt;h1&gt;
  
  
  include                       // Button library by Alexander Brevig
&lt;/h1&gt;

&lt;p&gt;// Setup LED Matrix&lt;/p&gt;

&lt;p&gt;// pin 10 is connected to the DataIn on the display&lt;br&gt;
// pin 12 is connected to the CLK on the display&lt;br&gt;
// pin 11 is connected to LOAD on the display(cs)&lt;br&gt;
LedControl lc = LedControl(10, 12, 11, 4); //sets the 3 pins as 12, 11 &amp;amp; 10 and then sets 4 displays (max is 8 displays)&lt;/p&gt;

&lt;p&gt;//global variables&lt;br&gt;
byte intensity = 7;                      // Default intensity/brightness (0-15)&lt;br&gt;
byte clock_mode = 0;                     // Default clock mode. Default = 0 (basic_mode)&lt;br&gt;
bool random_mode = 0;                    // Define random mode - changes the display type every few hours. Default = 0 (off)&lt;br&gt;
byte old_mode = clock_mode;              // Stores the previous clock mode, so if we go to date or whatever, we know what mode to go back to after.&lt;br&gt;
bool ampm = 0;                           // Define 12 or 24 hour time. 0 = 24 hour. 1 = 12 hour&lt;br&gt;
byte change_mode_time = 0;               // Holds hour when clock mode will next change if in random mode.&lt;br&gt;
unsigned long delaytime = 500;           // We always wait a bit between updates of the display&lt;br&gt;
int rtc[7];                              // Holds real time clock output&lt;/p&gt;

&lt;p&gt;char days[7][4] = {&lt;br&gt;
  "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"&lt;br&gt;
}; //day array - used in slide, basic_mode and jumble modes (The DS1307 outputs 1-7 values for day of week)&lt;br&gt;
char daysfull[7][9] = {&lt;br&gt;
  "Sunday", "Monday", "Tuesday", "Wed", "Thursday", "Friday", "Saturday"&lt;br&gt;
};&lt;br&gt;
char suffix[4][3] = {&lt;br&gt;
  "st", "nd", "rd", "th"&lt;br&gt;
};  //date suffix array, used in slide, basic_mode and jumble modes. e,g, 1st 2nd ...&lt;/p&gt;

&lt;p&gt;//define constants&lt;/p&gt;

&lt;h1&gt;
  
  
  define NUM_DISPLAY_MODES 3              // Number display modes (conting zero as the first mode)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define NUM_SETTINGS_MODES 4             // Number settings modes = 6 (conting zero as the first mode)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define SLIDE_DELAY 20                   // The time in milliseconds for the slide effect per character in slide mode. Make this higher for a slower effect
&lt;/h1&gt;

&lt;h1&gt;
  
  
  define cls          clear_display       // Clear display
&lt;/h1&gt;

&lt;p&gt;RTC_DS1307 ds1307;                              // Create RTC object&lt;/p&gt;

&lt;p&gt;Button buttonA = Button(2, BUTTON_PULLUP);      // Setup button A (using button library)&lt;br&gt;
Button buttonB = Button(3, BUTTON_PULLUP);      // Setup button B (using button library)&lt;/p&gt;

&lt;p&gt;void setup() {&lt;/p&gt;

&lt;p&gt;digitalWrite(2, HIGH);                 // turn on pullup resistor for button on pin 2&lt;br&gt;
  digitalWrite(3, HIGH);                 // turn on pullup resistor for button on pin 3&lt;br&gt;
  digitalWrite(4, HIGH);                 // turn on pullup resistor for button on pin 4&lt;/p&gt;

&lt;p&gt;Serial.begin(9600); //start serial&lt;/p&gt;

&lt;p&gt;//initialize the 4 matrix panels&lt;br&gt;
  //we have already set the number of devices when we created the LedControl&lt;br&gt;
  int devices = lc.getDeviceCount();&lt;br&gt;
  //we have to init all devices in a loop&lt;br&gt;
  for (int address = 0; address &amp;lt; devices; address++) {&lt;br&gt;
    /&lt;em&gt;The MAX72XX is in power-saving mode on startup&lt;/em&gt;/&lt;br&gt;
    lc.shutdown(address, false);&lt;br&gt;
    /* Set the brightness to a medium values &lt;em&gt;/&lt;br&gt;
    lc.setIntensity(address, intensity);&lt;br&gt;
    /&lt;/em&gt; and clear the display */&lt;br&gt;
    lc.clearDisplay(address);&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;//Setup DS1307 RTC&lt;/p&gt;

&lt;h1&gt;
  
  
  ifdef AVR
&lt;/h1&gt;

&lt;p&gt;Wire.begin();&lt;/p&gt;

&lt;h1&gt;
  
  
  else
&lt;/h1&gt;

&lt;p&gt;Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino&lt;/p&gt;

&lt;h1&gt;
  
  
  endif
&lt;/h1&gt;

&lt;p&gt;ds1307.begin(); //start RTC Clock&lt;/p&gt;

&lt;p&gt;if (! ds1307.isrunning()) {&lt;br&gt;
    Serial.println("RTC is NOT running!");&lt;br&gt;
    ds1307.adjust(DateTime(&lt;strong&gt;DATE&lt;/strong&gt;, &lt;strong&gt;TIME&lt;/strong&gt;));  // sets the RTC to the date &amp;amp; time this sketch was compiled&lt;br&gt;
  }&lt;br&gt;
  //Show software version &amp;amp; hello message&lt;br&gt;
  printver();&lt;/p&gt;

&lt;p&gt;//enable red led&lt;br&gt;
  digitalWrite(13, HIGH);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void loop() {&lt;/p&gt;

&lt;p&gt;//run the clock with whatever mode is set by clock_mode - the default is set at top of code.&lt;br&gt;
  switch (clock_mode){&lt;/p&gt;

&lt;p&gt;case 0: &lt;br&gt;
    basic_mode();&lt;br&gt;
    break; &lt;br&gt;
  case 1: &lt;br&gt;
   small_mode(); &lt;br&gt;
    break;&lt;br&gt;
  case 2: &lt;br&gt;
    slide(); &lt;br&gt;
    break;&lt;br&gt;
  case 3: &lt;br&gt;
    word_clock(); &lt;br&gt;
    break;&lt;br&gt;
  case 4: &lt;br&gt;
    setup_menu(); &lt;br&gt;
    break;&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//plot a point on the display&lt;br&gt;
void plot (byte x, byte y, byte val) {&lt;/p&gt;

&lt;p&gt;//select which matrix depending on the x coord&lt;br&gt;
  byte address;&lt;br&gt;
  if (x &amp;gt;= 0 &amp;amp;&amp;amp; x &amp;lt;= 7)   {&lt;br&gt;
    address = 3;&lt;br&gt;
  }&lt;br&gt;
  if (x &amp;gt;= 8 &amp;amp;&amp;amp; x &amp;lt;= 15)  {&lt;br&gt;
    address = 2;&lt;br&gt;
    x = x - 8;&lt;br&gt;
  }&lt;br&gt;
  if (x &amp;gt;= 16 &amp;amp;&amp;amp; x &amp;lt;= 23) {&lt;br&gt;
    address = 1;&lt;br&gt;
    x = x - 16;&lt;br&gt;
  }&lt;br&gt;
  if (x &amp;gt;= 24 &amp;amp;&amp;amp; x &amp;lt;= 31) {&lt;br&gt;
    address = 0;&lt;br&gt;
    x = x - 24;&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;if (val == 1) {&lt;br&gt;
   // lc.setLed(address, y, x, true);&lt;br&gt;
   lc.setLed(address, 7-y, x, true);&lt;br&gt;
  } else {&lt;br&gt;
  //  lc.setLed(address, y, x, false);&lt;br&gt;
  lc.setLed(address, 7-y, x, false);&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//clear screen&lt;br&gt;
void clear_display() {&lt;br&gt;
  for (byte address = 0; address &amp;lt; 4; address++) {&lt;br&gt;
    lc.clearDisplay(address);&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//fade screen down&lt;br&gt;
void fade_down() {&lt;/p&gt;

&lt;p&gt;//fade from global intensity to 1&lt;br&gt;
  for (byte i = intensity; i &amp;gt; 0; i--) {&lt;br&gt;
    for (byte address = 0; address &amp;lt; 4; address++) {&lt;br&gt;
      lc.setIntensity(address, i);&lt;br&gt;
    }&lt;br&gt;
    delay(30); //change this to change fade down speed&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;clear_display(); //clear display completely (off)&lt;/p&gt;

&lt;p&gt;//reset intentsity to global val&lt;br&gt;
  for (byte address = 0; address &amp;lt; 4; address++) {&lt;br&gt;
    lc.setIntensity(address, intensity);&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//power up led test &amp;amp; display software version number&lt;br&gt;
void printver() {&lt;/p&gt;

&lt;p&gt;byte i = 0;&lt;br&gt;
  char ver_a[9] = "Vers 1.0";&lt;br&gt;
  char ver_b[9] = " Hello! ";&lt;/p&gt;

&lt;p&gt;//test all leds.&lt;br&gt;
  for (byte x = 0; x &amp;lt;= 31; x++) {&lt;br&gt;
    for (byte y = 0; y &amp;lt;= 7; y++) {&lt;br&gt;
      plot(x, y, 1);&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
  delay(500);&lt;br&gt;
  fade_down();&lt;/p&gt;

&lt;p&gt;while (ver_a[i]) {&lt;br&gt;
    puttinychar((i * 4), 1, ver_a[i]);&lt;br&gt;
    delay(35);&lt;br&gt;
    i++;&lt;br&gt;
  }&lt;br&gt;
  delay(700);&lt;br&gt;
  fade_down();&lt;br&gt;
  i = 0;&lt;br&gt;
  while (ver_b[i]) {&lt;br&gt;
    puttinychar((i * 4), 1, ver_b[i]);&lt;br&gt;
    delay(35);&lt;br&gt;
    i++;&lt;br&gt;
  }&lt;br&gt;
  delay(700);&lt;br&gt;
  fade_down();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// puttinychar&lt;br&gt;
// Copy a 3x5 character glyph from the myfont data structure to display memory, with its upper left at the given coordinate&lt;br&gt;
// This is unoptimized and simply uses plot() to draw each dot.&lt;br&gt;
void puttinychar(byte x, byte y, char c)&lt;br&gt;
{&lt;br&gt;
  byte dots;&lt;br&gt;
  if (c &amp;gt;= 'A' &amp;amp;&amp;amp; c &amp;lt;= 'Z' || (c &amp;gt;= 'a' &amp;amp;&amp;amp; c &amp;lt;= 'z') ) {&lt;br&gt;
    c &amp;amp;= 0x1F;   // A-Z maps to 1-26&lt;br&gt;
  }&lt;br&gt;
  else if (c &amp;gt;= '0' &amp;amp;&amp;amp; c &amp;lt;= '9') {&lt;br&gt;
    c = (c - '0') + 32;&lt;br&gt;
  }&lt;br&gt;
  else if (c == ' ') {&lt;br&gt;
    c = 0; // space&lt;br&gt;
  }&lt;br&gt;
  else if (c == '.') {&lt;br&gt;
    c = 27; // full stop&lt;br&gt;
  }&lt;br&gt;
  else if (c == ':') {&lt;br&gt;
    c = 28; // colon&lt;br&gt;
  }&lt;br&gt;
  else if (c == '\'') {&lt;br&gt;
    c = 29; // single quote mark&lt;br&gt;
  }&lt;br&gt;
  else if (c == '!') {&lt;br&gt;
    c = 30; // single quote mark&lt;br&gt;
  }&lt;br&gt;
  else if (c == '?') {&lt;br&gt;
    c = 31; // single quote mark&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;for (byte col = 0; col &amp;lt; 3; col++) {&lt;br&gt;
    dots = pgm_read_byte_near(&amp;amp;mytinyfont[c][col]);&lt;br&gt;
    for (char row = 0; row &amp;lt; 5; row++) {&lt;br&gt;
      if (dots &amp;amp; (16 &amp;gt;&amp;gt; row))&lt;br&gt;
        plot(x + col, y + row, 1);&lt;br&gt;
      else&lt;br&gt;
        plot(x + col, y + row, 0);&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void putnormalchar(byte x, byte y, char c)&lt;br&gt;
{&lt;/p&gt;

&lt;p&gt;byte dots;&lt;br&gt;
  //  if (c &amp;gt;= 'A' &amp;amp;&amp;amp; c &amp;lt;= 'Z' || (c &amp;gt;= 'a' &amp;amp;&amp;amp; c &amp;lt;= 'z') ) {&lt;br&gt;
  //    c &amp;amp;= 0x1F;   // A-Z maps to 1-26&lt;br&gt;
  //  }&lt;br&gt;
  if (c &amp;gt;= 'A' &amp;amp;&amp;amp; c &amp;lt;= 'Z' ) {&lt;br&gt;
    c &amp;amp;= 0x1F;   // A-Z maps to 1-26&lt;br&gt;
  }&lt;br&gt;
  else if (c &amp;gt;= 'a' &amp;amp;&amp;amp; c &amp;lt;= 'z') {&lt;br&gt;
    c = (c - 'a') + 41;   // A-Z maps to 41-67&lt;br&gt;
  }&lt;br&gt;
  else if (c &amp;gt;= '0' &amp;amp;&amp;amp; c &amp;lt;= '9') {&lt;br&gt;
    c = (c - '0') + 31;&lt;br&gt;
  }&lt;br&gt;
  else if (c == ' ') {&lt;br&gt;
    c = 0; // space&lt;br&gt;
  }&lt;br&gt;
  else if (c == '.') {&lt;br&gt;
    c = 27; // full stop&lt;br&gt;
  }&lt;br&gt;
  else if (c == '\'') {&lt;br&gt;
    c = 28; // single quote mark&lt;br&gt;
  }&lt;br&gt;
  else if (c == ':') {&lt;br&gt;
    c = 29; // clock_mode selector arrow&lt;br&gt;
  }&lt;br&gt;
  else if (c == '&amp;gt;') {&lt;br&gt;
    c = 30; // clock_mode selector arrow&lt;br&gt;
  }&lt;br&gt;
  else if (c &amp;gt;= -80 &amp;amp;&amp;amp; c &amp;lt;= -67) {&lt;br&gt;
    c *= -1;&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;for (char col = 0; col &amp;lt; 5; col++) {&lt;br&gt;
    dots = pgm_read_byte_near(&amp;amp;myfont[c][col]);&lt;br&gt;
    for (char row = 0; row &amp;lt; 7; row++) {&lt;br&gt;
      //check coords are on screen before trying to plot&lt;br&gt;
      //if ((x &amp;gt;= 0) &amp;amp;&amp;amp; (x &amp;lt;= 31) &amp;amp;&amp;amp; (y &amp;gt;= 0) &amp;amp;&amp;amp; (y &amp;lt;= 7)){&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  if (dots &amp;amp; (64 &amp;gt;&amp;gt; row)) {   // only 7 rows.
    plot(x + col, y + row, 1);
  } else {
    plot(x + col, y + row, 0);
  }
  //}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//small_mode&lt;br&gt;
//show the time in small 3x5 characters with seconds display&lt;/p&gt;

&lt;p&gt;void small_mode() {&lt;/p&gt;

&lt;p&gt;char textchar[8]; // the 16 characters on the display&lt;br&gt;
  byte mins = 100; //mins&lt;br&gt;
  byte secs = rtc[0]; //seconds&lt;br&gt;
  byte old_secs = secs; //holds old seconds value - from last time seconds were updated o display - used to check if seconds have changed&lt;/p&gt;

&lt;p&gt;cls();&lt;/p&gt;

&lt;p&gt;//run clock main loop as long as run_mode returns true&lt;br&gt;
  while (run_mode()) {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;get_time();

//check for button press
if (buttonA.uniquePress()) {
  switch_mode();
  return;
}
if (buttonB.uniquePress()) {
  display_date();
  return;
}

//if secs changed then update them on the display
secs = rtc[0];
if (secs != old_secs) {

  //secs
  char buffer[3];
  itoa(secs, buffer, 10);

  //fix - as otherwise if num has leading zero, e.g. "03" secs, itoa coverts this to chars with space "3 ".
  if (secs &amp;lt; 10) {
    buffer[1] = buffer[0];
    buffer[0] = '0';
  }

  puttinychar( 20, 1, ':'); //seconds colon
  puttinychar( 24, 1, buffer[0]); //seconds
  puttinychar( 28, 1, buffer[1]); //seconds
  old_secs = secs;
}

//if minute changes change time
if (mins != rtc[1]) {

  //reset these for comparison next time
  mins = rtc[1];
  byte hours = rtc[2];
  if (hours &amp;gt; 12) {
    hours = hours - ampm * 12;
  }
  if (hours &amp;lt; 1) {
    hours = hours + ampm * 12;
  }


  //byte dow  = rtc[3]; // the DS1307 outputs 0 - 6 where 0 = Sunday0 - 6 where 0 = Sunday.
  //byte date = rtc[4];

  //set characters
  char buffer[3];
  itoa(hours, buffer, 10);

  //fix - as otherwise if num has leading zero, e.g. "03" hours, itoa coverts this to chars with space "3 ".
  if (hours &amp;lt; 10) {
    buffer[1] = buffer[0];
    //if we are in 12 hour mode blank the leading zero.
    if (ampm) {
      buffer[0] = ' ';
    }
    else {
      buffer[0] = '0';
    }
  }
  //set hours chars
  textchar[0] = buffer[0];
  textchar[1] = buffer[1];
  textchar[2] = ':';

  itoa (mins, buffer, 10);
  if (mins &amp;lt; 10) {
    buffer[1] = buffer[0];
    buffer[0] = '0';
  }
  //set mins characters
  textchar[3] = buffer[0];
  textchar[4] = buffer[1];

  //do seconds
  textchar[5] = ':';
  buffer[3];
  secs = rtc[0];
  itoa(secs, buffer, 10);

  //fix - as otherwise if num has leading zero, e.g. "03" secs, itoa coverts this to chars with space "3 ".
  if (secs &amp;lt; 10) {
    buffer[1] = buffer[0];
    buffer[0] = '0';
  }
  //set seconds
  textchar[6] = buffer[0];
  textchar[7] = buffer[1];

  byte x = 0;
  byte y = 0;

  //print each char
  for (byte x = 0; x &amp;lt; 6 ; x++) {
    puttinychar( x * 4, 1, textchar[x]);
  }
}
delay(50);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  fade_down();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// basic_mode()&lt;br&gt;
// show the time in 5x7 characters&lt;br&gt;
void basic_mode()&lt;br&gt;
{&lt;br&gt;
  cls();&lt;/p&gt;

&lt;p&gt;char buffer[3];   //for int to char conversion to turn rtc values into chars we can print on screen&lt;br&gt;
  byte offset = 0;  //used to offset the x postition of the digits and centre the display when we are in 12 hour mode and the clock shows only 3 digits. e.g. 3:21&lt;br&gt;
  byte x, y;        //used to draw a clear box over the left hand "1" of the display when we roll from 12:59 -&amp;gt; 1:00am in 12 hour mode.&lt;/p&gt;

&lt;p&gt;//do 12/24 hour conversion if ampm set to 1&lt;br&gt;
  byte hours = rtc[2];&lt;/p&gt;

&lt;p&gt;if (hours &amp;gt; 12) {&lt;br&gt;
    hours = hours - ampm * 12;&lt;br&gt;
  }&lt;br&gt;
  if (hours &amp;lt; 1) {&lt;br&gt;
    hours = hours + ampm * 12;&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;//do offset conversion&lt;br&gt;
  if (ampm &amp;amp;&amp;amp; hours &amp;lt; 10) {&lt;br&gt;
    offset = 2;&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;//set the next minute we show the date at&lt;br&gt;
  //set_next_date();&lt;/p&gt;

&lt;p&gt;// initially set mins to value 100 - so it wll never equal rtc[1] on the first loop of the clock, meaning we draw the clock display when we enter the function&lt;br&gt;
  byte secs = 100;&lt;br&gt;
  byte mins = 100;&lt;br&gt;
  int count = 0;&lt;/p&gt;

&lt;p&gt;//run clock main loop as long as run_mode returns true&lt;br&gt;
  while (run_mode()) {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//get the time from the clock chip
get_time();

//check for button press
if (buttonA.uniquePress()) {
  switch_mode();
  return;
}
if (buttonB.uniquePress()) {
  display_date();
  return;
}

//check whether it's time to automatically display the date
//check_show_date();

//draw the flashing : as on if the secs have changed.
if (secs != rtc[0]) {

  //update secs with new value
  secs = rtc[0];

  //draw :
  plot (15 - offset, 2, 1); //top point
  plot (15 - offset, 5, 1); //bottom point
  count = 400;
}

//if count has run out, turn off the :
if (count == 0) {
  plot (15 - offset, 2, 0); //top point
  plot (15 - offset, 5, 0); //bottom point
}
else {
  count--;
}

//re draw the display if button pressed or if mins != rtc[1] i.e. if the time has changed from what we had stored in mins, (also trigggered on first entering function when mins is 100)
if (mins != rtc[1]) {

  //update mins and hours with the new values
  mins = rtc[1];
  hours = rtc[2];

  //adjust hours of ampm set to 12 hour mode
  if (hours &amp;gt; 12) {
    hours = hours - ampm * 12;
  }
  if (hours &amp;lt; 1) {
    hours = hours + ampm * 12;
  }

  itoa(hours, buffer, 10);

  //if hours &amp;lt; 10 the num e.g. "3" hours, itoa coverts this to chars with space "3 " which we dont want
  if (hours &amp;lt; 10) {
    buffer[1] = buffer[0];
    buffer[0] = '0';
  }

  //print hours
  //if we in 12 hour mode and hours &amp;lt; 10, then don't print the leading zero, and set the offset so we centre the display with 3 digits.
  if (ampm &amp;amp;&amp;amp; hours &amp;lt; 10) {
    offset = 2;

    //if the time is 1:00am clear the entire display as the offset changes at this time and we need to blank out the old 12:59
    if ((hours == 1 &amp;amp;&amp;amp; mins == 0) ) {
      cls();
    }
  }
  else {
    //else no offset and print hours tens digit
    offset = 0;

    //if the time is 10:00am clear the entire display as the offset changes at this time and we need to blank out the old 9:59
    if (hours == 10 &amp;amp;&amp;amp; mins == 0) {
      cls();
    }


    putnormalchar(1,  0, buffer[0]);
  }
  //print hours ones digit
  putnormalchar(7 - offset, 0, buffer[1]);


  //print mins
  //add leading zero if mins &amp;lt; 10
  itoa (mins, buffer, 10);
  if (mins &amp;lt; 10) {
    buffer[1] = buffer[0];
    buffer[0] = '0';
  }
  //print mins tens and ones digits
  putnormalchar(19 - offset, 0, buffer[0]);
  putnormalchar(25 - offset, 0, buffer[1]);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  fade_down();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//like basic_mode but with slide effect&lt;br&gt;
void slide() {&lt;/p&gt;

&lt;p&gt;byte digits_old[4] = {99, 99, 99, 99}; //old values  we store time in. Set to somthing that will never match the time initially so all digits get drawn wnen the mode starts&lt;br&gt;
  byte digits_new[4]; //new digits time will slide to reveal&lt;br&gt;
  byte digits_x_pos[4] = {25, 19, 7, 1}; //x pos for which to draw each digit at&lt;/p&gt;

&lt;p&gt;char old_char[2]; //used when we use itoa to transpose the current digit (type byte) into a char to pass to the animation function&lt;br&gt;
  char new_char[2]; //used when we use itoa to transpose the new digit (type byte) into a char to pass to the animation function&lt;/p&gt;

&lt;p&gt;//old_chars - stores the 5 day and date suffix chars on the display. e.g. "mon" and "st". We feed these into the slide animation as the current char when these chars are updated.&lt;br&gt;
  //We sent them as A initially, which are used when the clocl enters the mode and no last chars are stored.&lt;br&gt;
  //char old_chars[6] = "AAAAA";&lt;/p&gt;

&lt;p&gt;//plot the clock colon on the display&lt;br&gt;
  cls();&lt;br&gt;
  putnormalchar( 13, 0, ':');&lt;/p&gt;

&lt;p&gt;byte old_secs = rtc[0]; //store seconds in old_secs. We compare secs and old secs. WHen they are different we redraw the display&lt;/p&gt;

&lt;p&gt;//run clock main loop as long as run_mode returns true&lt;br&gt;
  while (run_mode()) {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;get_time();

//check for button press
if (buttonA.uniquePress()) {
  switch_mode();
  return;
}
  if (buttonB.uniquePress()) {
  display_date();
  return;
}

//if secs have changed then update the display
if (rtc[0] != old_secs) {
  old_secs = rtc[0];

  //do 12/24 hour conversion if ampm set to 1
  byte hours = rtc[2];
  if (hours &amp;gt; 12) {
    hours = hours - ampm * 12;
  }
  if (hours &amp;lt; 1) {
    hours = hours + ampm * 12;
  }

  //split all date and time into individual digits - stick in digits_new array

  //rtc[0] = secs                        //array pos and digit stored
  //digits_new[0] = (rtc[0]%10);           //0 - secs ones
  //digits_new[1] = ((rtc[0]/10)%10);      //1 - secs tens
  //rtc[1] = mins
  digits_new[0] = (rtc[1] % 10);         //2 - mins ones
  digits_new[1] = ((rtc[1] / 10) % 10);  //3 - mins tens
  //rtc[2] = hours
  digits_new[2] = (hours % 10);         //4 - hour ones
  digits_new[3] = ((hours / 10) % 10);  //5 - hour tens
  //rtc[4] = date
  //digits_new[6] = (rtc[4]%10);           //6 - date ones
  //digits_new[7] = ((rtc[4]/10)%10);      //7 - date tens

  //draw initial screen of all chars. After this we just draw the changes.

  //compare digits 0 to 3 (mins and hours)
  for (byte i = 0; i &amp;lt;= 3; i++) {
    //see if digit has changed...
    if (digits_old[i] != digits_new[i]) {

      //run 9 step animation sequence for each in turn
      for (byte seq = 0; seq &amp;lt;= 8 ; seq++) {

        //convert digit to string
        itoa(digits_old[i], old_char, 10);
        itoa(digits_new[i], new_char, 10);

        //if set to 12 hour mode and we're on digit 2 (hours tens mode) then check to see if this is a zero. If it is, blank it instead so we get 2.00pm not 02.00pm
        if (ampm &amp;amp;&amp;amp; i == 3) {
          if (digits_new[3] == 0) {
            new_char[0] = ' ';
          }
          if (digits_old[3] == 0) {
            old_char[0] = ' ';
          }
        }
        //draw the animation frame for each digit
        slideanim(digits_x_pos[i], 0, seq, old_char[0], new_char[0]);
        delay(SLIDE_DELAY);
      }
    }
  }

  /*
  //compare date digit 6 (ones) and (7) tens - if either of these change we need to update the date line. We compare date tens as say from Jan 31 -&amp;gt; Feb 01 then ones digit doesn't change
  if ((digits_old[6] != digits_new[6]) || (digits_old[7] != digits_new[7])) {
    //change the day shown. Loop below goes through each of the 3 chars in turn e.g. "MON"
    for (byte day_char = 0; day_char &amp;lt;=2 ; day_char++){
      //run the anim sequence for each char
      for (byte seq = 0; seq &amp;lt;=8 ; seq++){
        //the day (0 - 6) Read this number into the days char array. the seconds number in the array 0-2 gets the 3 chars of the day name, e.g. m o n
        slideanim(6*day_char,8,seq,old_chars[day_char],days[rtc[3]][day_char]); //6 x day_char gives us the x pos for the char
        delay(SLIDE_DELAY);
      }
      //save the old day chars into the old_chars array at array pos 0-2. We use this next time we change the day and feed it to the animation as the current char. The updated char is fed in as the new char.
      old_chars[day_char] = days[rtc[3]][day_char];
    }

    //change the date tens digit (if needed) and ones digit. (the date ones digit wil alwaus change, but putting this in the 'if' loop makes it a bit neater code wise.)
    for (byte i = 7; i &amp;gt;= 6; i--){
      if (digits_old[i] != digits_new[i]) {
        for (byte seq = 0; seq &amp;lt;=8 ; seq++){
          itoa(digits_old[i],old_char,10);
          itoa(digits_new[i],new_char,10);
          slideanim(digits_x_pos[i],8,seq,old_char[0],new_char[0]);
          delay(SLIDE_DELAY);
        }
      }
    }

    //print the day suffix "nd" "rd" "th" etc. First work out date 2 letter suffix - eg st, nd, rd, th
    byte s = 3; //the pos to read our suffix array from.
    byte date = rtc[4];
    if(date == 1 || date == 21 || date == 31) {
      s = 0;
    }
    else if (date == 2 || date == 22) {
      s = 1;
    }
    else if (date == 3 || date == 23) {
      s = 2;
    }

    for (byte suffix_char = 0; suffix_char &amp;lt;=1 ; suffix_char++){
      for (byte seq = 0; seq &amp;lt;=8 ; seq++){
        slideanim((suffix_char*6)+36,8,seq,old_chars[suffix_char+3],suffix[s][suffix_char]); // we pass in the old_char array char as the current char and the suffix array as the new char
        delay(SLIDE_DELAY);
      }
      //save the suffic char in the old chars array at array pos 3 and 5.  We use these chars next time we change the suffix and feed it to the animation as the current char. The updated char is fed in as the new char.
      old_chars[suffix_char+3] = suffix[s][suffix_char];
    }
  }//end do date line
  */


  //save digita array tol old for comparison next loop
  for (byte i = 0; i &amp;lt;= 3; i++) {
    digits_old[i] =  digits_new[i];
  }
}//secs/oldsecs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}//while loop&lt;br&gt;
  fade_down();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//called by slide&lt;br&gt;
//this draws the animation of one char sliding on and the other sliding off. There are 8 steps in the animation, we call the function to draw one of the steps from 0-7&lt;br&gt;
//inputs are are char x and y, animation frame sequence (0-7) and the current and new chars being drawn.&lt;br&gt;
void slideanim(byte x, byte y, byte sequence, char current_c, char new_c) {&lt;/p&gt;

&lt;p&gt;//  To slide one char off and another on we need 9 steps or frames in sequence...&lt;/p&gt;

&lt;p&gt;//  seq# 0123456 &amp;lt;-rows of the display&lt;br&gt;
  //   |   |||||||&lt;br&gt;
  //  seq0 0123456  START - all rows of the display 0-6 show the current characters rows 0-6&lt;br&gt;
  //  seq1  012345  current char moves down one row on the display. We only see it's rows 0-5. There are at display positions 1-6 There is a blank row inserted at the top&lt;br&gt;
  //  seq2 6 01234  current char moves down 2 rows. we now only see rows 0-4 at display rows 2-6 on the display. Row 1 of the display is blank. Row 0 shows row 6 of the new char&lt;br&gt;
  //  seq3 56 0123&lt;br&gt;
  //  seq4 456 012  half old / half new char&lt;br&gt;
  //  seq5 3456 01&lt;br&gt;
  //  seq6 23456 0&lt;br&gt;
  //  seq7 123456&lt;br&gt;
  //  seq8 0123456  END - all rows show the new char&lt;/p&gt;

&lt;p&gt;//from above we can see...&lt;br&gt;
  //currentchar runs 0-6 then 0-5 then 0-4 all the way to 0. starting Y position increases by 1 row each time.&lt;br&gt;
  //new char runs 6 then 5-6 then 4-6 then 3-6. starting Y position increases by 1 row each time.&lt;/p&gt;

&lt;p&gt;//if sequence number is below 7, we need to draw the current char&lt;br&gt;
  if (sequence &amp;lt; 7) {&lt;br&gt;
    byte dots;&lt;br&gt;
    // if (current_c &amp;gt;= 'A' &amp;amp;&amp;amp;  || (current_c &amp;gt;= 'a' &amp;amp;&amp;amp; current_c &amp;lt;= 'z') ) {&lt;br&gt;
    //   current_c &amp;amp;= 0x1F;   // A-Z maps to 1-26&lt;br&gt;
    // }&lt;br&gt;
    if (current_c &amp;gt;= 'A' &amp;amp;&amp;amp; current_c &amp;lt;= 'Z' ) {&lt;br&gt;
      current_c &amp;amp;= 0x1F;   // A-Z maps to 1-26&lt;br&gt;
    }&lt;br&gt;
    else if (current_c &amp;gt;= 'a' &amp;amp;&amp;amp; current_c &amp;lt;= 'z') {&lt;br&gt;
      current_c = (current_c - 'a') + 41;   // A-Z maps to 41-67&lt;br&gt;
    }&lt;br&gt;
    else if (current_c &amp;gt;= '0' &amp;amp;&amp;amp; current_c &amp;lt;= '9') {&lt;br&gt;
      current_c = (current_c - '0') + 31;&lt;br&gt;
    }&lt;br&gt;
    else if (current_c == ' ') {&lt;br&gt;
      current_c = 0; // space&lt;br&gt;
    }&lt;br&gt;
    else if (current_c == '.') {&lt;br&gt;
      current_c = 27; // full stop&lt;br&gt;
    }&lt;br&gt;
    else if (current_c == '\'') {&lt;br&gt;
      current_c = 28; // single quote mark&lt;br&gt;
    }&lt;br&gt;
    else if (current_c == ':') {&lt;br&gt;
      current_c = 29; //colon&lt;br&gt;
    }&lt;br&gt;
    else if (current_c == '&amp;gt;') {&lt;br&gt;
      current_c = 30; // clock_mode selector arrow&lt;br&gt;
    }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;byte curr_char_row_max = 7 - sequence; //the maximum number of rows to draw is 6 - sequence number
byte start_y = sequence; //y position to start at - is same as sequence number. We inc this each loop

//plot each row up to row maximum (calculated from sequence number)
for (byte curr_char_row = 0; curr_char_row &amp;lt;= curr_char_row_max; curr_char_row++) {
  for (byte col = 0; col &amp;lt; 5; col++) {
    dots = pgm_read_byte_near(&amp;amp;myfont[current_c][col]);
    if (dots &amp;amp; (64 &amp;gt;&amp;gt; curr_char_row))
      plot(x + col, y + start_y, 1); //plot led on
    else
      plot(x + col, y + start_y, 0); //else plot led off
  }
  start_y++;//add one to y so we draw next row one down
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;//draw a blank line between the characters if sequence is between 1 and 7. If we don't do this we get the remnants of the current chars last position left on the display&lt;br&gt;
  if (sequence &amp;gt;= 1 &amp;amp;&amp;amp; sequence &amp;lt;= 8) {&lt;br&gt;
    for (byte col = 0; col &amp;lt; 5; col++) {&lt;br&gt;
      plot(x + col, y + (sequence - 1), 0); //the y position to draw the line is equivalent to the sequence number - 1&lt;br&gt;
    }&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;//if sequence is above 2, we also need to start drawing the new char&lt;br&gt;
  if (sequence &amp;gt;= 2) {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//work out char
byte dots;
//if (new_c &amp;gt;= 'A' &amp;amp;&amp;amp; new_c &amp;lt;= 'Z' || (new_c &amp;gt;= 'a' &amp;amp;&amp;amp; new_c &amp;lt;= 'z') ) {
//  new_c &amp;amp;= 0x1F;   // A-Z maps to 1-26
//}
if (new_c &amp;gt;= 'A' &amp;amp;&amp;amp; new_c &amp;lt;= 'Z' ) {
  new_c &amp;amp;= 0x1F;   // A-Z maps to 1-26
}
else if (new_c &amp;gt;= 'a' &amp;amp;&amp;amp; new_c &amp;lt;= 'z') {
  new_c = (new_c - 'a') + 41;   // A-Z maps to 41-67
}
else if (new_c &amp;gt;= '0' &amp;amp;&amp;amp; new_c &amp;lt;= '9') {
  new_c = (new_c - '0') + 31;
}
else if (new_c == ' ') {
  new_c = 0; // space
}
else if (new_c == '.') {
  new_c = 27; // full stop
}
else if (new_c == '\'') {
  new_c = 28; // single quote mark
}
else if (new_c == ':') {
  new_c = 29; // clock_mode selector arrow
}
else if (new_c == '&amp;gt;') {
  new_c = 30; // clock_mode selector arrow
}

byte newcharrowmin = 6 - (sequence - 2); //minimumm row num to draw for new char - this generates an output of 6 to 0 when fed sequence numbers 2-8. This is the minimum row to draw for the new char
byte start_y = 0; //y position to start at - is same as sequence number. we inc it each row

//plot each row up from row minimum (calculated by sequence number) up to 6
for (byte newcharrow = newcharrowmin; newcharrow &amp;lt;= 6; newcharrow++) {
  for (byte col = 0; col &amp;lt; 5; col++) {
    dots = pgm_read_byte_near(&amp;amp;myfont[new_c][col]);
    if (dots &amp;amp; (64 &amp;gt;&amp;gt; newcharrow))
      plot(x + col, y + start_y, 1); //plot led on
    else
      plot(x + col, y + start_y, 0); //else plot led off
  }
  start_y++;//add one to y so we draw next row one down
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//print a clock using words rather than numbers&lt;br&gt;
void word_clock() {&lt;/p&gt;

&lt;p&gt;cls();&lt;/p&gt;

&lt;p&gt;char numbers[19][10]   = {&lt;br&gt;
    "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten",&lt;br&gt;
    "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"&lt;br&gt;
  };&lt;br&gt;
  char numberstens[5][7] = {&lt;br&gt;
    "ten", "twenty", "thirty", "forty", "fifty"&lt;br&gt;
  };&lt;/p&gt;

&lt;p&gt;//potentially 3 lines to display&lt;br&gt;
  char str_a[8];&lt;br&gt;
  char str_b[8];&lt;br&gt;
  char str_c[8];&lt;/p&gt;

&lt;p&gt;//byte hours_y, mins_y; //hours and mins and positions for hours and mins lines&lt;/p&gt;

&lt;p&gt;byte hours = rtc[2];&lt;br&gt;
  if (hours &amp;gt; 12) {&lt;br&gt;
    hours = hours - ampm * 12;&lt;br&gt;
  }&lt;br&gt;
  if (hours &amp;lt; 1) {&lt;br&gt;
    hours = hours + ampm * 12;&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;get_time(); //get the time from the clock chip&lt;br&gt;
  byte old_mins = 100; //store mins in old_mins. We compare mins and old mins &amp;amp; when they are different we redraw the display. Set this to 100 initially so display is drawn when mode starts.&lt;br&gt;
  byte mins;&lt;/p&gt;

&lt;p&gt;//run clock main loop as long as run_mode returns true&lt;br&gt;
  while (run_mode()) {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//check for button press
if (buttonA.uniquePress()) {
  switch_mode();
  return;
}
if (buttonB.uniquePress()) {
  display_date();
}

get_time(); //get the time from the clock chip
mins = rtc[1];  //get mins


//if mins is different from old_mins - redraw display
if (mins != old_mins) {

  //update old_mins with current mins value
  old_mins = mins;

  //reset these for comparison next time
  mins = rtc[1];
  hours = rtc[2];

  //make hours into 12 hour format
  if (hours &amp;gt; 12) {
    hours = hours - 12;
  }
  if (hours == 0) {
    hours = 12;
  }

  //split mins value up into two separate digits
  int minsdigit = rtc[1] % 10;
  byte minsdigitten = (rtc[1] / 10) % 10;

  //if mins &amp;lt;= 10 , then top line has to read "minsdigti past" and bottom line reads hours
  if (mins &amp;lt; 10) {
    strcpy (str_a, numbers[minsdigit - 1]);
    strcpy (str_b, "PAST");
    strcpy (str_c, numbers[hours - 1]);
  }

  //if mins = 10, cant use minsdigit as above, so soecial case to print 10 past /n hour.
  if (mins == 10) {
    strcpy (str_a, numbers[9]);
    strcpy (str_b, " PAST");
    strcpy (str_c, numbers[hours - 1]);
  }

  //if time is not on the hour - i.e. both mins digits are not zero,
  //then make first line read "hours" and 2 &amp;amp; 3rd lines read "minstens"  "mins" e.g. "three /n twenty /n one"
  else if (minsdigitten != 0 &amp;amp;&amp;amp; minsdigit != 0  ) {

    strcpy (str_a, numbers[hours - 1]);

    //if mins is in the teens, use teens from the numbers array for the 2nd line, e.g. "fifteen"
    //if (mins &amp;gt;= 11 &amp;amp;&amp;amp; mins &amp;lt;= 19) {
    if (mins &amp;lt;= 19) {
      strcpy (str_b, numbers[mins - 1]);
    }
    else {
      strcpy (str_b, numberstens[minsdigitten - 1]);

      strcpy (str_c, numbers[minsdigit - 1]);
    }
  }
  // if mins digit is zero, don't print it. read read "hours" "minstens" e.g. "three /n twenty"
  else if (minsdigitten != 0 &amp;amp;&amp;amp; minsdigit == 0  ) {
    strcpy (str_a, numbers[hours - 1]);
    strcpy (str_b, numberstens[minsdigitten - 1]);
    strcpy (str_c, "");
  }

  //if both mins are zero, i.e. it is on the hour, the top line reads "hours" and bottom line reads "o'clock"
  else if (minsdigitten == 0 &amp;amp;&amp;amp; minsdigit == 0  ) {
    strcpy (str_a, numbers[hours - 1]);
    strcpy (str_b, "O'CLOCK");
    strcpy (str_c, "");
  }

}//end worknig out time

//run in a loop
//print line a "twelve"
byte len = 0;
while (str_a[len]) {
  len++;
}; //get length of message
byte offset_top = (31 - ((len - 1) * 4)) / 2; //

//plot hours line
byte i = 0;
while (str_a[i]) {
  puttinychar((i * 4) + offset_top, 1, str_a[i]);
  i++;
}

//hold display but check for button presses
int counter = 1000;
while (counter &amp;gt; 0){
  //check for button press
  if (buttonA.uniquePress()) {
    switch_mode();
    return;
  }
  if (buttonB.uniquePress()) {
    display_date();
  }
delay(1);
counter--;
}
fade_down();

//print line b
len = 0;
while (str_b[len]) {
  len++;
}; //get length of message
offset_top = (31 - ((len - 1) * 4)) / 2; 

i = 0;
while (str_b[i]) {
  puttinychar((i * 4) + offset_top, 1, str_b[i]);
  i++;
}

//hold display but check for button presses
counter = 1000;
while (counter &amp;gt; 0){
  if (buttonA.uniquePress()) {
    switch_mode();
    return;
  }
  if (buttonB.uniquePress()) {
    display_date();
  }
  delay(1);
  counter--;
}
fade_down();

//print line c if there.
len = 0;
while (str_c[len]) {
  len++;
}; //get length of message
offset_top = (31 - ((len - 1) * 4)) / 2; 

i = 0;
while (str_c[i]) {
  puttinychar((i * 4) + offset_top, 1, str_c[i]);
  i++;
}
counter = 1000;
while (counter &amp;gt; 0){
  //check for button press
  if (buttonA.uniquePress()) {
    switch_mode();
    return;
  }
  if (buttonB.uniquePress()) {
    display_date();
  }  
  delay(1);
  counter--;
}
fade_down();


//hold display blank but check for button presses before starting again.
counter = 1000;
while (counter &amp;gt; 0){
   //check for button press
  if (buttonA.uniquePress()) {
    switch_mode();
    return;
  }
  if (buttonB.uniquePress()) {
    display_date();
  }  
  delay(1);
  counter--;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  fade_down();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;/// scroll message - not used at present - too slow.&lt;br&gt;
void scroll() {&lt;/p&gt;

&lt;p&gt;char message[] = {"Hello There "};&lt;/p&gt;

&lt;p&gt;cls();&lt;br&gt;
  byte p = 6;      //current pos in string&lt;br&gt;
  byte chara[] = {0, 1, 2, 3, 4, 5}; //chars from string&lt;br&gt;
  int x[] = {0, 6, 12, 18, 24, 30}; //xpos for each char&lt;br&gt;
  byte y = 0;                   //y pos&lt;/p&gt;

&lt;p&gt;// clear_buffer();&lt;/p&gt;

&lt;p&gt;while (message[p] != '\0') {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//draw all 6 chars
for (byte c = 0; c &amp;lt; 6; c++) {

  putnormalchar(x[c],y,message[ chara[c] ]);


  //draw a line of pixels turned off after each char,otherwise the gaps between the chars have pixels left in them from the previous char
  for (byte yy = 0 ; yy &amp;lt; 8; yy ++) {
    plot(x[c] + 5, yy, 0);
  }

  //take one off each chars position
  x[c] = x[c] - 1;
}

//reset a char if it's gone off screen
for (byte i = 0; i &amp;lt;= 5; i++) {
  if (x[i] &amp;lt; -5 ) {
    x[i] = 31;
    chara[i] = p;
    p++;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//display_date - print the day of week, date and month with a flashing cursor effect&lt;br&gt;
void display_date()&lt;br&gt;
{&lt;/p&gt;

&lt;p&gt;cls();&lt;br&gt;
  //read the date from the DS1307&lt;/p&gt;

&lt;p&gt;byte dow = rtc[3]; // day of week 0 = Sunday&lt;br&gt;
  byte date = rtc[4];&lt;br&gt;
  byte month = rtc[5] - 1;&lt;/p&gt;

&lt;p&gt;//array of month names to print on the display. Some are shortened as we only have 8 characters across to play with&lt;br&gt;
  char monthnames[12][9] = {&lt;br&gt;
    "January", "February", "March", "April", "May", "June", "July", "August", "Sept", "October", "November", "December"&lt;br&gt;
  };&lt;/p&gt;

&lt;p&gt;//print the day name&lt;/p&gt;

&lt;p&gt;//get length of text in pixels, that way we can centre it on the display by divindin the remaining pixels b2 and using that as an offset&lt;br&gt;
  byte len = 0;&lt;br&gt;
  while(daysfull[dow][len]) { &lt;br&gt;
    len++; &lt;br&gt;
  }; &lt;br&gt;
  byte offset = (31 - ((len-1)*4)) / 2; //our offset to centre up the text&lt;/p&gt;

&lt;p&gt;//print the name&lt;br&gt;&lt;br&gt;
  int i = 0;&lt;br&gt;
  while(daysfull[dow][i])&lt;br&gt;
  {&lt;br&gt;
    puttinychar((i*4) + offset , 1, daysfull[dow][i]); &lt;br&gt;
    i++;&lt;br&gt;
  }&lt;br&gt;
  delay(1000);&lt;br&gt;
  fade_down();&lt;br&gt;
  cls();&lt;/p&gt;

&lt;p&gt;// print date numerals&lt;br&gt;
  char buffer[3];&lt;br&gt;
  itoa(date,buffer,10);&lt;br&gt;
  offset = 10; //offset to centre text if 3 chars - e.g. 3rd&lt;/p&gt;

&lt;p&gt;// first work out date 2 letter suffix - eg st, nd, rd, th etc&lt;br&gt;
  // char suffix[4][3]={"st", "nd", "rd", "th"  }; is defined at top of code&lt;br&gt;
  byte s = 3; &lt;br&gt;
  if(date == 1 || date == 21 || date == 31) {&lt;br&gt;
    s = 0;&lt;br&gt;
  } &lt;br&gt;
  else if (date == 2 || date == 22) {&lt;br&gt;
    s = 1;&lt;br&gt;
  } &lt;br&gt;
  else if (date == 3 || date == 23) {&lt;br&gt;
    s = 2;&lt;br&gt;
  } &lt;/p&gt;

&lt;p&gt;//print the 1st date number&lt;br&gt;
  puttinychar(0+offset, 1, buffer[0]);&lt;/p&gt;

&lt;p&gt;//if date is under 10 - then we only have 1 digit so set positions of sufix etc one character nearer&lt;br&gt;
  byte suffixposx = 4;&lt;/p&gt;

&lt;p&gt;//if date over 9 then print second number and set xpos of suffix to be 1 char further away&lt;br&gt;
  if (date &amp;gt; 9){&lt;br&gt;
    suffixposx = 8;&lt;br&gt;
    puttinychar(4+offset, 1, buffer[1]);&lt;br&gt;
    offset = 8; //offset to centre text if 4 chars&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;//print the 2 suffix characters&lt;br&gt;
  puttinychar(suffixposx+offset, 1, suffix[s][0]); &lt;br&gt;
  puttinychar(suffixposx+4+offset, 1, suffix[s][1]); &lt;/p&gt;

&lt;p&gt;delay(1000);&lt;br&gt;
  fade_down();&lt;/p&gt;

&lt;p&gt;//print the month name &lt;/p&gt;

&lt;p&gt;//get length of text in pixels, that way we can centre it on the display by divindin the remaining pixels b2 and using that as an offset&lt;br&gt;
  len = 0;&lt;br&gt;
  while(monthnames[month][len]) { &lt;br&gt;
    len++; &lt;br&gt;
  }; &lt;br&gt;
  offset = (31 - ((len-1)*4)) / 2; //our offset to centre up the text&lt;br&gt;
  i = 0;&lt;br&gt;
  while(monthnames[month][i])&lt;br&gt;
  {&lt;br&gt;&lt;br&gt;
    puttinychar((i*4) +offset, 1, monthnames[month][i]); &lt;br&gt;
    i++; &lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;delay(1000);&lt;br&gt;
  fade_down();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//dislpay menu to change the clock mode&lt;br&gt;
void switch_mode() {&lt;/p&gt;

&lt;p&gt;//remember mode we are in. We use this value if we go into settings mode, so we can change back from settings mode (6) to whatever mode we were in.&lt;br&gt;
  old_mode = clock_mode;&lt;/p&gt;

&lt;p&gt;char* modes[] = {&lt;br&gt;
    "Basic", "Small", "Slide", "Words", "Setup"&lt;br&gt;
  };&lt;/p&gt;

&lt;p&gt;byte next_clock_mode;&lt;br&gt;
  byte firstrun = 1;&lt;/p&gt;

&lt;p&gt;//loop waiting for button (timeout after 35 loops to return to mode X)&lt;br&gt;
  for (int count = 0; count &amp;lt; 35 ; count++) {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//if user hits button, change the clock_mode
if (buttonA.uniquePress() || firstrun == 1) {

  count = 0;
  cls();

  if (firstrun == 0) {
    clock_mode++;
  }
  if (clock_mode &amp;gt; NUM_DISPLAY_MODES + 1 ) {
    clock_mode = 0;
  }

  //print arrown and current clock_mode name on line one and print next clock_mode name on line two
  char str_top[9];

  //strcpy (str_top, "-");
  strcpy (str_top, modes[clock_mode]);

  next_clock_mode = clock_mode + 1;
  if (next_clock_mode &amp;gt;  NUM_DISPLAY_MODES + 1 ) {
    next_clock_mode = 0;
  }

  byte i = 0;
  while (str_top[i]) {
    putnormalchar(i * 6, 0, str_top[i]);
    i++;
  }
  firstrun = 0;
}
delay(50);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//run clock main loop as long as run_mode returns true&lt;br&gt;
byte run_mode() {&lt;/p&gt;

&lt;p&gt;//if random mode is on... check the hour when we change mode.&lt;br&gt;
  if (random_mode) {&lt;br&gt;
    //if hour value in change mode time = hours. then reurn false = i.e. exit mode.&lt;br&gt;
    if (change_mode_time == rtc[2]) {&lt;br&gt;
      //set the next random clock mode and time to change it&lt;br&gt;
      set_next_random();&lt;br&gt;
      //exit the current mode.&lt;br&gt;
      return 0;&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
  //else return 1 - keep running in this mode&lt;br&gt;
  return 1;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//set the next hour the clock will change mode when random mode is on&lt;br&gt;
void set_next_random() {&lt;/p&gt;

&lt;p&gt;//set the next hour the clock mode will change - current time plus 1 - 4 hours&lt;br&gt;
  get_time();&lt;br&gt;
  change_mode_time = rtc[2] + random (1, 5);&lt;/p&gt;

&lt;p&gt;//if change_mode_time now happens to be over 23, then set it to between 1 and 3am&lt;br&gt;
  if (change_mode_time &amp;gt; 23) {&lt;br&gt;
    change_mode_time = random (1, 4);&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;//set the new clock mode&lt;br&gt;
  clock_mode = random(0, NUM_DISPLAY_MODES + 1);  //pick new random clock mode&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//dislpay menu to change the clock settings&lt;br&gt;
void setup_menu() {&lt;/p&gt;

&lt;p&gt;char* set_modes[] = {&lt;br&gt;
     "Rndom", "24 Hr","Set", "Brght", "Exit"}; &lt;br&gt;
  if (ampm == 0) { &lt;br&gt;
    set_modes[1] = ("12 Hr"); &lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;byte setting_mode = 0;&lt;br&gt;
  byte next_setting_mode;&lt;br&gt;
  byte firstrun = 1;&lt;/p&gt;

&lt;p&gt;//loop waiting for button (timeout after 35 loops to return to mode X)&lt;br&gt;
  for(int count=0; count &amp;lt; 35 ; count++) {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//if user hits button, change the clock_mode
if(buttonA.uniquePress() || firstrun == 1){

  count = 0;
  cls();

  if (firstrun == 0) { 
    setting_mode++; 
  } 
  if (setting_mode &amp;gt; NUM_SETTINGS_MODES) { 
    setting_mode = 0; 
  }

  //print arrown and current clock_mode name on line one and print next clock_mode name on line two
  char str_top[9];

  strcpy (str_top, set_modes[setting_mode]);

  next_setting_mode = setting_mode + 1;
  if (next_setting_mode &amp;gt; NUM_SETTINGS_MODES) { 
    next_setting_mode = 0; 
  }

  byte i = 0;
  while(str_top[i]) {
    putnormalchar(i*6, 0, str_top[i]); 
    i++;
  }

  firstrun = 0;
}
delay(50); 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;//pick the mode &lt;br&gt;
  switch(setting_mode){&lt;br&gt;
    case 0: &lt;br&gt;
      set_random(); &lt;br&gt;
      break;&lt;br&gt;
    case 1: &lt;br&gt;
       set_ampm(); &lt;br&gt;
      break;&lt;br&gt;
    case 2: &lt;br&gt;
      set_time(); &lt;br&gt;
      break;&lt;br&gt;
    case 3: &lt;br&gt;
       set_intensity(); &lt;br&gt;
      break;&lt;br&gt;
    case 4: &lt;br&gt;
      //exit menu&lt;br&gt;
      break;&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;//change the clock from mode 6 (settings) back to the one it was in before &lt;br&gt;
  clock_mode=old_mode;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//toggle random mode - pick a different clock mode every few hours&lt;br&gt;
void set_random(){&lt;br&gt;
  cls();&lt;/p&gt;

&lt;p&gt;char text_a[9] = "Off";&lt;br&gt;
  char text_b[9] = "On";&lt;br&gt;
  byte i = 0;&lt;/p&gt;

&lt;p&gt;//if random mode is on, turn it off&lt;br&gt;
  if (random_mode){&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//turn random mode off
random_mode = 0;

//print a message on the display
while(text_a[i]) {
  putnormalchar((i*6), 0, text_a[i]);
  i++;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;} else {&lt;br&gt;
    //turn randome mode on. &lt;br&gt;
    random_mode = 1;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//set hour mode will change
set_next_random();

//print a message on the display
while(text_b[i]) {
  putnormalchar((i*6), 0, text_b[i]);
  i++;
}  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;} &lt;br&gt;
  delay(1500); //leave the message up for a second or so&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//set 12 or 24 hour clock&lt;br&gt;
void set_ampm() {&lt;/p&gt;

&lt;p&gt;// AM/PM or 24 hour clock mode - flip the bit (makes 0 into 1, or 1 into 0 for ampm mode)&lt;br&gt;
  ampm = (ampm ^ 1);&lt;br&gt;
  cls();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//change screen intensityintensity&lt;br&gt;
void set_intensity() {&lt;/p&gt;

&lt;p&gt;cls();&lt;/p&gt;

&lt;p&gt;byte i = 0;&lt;br&gt;
  char text[7] = "Bright";&lt;br&gt;
  while(text[i]) {&lt;br&gt;
    puttinychar((i*4)+4, 0, text[i]);&lt;br&gt;
    i++;&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;//wait for button input&lt;br&gt;
  while (!buttonA.uniquePress()) {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;levelbar (0,6,(intensity*2)+2,2);    //display the intensity level as a bar
while (buttonB.isPressed()) {

  if(intensity == 15) { 
    intensity = 0;
    cls (); 
  } 
  else {
    intensity++; 
  }
  //print the new value 
  i = 0;
  while(text[i]) {
    puttinychar((i*4)+4, 0, text[i]);
    i++;
  }

  //display the intensity level as a bar
  levelbar (0,6,(intensity*2)+2,2);    

  //change the brightness setting on the displays
  for (byte address = 0; address &amp;lt; 4; address++) {
    lc.setIntensity(address, intensity);
  }
  delay(150);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// display a horizontal bar on the screen at offset xposr by ypos with height and width of xbar, ybar&lt;br&gt;
void levelbar (byte xpos, byte ypos, byte xbar, byte ybar) {&lt;br&gt;
  for (byte x = 0; x &amp;lt; xbar; x++) {&lt;br&gt;
    for (byte y = 0; y &amp;lt;= ybar; y++) {&lt;br&gt;
      plot(x+xpos, y+ypos, 1);&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//set time and date routine&lt;br&gt;
void set_time() {&lt;/p&gt;

&lt;p&gt;cls();&lt;/p&gt;

&lt;p&gt;//fill settings with current clock values read from clock&lt;br&gt;
  get_time();&lt;br&gt;
  byte set_min   = rtc[1];&lt;br&gt;
  byte set_hr    = rtc[2];&lt;br&gt;
  byte set_date  = rtc[4];&lt;br&gt;
  byte set_mnth  = rtc[5];&lt;br&gt;
  int  set_yr    = rtc[6]; &lt;/p&gt;

&lt;p&gt;//Set function - we pass in: which 'set' message to show at top, current value, reset value, and rollover limit.&lt;br&gt;
  set_date = set_value(2, set_date, 1, 31);&lt;br&gt;
  set_mnth = set_value(3, set_mnth, 1, 12);&lt;br&gt;
  set_yr   = set_value(4, set_yr, 2013, 2099);&lt;br&gt;
  set_hr   = set_value(1, set_hr, 0, 23);&lt;br&gt;
  set_min  = set_value(0, set_min, 0, 59);&lt;/p&gt;

&lt;p&gt;ds1307.adjust(DateTime(set_yr, set_mnth, set_date, set_hr, set_min));&lt;/p&gt;

&lt;p&gt;cls();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;//used to set min, hr, date, month, year values. pass &lt;br&gt;
//message = which 'set' message to print, &lt;br&gt;
//current value = current value of property we are setting&lt;br&gt;
//reset_value = what to reset value to if to rolls over. E.g. mins roll from 60 to 0, months from 12 to 1&lt;br&gt;
//rollover limit = when value rolls over&lt;br&gt;
int set_value(byte message, int current_value, int reset_value, int rollover_limit){&lt;/p&gt;

&lt;p&gt;cls();&lt;br&gt;
  char messages[6][17]   = {&lt;br&gt;
    "Set Mins", "Set Hour", "Set Day", "Set Mnth", "Set Year"};&lt;/p&gt;

&lt;p&gt;//Print "set xyz" top line&lt;br&gt;
  byte i = 0;&lt;br&gt;
  while(messages[message][i])&lt;br&gt;
  {&lt;br&gt;
    puttinychar(i*4 , 1, messages[message][i]); &lt;br&gt;
    i++;&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;delay(2000);&lt;br&gt;
  cls();&lt;/p&gt;

&lt;p&gt;//print digits bottom line&lt;br&gt;
  char buffer[5] = "    ";&lt;br&gt;
  itoa(current_value,buffer,10);&lt;br&gt;
  puttinychar(0 , 1, buffer[0]); &lt;br&gt;
  puttinychar(4 , 1, buffer[1]); &lt;br&gt;
  puttinychar(8 , 1, buffer[2]); &lt;br&gt;
  puttinychar(12, 1, buffer[3]); &lt;/p&gt;

&lt;p&gt;delay(300);&lt;br&gt;
  //wait for button input&lt;br&gt;
  while (!buttonA.uniquePress()) {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;while (buttonB.isPressed()){

  if(current_value &amp;lt; rollover_limit) { 
    current_value++;
  } 
  else {
    current_value = reset_value;
  }
  //print the new value
  itoa(current_value, buffer ,10);
  puttinychar(0 , 1, buffer[0]); 
  puttinychar(4 , 1, buffer[1]); 
  puttinychar(8 , 1, buffer[2]); 
  puttinychar(12, 1, buffer[3]);    
  delay(150);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
  return current_value;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void get_time()&lt;br&gt;
{&lt;br&gt;
  //get time&lt;br&gt;
  DateTime now = ds1307.now();&lt;br&gt;
  //save time to array&lt;br&gt;
  rtc[6] = now.year();&lt;br&gt;
  rtc[5] = now.month();&lt;br&gt;
  rtc[4] = now.day();&lt;br&gt;
  rtc[3] = now.dayOfTheWeek(); //returns 0-6 where 0 = Sunday&lt;br&gt;
  rtc[2] = now.hour();&lt;br&gt;
  rtc[1] = now.minute();&lt;br&gt;
  rtc[0] = now.second();&lt;/p&gt;

&lt;p&gt;//flash arduino led on pin 13 every second&lt;br&gt;
  //if ( (rtc[0] % 2) == 0) {&lt;br&gt;
  //  digitalWrite(13, HIGH);&lt;br&gt;
  //}&lt;br&gt;
  //else {&lt;br&gt;
  //  digitalWrite(13, LOW);&lt;br&gt;
  //}&lt;/p&gt;

&lt;p&gt;//print the time to the serial port - useful for debuging RTC issues&lt;br&gt;
  /*&lt;br&gt;
  Serial.print(rtc[2]);&lt;br&gt;
  Serial.print(":");&lt;br&gt;
  Serial.print(rtc[1]);&lt;br&gt;
  Serial.print(":");&lt;br&gt;
  Serial.println(rtc[0]);&lt;br&gt;
  */&lt;br&gt;
}&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
