adafruit 1480 & wire

algemene C code
Berichten: 49
Geregistreerd: 09 Mei 2015, 15:57

adafruit 1480 & wire

Berichtdoor doebi » 04 Apr 2016, 19:53

Hallo,

Vooraf alles afzonderlijk getest, het ging goed, maar dan ....

Ik krijg een vreemde situatie, als ik in de code hieronder alles van I2C in commentaar zet,
werkt mijn adafruit 1480 prima.
Doe ik dit niet, dan werkt het aangesloten relayboard prima, het programma doet zijn loops, scant de toetsen af ,
maar mijn adafruit 1480 wil dan niet werken (bij opstart direct een wit scherm).

Beide afzonderlijk werken wel, de adafruit werkt via SPI en zou geen problemen mogen hebben wanneer de
arduino I2C functies doet ...

De adafruit blokeert al onmiddellijk bij de eerste wire functie aanroep (Wire.begin() )

Kind of lost, iemand nog een idee ?

cpp code
/***************************************************
VL3
----> http://www.adafruit.com/products/1480
----> MAX7219ENG
----> CLICK TOUCH pannel

Color definitions for TFT SPI 2.2" Display
ILI9340_BLACK 0x0000
ILI9340_BLUE 0x001F
ILI9340_RED 0xF800
ILI9340_GREEN 0x07E0
ILI9340_CYAN 0x07FF
ILI9340_MAGENTA 0xF81F
ILI9340_YELLOW 0xFFE0
ILI9340_WHITE 0xFFFF
***************************************************/
#include <Keypad.h> // need the library for the keypad
#include <SPI.h> // need the library for ADA 1480 SPI controls
#include "Adafruit_GFX.h" // need the library for ADA 1480
#include "Adafruit_ILI9340.h" // need the library for ADA 1480
#include <Wire.h> // need the library for I2C
#include <LedControl.h> // need the library for max7219ENG works with common kathode
#include <EEPROM.h> // need the library for reading and writing minutes who are passed sinds startup
#include <avr/pgmspace.h>
//#include <avr/wdt.h> // need the wathdog library

// number of items in an array
template< typename T, size_t N > size_t ArraySize (T (&) [N]){ return N; }


// Leonardo
#define _dc 3
#define _rst 4
#define _cs 6
#define _miso 14
#define _sclk 15
#define _mosi 16


// Wiring sort leonardo vs adadfruit 1480
// NAME LEONARDO LCD ADAFRUIT 1480
// MISO ICP1 MISO 08 MISO
// +5V ICP2 VCC 02 VIN
// SCK ICP3 SCK 09 SCK
// MOSI ICP4 MOSI 07 MOSI
// GND ISP6 GND 01 GND
// D/C DIGI 3 03 D/C
// RESET DIGI 4 04 RESET
// LCD/CS DIGI 6 06 LCD/CS
// BACKLIGHT +5V 10 BACKLIGHT


// Wiring sort adafruit 1480 vs leonardo
// NAME LEONARDO LCD ADAFRUIT 1480
// GND ISP6 GND 01 GND
// +5V ICP2 VCC 02 VIN
// D/C DIGI 3 03 D/C
// RESET DIGI 4 04 RESET
// LCD/CS DIGI 6 06 LCD/CS
// MOSI ICP4 MOSI 07 MOSI
// MISO ICP1 MISO 08 MISO
// SCK ICP3 SCK 09 SCK
// BACKLIGHT +5V 10 BACKLIGHT


// Wiring sort leonardo vs MAX7219
// LEONARDO MAX7219ENG
// DIGI 10 12 LOAD
// DIGI 11 13 CLK
// DIGI 12 01 DIN
// +5V 19 V+
// GND 04 GND
// GND 09 GND

// Wiring sort leonardo vs clicktouchpannel
// LEONARDO CLICK TOUCH touch pannel
// A0 1 COL 1 (FROM BACKSIDE VIEW = MOST RIGHT)
// A1 2 COL 2
// A2 3 COL 3
// A3 4 COL 4
// A4 5 ROW 1
// A5 6 ROW 2
// DIGI 8 7 ROW 3
// DIGI 9 8 ROW 4 (FROM BACKSIDE VIEW = MOST LEFT)




// Using software SPI is really not suggested, its incredibly slow
// Adafruit_ILI9340 tft = Adafruit_ILI9340(_cs, _dc, _mosi, _sclk, _rst, _miso);
// Use hardware SPI

Adafruit_ILI9340 tft = Adafruit_ILI9340(_cs, _dc, _rst); // tft is our adadfruit ILI9340 control object

LedControl lc = LedControl(12, 11, 10, 1); // lc is our led control object
// arduino leonardo pin 12 is connected to the MAX7219 DIN pin 1
// arduino leonardo pin 11 is connected to the MAX7219 CLK pin 13
// arduino leonardo pin 10 is connected to the MAX7219 LOAD pin 12
// 1 as we are only using 1 MAX7219
// gnd on MAX7219 GND pin 4 and pin 9
// 5V on MAX7219 V+ pin 19
// resistor 10K betweenMAX7219 V+ pin 19 and ISET 18

// Define a structure for the input fuses

struct StrFuseList {
char FuseInputNr;
char FuseInputNameSmall[5];
char FuseInputName[20];
char FuseValue[5];
};

const StrFuseList FuseList[] PROGMEM = {
{ 1 , "F1", "Battery", "35A"},
{ 2 , "F2", "Charging", "25A"},
{ 3 , "F3", "Fuse", "1A"},
{ 4 , "F4", "Fuse", "1A"},
{ 5 , "F5", "Fuse", "1A"},
{ 6 , "FA1", "Fuse", "1A"},
{ 7 , "FA2", "IGN", "1A"},
{ 8 , "FA3", "FUEL PUMP", "3A"},
{ 9 , "FA4", "STROBE + NAV LIGHT", "3A"},
{ 10, "FA5", "HYDRAUL.PUMP", "30A"},
{ 11, "FA6", "WHEEL RETRACTION", "2A"},
{ 12, "FA7", "LANDING LIGHT", "1A"},
{ 13, "FA8", "CONSTANTSPEED", "5A"},
{ 14, "FA9", "PITOT HEATING", "2A"},
{ 15, "FA10", "SOCKET 12V", "5A"},
{ 16, "FA11", "USB 5V", "2A"},
{ 17, "FA12", "SPEED FLAPS", "?A"},
{ 18, "FA13", "SPEED WHEELS", "?A"},
{ 19, "FA14", "FLAPS", "7.5A"},
{ 20, "FA15", "AVIONICS RELE", "1A"},
{ 21, "FA16", "BACKUP CHARGER", "5A"},
{ 22, "FA17", "BACKUP BATTERY", "?A"},
{ 23, "FB1", "AX SERVO", "5A"},
{ 24, "FB2", "XPNDR", "3A"},
{ 25, "FB3", "COM", "5A"},
{ 26, "FB4", "GSU 25", "2A"},
{ 27, "FB5", "GEA 24", "2A"},
{ 28, "FB6", "GDU 460 LEFT", "5A"},
{ 29, "FB8", "TCA5", "?A"},
{ 30, "FB9", "GDU 460 RIGHT", "5A"},
{ 31, "FB10", "GMC307", "1A"}
};


// Define a structure for our menu text output view
struct StrMenu {
char textLineBold[20] ; // De tekst die in het vet moet staan (Hoofdtitel of subtitel)
char textLineNormal[23] ; // De tekst die normaal moet staan (Naast de subtitel)
boolean isMenuName; // Is het een hoofdtitel of een subtitel, true = hoofdtitel of menunaam
char nrMenu; // volgnummer, gelijke nummers horen bij elkaar
};


// Define a structure for our menu list
const StrMenu MenuList[] PROGMEM = {
{ "BEFORE FLIGHT CHECK" , "", true , 0 } ,
{ "AERODOME REGISTER", "FILLED IN", false , 0 },
{ "MASTER SWITCH" , "ON",false,0 },
{ "FUEL LEVEL" , "CHECK",false,0 },
{ "MASTER SWITCH", "OFF",false,0 },
//0+5=5
{ "EXTERNAL", "",true,1 },
{ "EXTERNAL", "COMPLETED",false,1 },
//5+2=7
{ "BEFORE ENGINE START", "",true,2 },
{ "SAFETY BELTS", "FASTEN",false,2 },
{ "CANOPY", "CLOSE LOCK",false,2 },
{ "SWITCHES", "OFF",false,2 },
{ "CIRCUIT BRAKERS", "ON",false,2 },
{ "BRAKES", "HOLD(OR PARKING BRAKE)",false,2 },
//7+6=13
{ "ENGINE START", "",true,3 },
{ "LANDING GEAR", "SWITCHED DOWN",false,3 },
{ "MASTER SWITCH", "ON",false,3 },
{ "FUELS VALVES", "OPEN ON LOWEST",false,3 },
{ "FUEL POMP", "CHECK",false,3 },
//13+5=18
{ "TAXI", "",true,4 },
{ "BRAKES", "CHECK",false,4 },
{ "SLIP INDICATOR", "CHECK",false,4 },
{ "COMPASS", "CHECK",false,4 },
//18+4=22
{ "RUN UP PART 1", "",true,5 },
{ "FULL TANK", "FULLEST(min 2min.)",false,5 },
{ "ENGINE INSTR.", "Oil press.1,5-5,0bar",false,5 },
{ "ENGINE INSTR.", "Oil temp. 50-110°C",false,5 },
{ "ENGINE INSTR.", "CHT max 110°C",false,5 },
{ "ENGINE INSTR.", "EGT max 900°C",false,5 },
{ "THROTTLE", "3000 RPM",false,5 },
{ "MAGNETOS", "CHECK-L,R,BOTH",false,5 },
{ "PROPELLER", "MANUAL/CHECK",false,5 },
{ "THROTTLE", "IDLE(+/-1400RPM)",false,5 },

{ "RUN UP PART 2", "",true,6 },
{ "FLIGHT CONTROLS", "FREE AND CORRECT",false,6 },
{ "TRIM", "NEUTRAL+TRAVELLING",false,6 },
{ "FLAPS", "POS.2+TRAVELLING",false,6 },
{ "FUEL TANK", "FULLEST/BOTH",false,6 },
{ "MAGNETOS", "BOTH",false,6 },
{ "ALTIMETER", "SET(ALSO EFIS)",false,6 },
{ "SAFETY BELTS", "FASTEN",false,6 },
{ "CANOPY", "CLOSED,LOCKED",false,6 },
{ "PROPELLER", "FULLY FINE(+/-5500RPM)",false,6 },
//22+20=42
{ "TAKE-OFF", "",true,7 },
{ "FUEL PUMP", "ON",false,7 },
{ "THROTTLE", "FULL OPEN",false,7 },
//42+3=45
{ "AFTER TAKE-OFF", "",true,8 },
{ "SPEED", "100",false,8},
{ "BRAKES", "APPLY (RG)",false,8},
{ "FLAPS", "UP",false,8 },
{ "GEAR", "UP AT 300FT",false,8 },
{ "MAP", "REDUCE TO OPTIMAL",false,8 },
{ "THROTTLE", "REDUCE TO OPTIMAL",false,8 },
{ "LANDING LIGHTS", "OFF",false,8 },
{ "CLIMB SPEED", "130KM/H",false,8 },
{ "FUEL PUMP", "OFF",false,8 },
//45+10=55
{ "CRUISSE", "",true,9 },
{ "THROTTLE", "AS REQUIRED",false,9 },
{ "SPEED", "AS REQUIRED",false,9 },
//55+3=58


{ "DOWNWIND", "",true,10 },
{ "ENGINE INSTR.", "CHECK",false,10},
{ "FUEL PUMP", "ON",false,10},
{ "LANDING LIGHTS", "ON",false,10},
{ "SAFETY BELTS", "FASTEN",false,10},
{ "SPEED", "140km/h",false,10},
{ "PROPELLER", "FULLY FINE(+-5500RPM)",false,10},
{ "LANDING GEAR", "DOWN 3GREENS",false,10},
{ "SPEED", "110km/h",false,10},
{ "FLAPS", "POSITION 1",false,10},
// 58+10 = 68

{ "BASE LEG", "",true,11},
{ "RPM", "AS REQUIRED",false,11},
{ "SPEED", "100km/h",false,11},
{ "FLAPS", "POSITION 2",false,11},
// 68+4 = 72

{ "FINAL", "",true,12},
{ "FLAPS", "POSITION 2(OR 3)",false,12},
{ "SPEED", "100km/h",false,12},
// 72+3 = 75

{ "AFTER LANDING", "",true,13},
{ "FLAPS", "UP",false,13},
{ "TRIM", "NEUTRAL",false,13},
{ "FUEL PUMP", "OFF",false,13},
// 75+5 = 79

{ "SHUT DOWN", "",true,14},
{ "AVIONICS", "OFF",false,14},
{ "SWITCHES", "OFF",false,14},
{ "POSITION LIGHTS", "OFF",false,14},
{ "THROTTLE", "MIN.(2000RPM)",false,14},
{ "MAGNETOS", "OFF",false,14},
{ "MASTER SWITCH", "OFF",false,14},
{ "LOGBOOK", "COMPLETED",false,14}
// 79+8 = 87

};



// Hieronder globle variabelen of const ivm de menu afhandeling
const char PROGMEM MenuMin = 0; // Hierin staat het startadres van de menulines (het hoeft dus niet perse 0 te zijn in de declaratie)
const char PROGMEM MenuChapters = 14; // Hierin staat het aantal hoofdstukken van het menu
const char PROGMEM MenuMax = 87; // MenuList.size(); //68 = 68-1 (67 = total menulines, -1 cause of starting from 0);
char MenuNr = 0;
char MenuNrOld = 255;
char key;

// Hieronder globale variabelen of const ivm met de EEPROM en tijd-telling
unsigned long EEPROMDagTeller; // Hierin staat het aantal millis dat de vorige keer werd weggeschreven naar de EEPROM, veranderd gedurig
unsigned long EEPROMTotaalTeller ; // Hierin staat het aantal millis dat bij de opstart van het programma werd uitgelezen uit de EEPROM, eenmalig !
unsigned long EEPROMDagOldMillis = 0; // Hierin staat het aantal millis dat er voorbij zijn tijdens het opstart van deze sessie in de ARDUINO
const char PROGMEM EEPROMAdresDagTeller = 100 ; // op deze locatie in de EEPROM staat de dagteller in millis
const char PROGMEM EEPROMAdresTotaalTeller = 110 ; // op deze locatie in de EEPROM staat de totaalteller in millis

// Hieronder globale variabelen ivm de 4 aan te sturen relais
bool relayPump = false;
bool relayNaf = false;
bool relayST = false;
bool relayLL = false;
bool relayPitot = false;

// Hieronder variablen, declaraties ivm het clicktouch keypad
#define KEYPADROWS 4
#define KEYPADCOLS 4
#define key0 0
#define keyEnd 1
#define keyHome 2
#define keyLL 3
#define keyRight 4
#define keyOk 5
#define keyCorrection 6
#define keyST 7
#define keyMin 8
#define keyPlus 9
#define keyPitot 10
#define keyPump 11
#define keyDown 12
#define keyLeft 13
#define keyUp 14
#define keyNaf 15

char keys[KEYPADROWS][KEYPADCOLS] = {
{ key0,keyEnd,keyHome,keyLL },
{ keyRight,keyOk,keyCorrection,keyST },
{ keyMin,keyPlus,keyPitot,keyPump },
{ keyDown,keyLeft,keyUp,keyNaf }
};

byte colPins[KEYPADCOLS] = { A0, A1, A2, A3 }; //connect to the column pinouts of the keypad
byte rowPins[KEYPADROWS] = { A4, A5, 8, 9 }; //connect to the row pinouts of the keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEYPADROWS, KEYPADCOLS);


// hieronder variabelen om de dagteller en de totaalteller te resetten
char keyCToReset = 0; // 3 keer C na elkaar is reset dagteller
char keyOKToReset = 0; // 5 keer ok en dan 3 keer C na elkaar is reset totaalteller


// hieronder variablen voor de in en uitgangskaarten
byte OldOutputValue = 0xFF; // deze wordt gebruikt om het scherm of de IIC te activeren, als de nieuwe outputvalues <> oldoutputvalue
const int OutputCard01 = 0x27; // 3 adress bits op 1
const int InputCard01 = 0x20; // 3 adress bits op 0
const int InputCard02 = 0x22; // middelste adres bit op 1
// MCP23017 internal registers - Not all registers included. See the Microchip MCP23017 datasheet for full list
const byte IODIRA = 0x00; // Port A direction register. Write a 0 to make a pin an output, a 1 to make it an input
const byte IODIRB = 0x01; // Port B DDD ?
const byte GPIOA = 0x12; // Register Address of Port A - read data from or write output data to this port
const byte GPIOB = 0x13; // Register B DDD ?
const byte GPPUA = 0x0c; // Register to enable the internal pull up resistors on Port A. 1 = pull up enabled
const byte GPPUB = 0x0d; // Register B DDD ?


void setup() {
/*

Wire.begin();


Wire.begin();
// Outputcard01 Set A port as output
Wire.beginTransmission(OutputCard01);
Wire.write(IODIRA); // IODIRA register
Wire.write(0x00); // set all of port A to outputs
Wire.endTransmission();

// Outputcard01 Set B port as output
Wire.beginTransmission(OutputCard01);
Wire.write(IODIRB); // IODIRB register
Wire.write(0x00); // set all of port B to outputs
Wire.endTransmission();

*/

/*
// InputCard01 Set A port as input Er zijn externe pull ups , dus geen GPPUA setten !
Wire.beginTransmission(InputCard01);
Wire.write(IODIRA); // IODIRA register
Wire.write(0xFF); // set all of port A to outputs
Wire.endTransmission();

// InputCard01 Set B port as input Er zijn externe pull ups , dus geen GPPUA setten !
Wire.beginTransmission(InputCard01);
Wire.write(IODIRA); // IODIRA register
Wire.write(0xFF); // set all of port A to outputs
Wire.endTransmission();

// InputCard02 Set A port as input Er zijn externe pull ups , dus geen GPPUB setten !
Wire.beginTransmission(InputCard02);
Wire.write(IODIRA); // IODIRA register
Wire.write(0xFF); // set all of port A to outputs
Wire.endTransmission();

// InputCard02 Set B port as input Er zijn externe pull ups , dus geen GPPUB setten !
Wire.beginTransmission(InputCard02);
Wire.write(IODIRA); // IODIRA register
Wire.write(0xFF); // set all of port A to outputs
Wire.endTransmission();
*/
Serial.begin(9600);

tft.begin();

showScreenWelcome();

delay(5000); // 5 seconden tijd om de seriele monitor aan te zetten

//EEPROMTimeWrite(0UL,EEPROMAdresDagTeller); // DEZE LIJN IS SLECHTS 1 MALIG UIT TE VOEREN OM ZEKER TE ZIJN DAT DE DAGTELLER OP 0 STAAT
//EEPROMTimeWrite(0UL,EEPROMAdresTotaalTeller); // DEZE LIJN IS SLECHTS 1 MALIG UIT TE VOEREN OM ZEKER TE ZIJN DAT DE TOTAALTELLER OP 0 STAAT

EEPROMDagTeller = EEPROMTimeRead(EEPROMAdresDagTeller); // LEES BIJ OPSTART DE DAGTELLER
EEPROMTotaalTeller = EEPROMTimeRead(EEPROMAdresTotaalTeller); // LEES BIJ OPSTART DE TOTAALTELLER

lc.shutdown(0, false);// turn off power saving, enables display
lc.setIntensity(0, 8);// sets brightness (0~15 possible values)
lc.clearDisplay(0);// clear screen


// The watchdog timer on the Arduino microcontrollers can operate in four different modes:
//Disabled: the program simply gets stuck if it runs into an infinite loop
//Reset: if wdt_reset() is not called within every timeout period, the watchdog
// timer will reset the program and it will start again from the beginning
//Interrupt: an interrupt will be generated if wdt_reset()
// isn’t called within every timeout period
//Interrupt + reset: a combination of the last two. If wdt_reset() isn’t called within the timeout
// period, the watchdog timer will first raise an interrupt. Then, if wdt_reset()
// isn’t called within another timeout period, the program will reset and start again
// wdt_enable(WDTO_5S); // Zet de ARDUINO watchdog aan, dit betekent dat een programmauitvoering nooit langer dan 2 sec mag duren tussen 2 wdt_reset() aanroepen
// wdt_disable();



// Wire.begin();
}




void loop(void) {
handleEEPROMTime();
handleLC();
handleKey();
handleMenu();

// handleInputFuses();

}

void handleKey(){

key = keypad.getKey();

if (key != NO_KEY) { // als er een toest is ingedrukt

handleResetTimeCounters(key);

ShowKey(key); // toon ook de toets die werd ingedrukt

switch (key) { // Test welke toets werd ingedrukt
case keyPump : // De pump ?
relayPump = !relayPump;
break;
case keyNaf : // De Naf ?
relayNaf = !relayNaf;
break;
case keyST : // De ST ?
relayST = !relayST;
break;
case keyLL : // De LL ?
relayLL = !relayLL;
break;
case keyPitot : // De Pitot ?
relayPitot = !relayPitot;
break;
case keyHome: // De Home ?
MenuNr = MenuMin;
break;
case keyEnd: // De End ?
MenuNr = MenuChapters;
break;
case keyUp: case keyPlus : // De Up of Plus ?
if (MenuNr > MenuMin) {
MenuNr--;
}
break;
case keyDown: case keyMin : // De Dn of Min ?
if (MenuNr < MenuChapters) {
MenuNr++;
}
break;
}
}
}

void handleResetTimeCounters(char key) {
// char keyCToReset = 0; // 3 keer C na elkaar is reset dagteller
// char keyOKToReset = 0; // 5 keer ok en dan 3 keer C na elkaar is reset totaalteller

switch (key) {
case keyOk : // als het de "ok" toest is
keyOKToReset++; // verhoog dan de teller van de ok toets
keyCToReset = 0; // vergeet dat een C toets werd ingedrukt want, eerst 5 keer ok vooraleer 3 keer op C
// Serial.println("verhoog de OK toets teller");
break;
case keyCorrection : // en is het de "C" toets
keyCToReset++; // verhoog dan de teller van de C toets
// Serial.println("verhoog de C toets teller");
break;
default: // De toets was niet de OK toets EN ook niet de Correction toets
keyCToReset = 0; // dus wis de teller op de correction toets
keyOKToReset = 0; // en de teller op de ok toets
// Serial.println("Het was niet de C of de Ok toets");
break;
}


// opeenvolgend 5 keer de ok toest en daarna 3 keer de C toets = wissen totaalteller en dagteller
if ( (keyOKToReset > 4) && (keyCToReset > 2) ){ // als 5 keer toets ok werd gedrukt en daarna 3 keer toets C
EEPROMDagTeller = 0; // wis de dagteller
EEPROMTotaalTeller = 0; // wis de totaalteller
EEPROMTimeWrite(0UL,EEPROMAdresDagTeller); // en werk de eeprom bij voor de dagteller
EEPROMTimeWrite(0UL,EEPROMAdresTotaalTeller); // en werk de eeprom bij voor de totaalteller
keyOKToReset = 0; // reset de ok toets teller
keyCToReset = 0; // reset de C toets teller
// Serial.println("5 keer de ok toets, 3 keer de C toets");
}

// opeenvolgend 3 keer de C toets = wissen dagteller
if (keyCToReset > 2) { // als de C toets 3 keer werd ingedrukt (maar niet de ok toetst, anders gingen we dit in de code hierboven zien)
EEPROMDagTeller = 0; // wis dan enkel de dagteller
EEPROMTimeWrite(0UL,EEPROMAdresDagTeller); // en werk de eeprom bij
keyCToReset = 0; // reset de C toets teller
// Serial.println("Enkel 3 keer de C toets");
}
}



void handleLC() {
// de rechtse 3 7 segmenten zijn de dagteller en is uitgedrukt in minuten 999min = 15uur
// de linkse 4 7 segmenten zijn de totaalteller en is uitgedrukt in uren 9999uur

// unsigned long EEPROMDagTeller; // Hierin staat het aantal millis dat de vorige keer werd weggeschreven naar de EEPROM, veranderd gedurig
// unsigned long EEPROMTotaalTeller ; // Hierin staat het aantal millis dat bij de opstart van het programma werd uitgelezen uit de EEPROM, eenmalig !
// unsigned long EEPROMDagOldMillis=0;// Hierin staat het aantal millis dat er voorbij zijn tijdens het opstart van deze sessie in de ARDUINO
// #define EEPROMAdresDagTeller 32 // op deze locatie in de EEPROM staat de dagteller in millis
// #define EEPROMAdresTotaalTeller 48 // op deze locatie in de EEPROM staat de totaalteller in millis

unsigned long TimeToWrite;

if ( ( millis() % 4096) == 1 ) { // om de ongeveer 4 seconden (4096mili seconden) de 7 segment bijwerken
// soms zal er niet bijgewerkt worden omwille van de tijd en de MODULUS, maar dit is niet erg

TimeToWrite = (EEPROMDagTeller/60000UL); // DagTeller in millis dus delen door 1000 = seconden, delen door 60 = minuten

lc.setDigit(0,0, (byte) (TimeToWrite % 10) , false); // ones op de 1ste digit van rechts , we nemen via modulo 10 de eenheden
TimeToWrite /= 10UL;
lc.setDigit(0,1, (byte) (TimeToWrite % 10) , false); // tens op de 2de digit van rechts , we nemen via modulo 10 (en ervoor delen door 10) de tientallen
TimeToWrite /= 10UL;
lc.setDigit(0,2, (byte) (TimeToWrite % 10) , false); // hundreds op de 3de digit van rechts , we nemen via modulo 10 (en ervoor delen door 100) de honderdtallen


TimeToWrite = (EEPROMTotaalTeller/3600000UL); // TotaalTeller in millis dus delen door 1000 = seconden, delen door 60 = minuten, delen door 60 = uren;

lc.setDigit(0,3, (byte) (TimeToWrite % 10) , false); // ones op de 4ste digit van rechts , we nemen via modulo 10 de eenheden
TimeToWrite /= 10UL;
lc.setDigit(0,4, (byte) (TimeToWrite % 10) , false); // tens op de 5de digit van rechts , we nemen via modulo 10 (en ervoor delen door 10) de tientallen
TimeToWrite /= 10UL;
lc.setDigit(0,5, (byte) (TimeToWrite % 10) , false); // hundreds op de 6de digit van rechts , we nemen via modulo 10 (en ervoor delen door 100) de honderdtallen
TimeToWrite /= 10UL;
lc.setDigit(0,6, (byte) (TimeToWrite % 10) , false); // thousands op de 7de digit van rechts , we nemen via modulo 10 (en ervoor delen door 1000) de duizendtallen
}
}
void EEPROMTimeWrite(unsigned long TimeToWrite,char EEPROMOffset) {
unsigned long HulpLong = 0;
char HulpByte = 0;

HulpLong = TimeToWrite & 0x000000FF; // alle bits wissen behalve de 8 eerste
HulpByte = (char) HulpLong; // long -> byte = enkel de 8 rechtse bits onthouden
EEPROM.write(3 + (byte) EEPROMOffset, HulpByte); // de kleinste bitwaarden op eeprom adres 3 zetten
HulpLong = TimeToWrite & 0x0000FF00; // alle bits wissen behalve bit 8-15
HulpLong = HulpLong >> 8; // verschuif alle bits 8 posities naar rechts zodat bit 8-15 komt naar bit 0-7
HulpByte = (char) HulpLong; // long -> byte = enkel de 8 rechtse bits onthouden
EEPROM.write(2 + (byte) EEPROMOffset, HulpByte);
HulpLong = TimeToWrite & 0x00FF0000; // alle bits wissen behalve bit 16-23
HulpLong = HulpLong >> 16; // verschuif alle bits 16 posities naar rechts zodat bit 16-23 komt naar bit 0-7
HulpByte = (char) HulpLong; // long -> byte = enkel de 8 rechtse bits onthouden
EEPROM.write(1 + (byte) EEPROMOffset, HulpByte);
HulpLong = TimeToWrite & 0xFF000000; // alle bits wissen behalve de 8 laatste
HulpLong = HulpLong >> 24; // verschuif alle bits 24 posities naar rechts zodat bit 24-31 komt naar bit 0-7
HulpByte = (char) HulpLong; // long -> byte = enkel de 8 rechtse bits onthouden
EEPROM.write(0 + (byte) EEPROMOffset, HulpByte); // de grootste bitwaarden op eeprom adres 0 zetten

}

unsigned long EEPROMTimeRead(char EEPROMOffset) {
unsigned long HulpLong = 0UL;
char HulpByte = 0;
HulpByte = EEPROM.read(0 + (byte) EEPROMOffset); // lees de grootste bitwaarden van op eeprom adres 0
HulpLong += (unsigned long) HulpByte;
HulpLong = HulpLong << 8; // verschruif de bitwaarden naar links voor 8 bits
HulpByte = EEPROM.read(1 + (byte) EEPROMOffset);
HulpLong += (unsigned long) HulpByte;
HulpLong = HulpLong << 8; // verschruif de bitwaarden naar links voor 8 bits
HulpByte = EEPROM.read(2 + (byte) EEPROMOffset);
HulpLong += (unsigned long) HulpByte;
HulpLong = HulpLong << 8; // verschruif de bitwaarden naar links voor 8 bits
HulpByte = EEPROM.read(3 + (byte) EEPROMOffset); // lees de kleinste bitwaarden van op eeprom adres 3
HulpLong += (unsigned long) HulpByte;
return HulpLong;
}

void handleEEPROMTime() {
// 4294967295 milli seconds = 1193.046470833 hours = 71582.78825 minutes = 4294967.295 seconds (0-4294967295 = range unsigned long)
// eeprom may be used for 100.000 eeprom read / write cycles

// unsigned long EEPROMDagTeller; // Hierin staat het aantal millis dat de vorige keer werd weggeschreven naar de EEPROM, veranderd gedurig
// unsigned long EEPROMTotaalTeller ; // Hierin staat het aantal millis dat bij de opstart van het programma werd uitgelezen uit de EEPROM, eenmalig !
// unsigned long EEPROMDagOldMillis=0;// Hierin staat het aantal millis dat er voorbij zijn tijdens het opstart van deze sessie in de ARDUINO
// #define EEPROMAdresDagTeller 32 // op deze locatie in de EEPROM staat de dagteller in millis
// #define EEPROMAdresTotaalTeller 48 // op deze locatie in de EEPROM staat de totaalteller in millis

unsigned long HulpMillis = millis();

if ( HulpMillis > EEPROMDagOldMillis + 90000UL ) { // Slechts om de 90000milis = 1MIN 30 uitvoeren
EEPROMDagOldMillis = HulpMillis;
EEPROMDagTeller += 90000UL;
EEPROMTotaalTeller += 90000UL;
EEPROMTimeWrite(EEPROMDagTeller,EEPROMAdresDagTeller);
EEPROMTimeWrite(EEPROMTotaalTeller,EEPROMAdresTotaalTeller);
}


}

void ShowKey(char aKey) {

char *Message = (char*) "";
// if (key != NO_KEY) {

switch (key) {
case keyHome:
Message = (char*) "Home";
break;
case keyEnd:
Message = (char*) "End";
break;
case keyPlus:
Message = (char*)"+";
break;
case keyMin:
Message = (char*)"-";
break;
case keyLeft:
Message = (char*)"<";
break;
case keyRight:
Message = (char*)">";
break;
case keyUp:
Message = (char*)"Up";
break;
case keyDown:
Message = (char*)"Dn";
break;
case keyST:
Message = (char*)"ST";
break;
case keyPitot:
Message = (char*)"Pitot";
break;
case keyOk:
Message = (char*)"Ok";
break;
case keyCorrection:
Message = (char*)"C";
break;
case keyPump:
Message = (char*)"pump";
break;
case keyNaf:
Message = (char*)"NAF";
break;
case keyLL:
Message = (char*)"LL";
break;

}
tft.setCursor(100, 100);
tft.setTextColor(ILI9340_BLUE);
tft.setTextSize(2);
tft.print(Message);
delay(100);
MenuNrOld = 255; // Als het oud menu nr <> menunr dan wordt het scherm straks hertekend, dus ...
// }

}

void handlePumpNafSTLLPitot(){
byte hulpOutput = 0;


if (relayPump) {
hulpOutput += 1; // 00000001%;
}
if (relayNaf) {
hulpOutput += 2; // 00000010%;
};
if (relayST) {
hulpOutput += 4; // %00000100;
};
if (relayLL) {
hulpOutput += 8; // %00001000;
};
if (relayPitot) {
hulpOutput += 16; // %00010000
};
/*
Wire.beginTransmission(OutputCard01); // selecteer de outputcard op de IIC bus
if (Wire.endTransmission() == 0) {
Wire.beginTransmission(OutputCard01);
Wire.write(GPIOA); // selecteer daarop address port A
Wire.write(hulpOutput); // schrijf de waarde voor de relais (optocouplers)
Wire.endTransmission();
}
*/
if (OldOutputValue != hulpOutput) {
tft.setTextSize(1);
tft.setTextWrap(false);
tft.setRotation(1);
tft.setTextColor(ILI9340_CYAN);
tft.setCursor( 0,180);
tftPrintRelayText("Pump",relayPump, 5,220);
tftPrintRelayText("Naf",relayNaf, 65,220);
tftPrintRelayText("ST",relayST, 125,220);
tftPrintRelayText("LL",relayLL, 185,220);
tftPrintRelayText("Pitot",relayPitot,245,220);

OldOutputValue = hulpOutput;
}
}
void tftPrintRelayText(char *Tekst,bool Status,unsigned int XPos,unsigned int YPos){
tft.setCursor(XPos,YPos);
if (Status) {
tft.setTextColor(ILI9340_GREEN);
tft.print(Tekst);
tft.print(" ON ");
} else {
tft.setTextColor(ILI9340_RED);
tft.print(Tekst);
tft.print(" OFF ");
}
}


void handleMenu() {
char lus;
unsigned int ScreenX = 15; // op deze X coordinaat zal de volgende tekst op de tft komen (via tft.print)
unsigned int ScreenY = 10; // op deze Y coordinaat zal de volgende tekst op de tft komen (via tft.print)
StrMenu regelUitTabel; // deze variabele stelt een buffer voor van een menulijn die gekopieerd zal worden uit PROGMEM

if (MenuNr != MenuNrOld) { // als het vorig menu die op het scherm getekend was niet hetzelfde is als het nieuw te tekenen
// scherm, alleen dan wis het scherm en bouw het menu opnieuw op
// dit omdat het scherm anders teveel flikkert en er teveel cpu tijd verloren gaat
tft.fillScreen(ILI9340_BLACK);
tft.setTextWrap(false);
tft.setRotation(1);

handlePumpNafSTLLPitot();


for (lus = MenuMin; lus < ArraySize(MenuList); lus++) {

memcpy_P(&regelUitTabel, &MenuList[lus], sizeof(regelUitTabel)); // kopieer de te testen regel uit het menu uit het PROGMEM naar een lokale variable

if (regelUitTabel.nrMenu == MenuNr) { // dit is het chapter uit het menu die getoond moet worden
if (regelUitTabel.isMenuName) { // deze lijn is een menu naam
ScreenX = 10;
tft.setTextSize(2);
tft.setCursor(ScreenX, ScreenY);
tft.setTextColor(ILI9340_BLUE,ILI9340_BLACK); // menu namen zijn blauw
tft.print(regelUitTabel.textLineBold);
ScreenY += 30; // omdat een chapter in textsize 2 staat verhogen we Y met 30

}
else { // deze lijn is geen menu naam maar dus een menu item
ScreenX = 10;
tft.setTextSize(1);
tft.setCursor(ScreenX, ScreenY);
if (lus % 2 == 1) {
tft.setTextColor(ILI9340_WHITE, ILI9340_BLACK); // menu items links zijn wit
}
else {
tft.setTextColor(ILI9340_WHITE, ILI9340_BLUE);
}
tft.print(regelUitTabel.textLineBold);
ScreenX = 170;
tft.setCursor(ScreenX, ScreenY);
if (lus % 2 == 1) {
tft.setTextColor(ILI9340_YELLOW,ILI9340_BLACK); // menu items rechts zijn geel
}
else {
tft.setTextColor(ILI9340_YELLOW,ILI9340_BLUE);
}

tft.print(regelUitTabel.textLineNormal);
ScreenY += 15; // omdat dit geen chapter is maar een gewone regel in textsize 1 verhogen we Y met 15
}

}
}
MenuNrOld = MenuNr;
}
}

void handleInputFuses() {
// struct StrFuseList {
// char FuseInputNr;
// char FuseInputNameSmall[5];
// char FuseInputName[20];
// char FuseValue[5];
// };
char lus;
char hulpInputCard1A = 0;
char hulpInputCard1B = 0;
char hulpInputCard2A = 0;
char hulpInputCard2B = 0;

unsigned int ScreenX = 10; // op deze X coordinaat zal de volgende tekst op de tft komen (via tft.print)
unsigned int ScreenY = 10; // op deze Y coordinaat zal de volgende tekst op de tft komen (via tft.print)
StrFuseList regelUitTabel; // deze variabele stelt een buffer voor van een fuselijn die gekopieerd zal worden uit PROGMEM

/*
// read the inputs of bank A Inputcard 01
Wire.beginTransmission(InputCard01);
Wire.write(0x13); /////////////////////////////////////////////
Wire.endTransmission();
Wire.requestFrom(InputCard01, 1);
hulpInputCard1A=Wire.read();

// read the inputs of bank B Inputcard 01
Wire.beginTransmission(InputCard01);
Wire.write(0x13);
Wire.endTransmission();
Wire.requestFrom(InputCard01, 1);
hulpInputCard1B=Wire.read();

// read the inputs of bank B Inputcard 01
Wire.beginTransmission(InputCard02);
Wire.write(0x13); ////////////////////////////////////////////////
Wire.endTransmission();
Wire.requestFrom(InputCard01, 1);
hulpInputCard2A=Wire.read();

// read the inputs of bank B Inputcard 02
Wire.beginTransmission(InputCard02);
Wire.write(0x13);
Wire.endTransmission();
Wire.requestFrom(InputCard01, 1);
hulpInputCard2B=Wire.read();


*/



/*
if (millis() % 2000 == 7) {
for (lus = 0; lus < ArraySize(FuseList); lus++) {

memcpy_P(&regelUitTabel, &FuseList[lus], sizeof(regelUitTabel)); // kopieer de te testen regel uit het menu uit het PROGMEM naar een lokale variable
Serial.print("Foutregel : ");
Serial.print( (byte)regelUitTabel.FuseInputNr);
Serial.print(regelUitTabel.FuseInputNameSmall);
Serial.print(regelUitTabel.FuseInputName);
Serial.println(regelUitTabel.FuseValue);
}
}
*/
}

void showScreenWelcome() {
tft.fillScreen(ILI9340_BLACK);
tft.setTextSize(5);
tft.setTextWrap(false);
tft.setRotation(1);
tft.setCursor(50,20);
tft.setTextColor(ILI9340_BLUE);
tft.print("WELCOME");
tft.setTextSize(2);
tft.setTextColor(ILI9340_RED);
tft.setCursor(10,150);
tft.print("TO RESET DAY CLOCK: ");
tft.setCursor(10,170);
tft.print("PUSH 3 x RED BUTTON C");
delay(1000);
}

Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: adafruit 1480 & wire

Berichtdoor shooter » 05 Apr 2016, 18:53

ik denk dat je in de knoop raakt met de timers die je wellicht dubbel gebruikt.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: adafruit 1480 & wire

Berichtdoor nicoverduin » 05 Apr 2016, 21:57

Wat hangt er allemaal aan de voeding (5V) en (3.3v) van de Arduino?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 49
Geregistreerd: 09 Mei 2015, 15:57

Re: adafruit 1480 & wire

Berichtdoor doebi » 06 Apr 2016, 07:57

Hallo, alvast dank voor jullie antwoorden.

Bericht door shooter » 05 Apr 2016, 18:53

ik denk dat je in de knoop raakt met de timers die je wellicht dubbel gebruikt.

Zelf gebruik ik geen timers (tenzij de millis() )



Bericht door nicoverduin » 05 Apr 2016, 21:57

Wat hangt er allemaal aan de voeding (5V) en (3.3v) van de Arduino?


De voeding van de leonardo komt hetzij van de usb bus, hetzij via een gestabiliseerde 12V naar 5V 2A voeding via de VIN. (TRACOPOWER TEN 10-1211)
De 3.3V wordt niet gebruikt.

Er hangen 3 pcb's aan, namelijk
1 x pcb i2c via een mcp23017 voor relays (opctouplers op 5V , de spoelen van de relais zelf en hun contacten op 12V)
2 x pcb i2c via een mcp23017 voor inputs (inputs op 12V, omgevormd naar 5V via optocouplers)
1 x pcb via 3 digitale pins via max 7219eng met 7 x 7 segmenten op 5V aangestuurd op

Als alles er aan hangt , en in de software gebruikt wordt, draait het programma (relais worden gestuurd, de menu knoppen werken) , maar het adascherm wil dan niet gaan.
Als alles er aan hang , en in de software is alles van i2c uitgeschakeled draait het programma (maar werken uiteraard dan de relays en input card niet)

De 7x7 segmenten blijven ten alle tijde werken (3 segmenten gebruikt voor een dagteller, 4 segmenten
gebruikt voor een totaal teller) Deze is via de max7219eng aangesloten op pin 10,11,12

Verder hangt er nog een membraam toestenbord met 15 knoppen, blijft ook ten alle tijde werken, dit gebruikt 8 pins op de leonardo ,
(ik gebruik hiervoor de A0 tem A5 , de 8 en de 9, in een matrix)

Echt veel van vermogen hangt er dus niet aan, hier kan het denk ik niet aan liggen.

De I2C van de leoanardo zitten op afzonderlijke klemmen t.o.v. andere arduino's (specifiek leonardo).
Zou een software I2C soulaas brengen ? Heb erover gelezen in google maar weet niet goed hoe dit werkt. :( Ik heb nog net 2 pins over (pin 2 & pin 7) ?
De I2C hoeft niet snel te zijn, op de inputcards worden fuses aangesloten, het is de bedoeling als een fuse stuk is, dat dit gedetecteerd word,
op de outputcard staan relais, als die nu een seconde langer wachten om te schakelen zal dat geen invloed hebben.

Zelf maak ik nog geen gebruik van interrupts (toch niet dat ik weet van heb), maar wil wel nog een watchdog installeren, tenminste, als het overig deel
eerst wil werken.

Weet eigenlijk niet meer hoe ik het verder kan oplossen :cry:

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: adafruit 1480 & wire

Berichtdoor nicoverduin » 06 Apr 2016, 08:26

IK vraag me af of er niet ergens een voedingsprobleem is. Maar dan moet je de scope er al aanhangen.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 49
Geregistreerd: 09 Mei 2015, 15:57

Re: adafruit 1480 & wire

Berichtdoor doebi » 06 Apr 2016, 12:26

Dag Nico, waarom denkt u aan een voedingsproblemen? Alles werkt zolang de wire library niet gebruikt wordt, en gebruik ik die wel dan werkt deze maar dan gaat het schermpje niet. Alles blijft aangesloten als ik dit probeer.
De voeding zelf komt via een gestabiliseerde omvormer 12v - 5v op de Vin pin. Als ik deze Los en mijn USB inplug op de Leonardo dan heb ik hetzelfde.
Niettemin, waar stelt u voor dat ik meet ? Kan ik deze avond uitvoeren.
Zelf denk ik meer aan software problemen

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: adafruit 1480 & wire

Berichtdoor nicoverduin » 06 Apr 2016, 13:09

Software problemen zou kunnen, maar dat verwacht ik niet in eerste instantie.
De regulator op het bord kan maar max 500mA aan. Als hang je er een 100A 12V voeding op de Vin, er komt niet meer dan 500mA uit.
Maar dat moet je meten. Dus als je die faciliteiten hebt zoals een scope, kun je zien wat de voeding doet als je alles aansluit. Of een stroommeter helpt ook. Je hebt tegenwoordig van die goedkope USB metertjes die komen tussen een USB kabel en de USB stekker op de PC en die meet de stroom die afgenomen wordt als ook de spanning.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 49
Geregistreerd: 09 Mei 2015, 15:57

Re: adafruit 1480 & wire

Berichtdoor doebi » 06 Apr 2016, 21:31

pfffffffffffffffffff :D

Solved

Het probleem was een incompatibiliteit tussen de wire en de adafruit libraries. Waar precies weet ik niet :evil:

Oplossing :
Weg met de wire library en welkom http://dsscircuits.com/articles/86-articles/66-arduino-i2c-master-library
Deze lib , met zeer simpel commando's :
voorbeeld :
cpp code
I2c.begin();
I2c.write(OutputCard01,GPIOA,hulpOutput); // in 1 regel schrijven naar devicenummer, registernummer,data , geweldig toch ?
I2c.end();
[/code]

en heeft als bijkomend voordeel dat mijn programma veel minder groot is bij het compileren dan met de wire libray. 8-)

En niet onbelangrijk, in tegenstelling tot zogeheten i2c software libraries is dat deze gebruikt maakt van de standaard SCL en SDA pins,
bij mijn leonardo projectje niet onbelangrijk (SDA en SCL zitten bij leonardo op extra pinnen)

En als ik de site http://dsscircuits.com/articles/86-articles/66-arduino-i2c-master-librarymag geloven (voor mij nu net minder belangrijk),
zou deze stukken sneller zijn dan de wire lib.

In rev 5 van deze lib zouden alle interrupt functies weggehaald zijn, mogelijks dat dit een verschil uitmaakt t.o.v. de standaard wire lib ... ?


Nu enkel nog de 2 inputcards via i2c binnen lezen en dan klaar, maar nu, eerst , een goeie nachtrust. :geek:

Bedankt aan iedereen die hielp meedenken,

Grtz



[code]

/***************************************************
VL3
----> http://www.adafruit.com/products/1480
----> MAX7219ENG
----> CLICK TOUCH pannel

Color definitions for TFT SPI 2.2" Display
ILI9340_BLACK 0x0000
ILI9340_BLUE 0x001F
ILI9340_RED 0xF800
ILI9340_GREEN 0x07E0
ILI9340_CYAN 0x07FF
ILI9340_MAGENTA 0xF81F
ILI9340_YELLOW 0xFFE0
ILI9340_WHITE 0xFFFF
***************************************************/
#include <Keypad.h> // need the library for the keypad
#include <SPI.h> // need the library for ADA 1480 SPI controls
#include "Adafruit_GFX.h" // need the library for ADA 1480
#include "Adafruit_ILI9340.h" // need the library for ADA 1480
//#include <Wire.h> // need the library for I2C
#include <I2C.h> // http://dsscircuits.com/articles/86-arti ... er-library
#include <LedControl.h> // need the library for max7219ENG works with common kathode
#include <EEPROM.h> // need the library for reading and writing minutes who are passed sinds startup
#include <avr/pgmspace.h>
//#include <avr/wdt.h> // need the wathdog library

// number of items in an array
template< typename T, size_t N > size_t ArraySize (T (&) [N]){ return N; }


// Leonardo
#define _dc 3
#define _rst 4
#define _cs 6
#define _miso 14
#define _sclk 15
#define _mosi 16


// Wiring sort leonardo vs adadfruit 1480
// NAME LEONARDO LCD ADAFRUIT 1480
// MISO ICP1 MISO 08 MISO
// +5V ICP2 VCC 02 VIN
// SCK ICP3 SCK 09 SCK
// MOSI ICP4 MOSI 07 MOSI
// GND ISP6 GND 01 GND
// D/C DIGI 3 03 D/C
// RESET DIGI 4 04 RESET
// LCD/CS DIGI 6 06 LCD/CS
// BACKLIGHT +5V 10 BACKLIGHT


// Wiring sort adafruit 1480 vs leonardo
// NAME LEONARDO LCD ADAFRUIT 1480
// GND ISP6 GND 01 GND
// +5V ICP2 VCC 02 VIN
// D/C DIGI 3 03 D/C
// RESET DIGI 4 04 RESET
// LCD/CS DIGI 6 06 LCD/CS
// MOSI ICP4 MOSI 07 MOSI
// MISO ICP1 MISO 08 MISO
// SCK ICP3 SCK 09 SCK
// BACKLIGHT +5V 10 BACKLIGHT


// Wiring sort leonardo vs MAX7219
// LEONARDO MAX7219ENG
// DIGI 10 12 LOAD
// DIGI 11 13 CLK
// DIGI 12 01 DIN
// +5V 19 V+
// GND 04 GND
// GND 09 GND

// Wiring sort leonardo vs clicktouchpannel
// LEONARDO CLICK TOUCH touch pannel
// A0 1 COL 1 (FROM BACKSIDE VIEW = MOST RIGHT)
// A1 2 COL 2
// A2 3 COL 3
// A3 4 COL 4
// A4 5 ROW 1
// A5 6 ROW 2
// DIGI 8 7 ROW 3
// DIGI 9 8 ROW 4 (FROM BACKSIDE VIEW = MOST LEFT)




// Using software SPI is really not suggested, its incredibly slow
// Adafruit_ILI9340 tft = Adafruit_ILI9340(_cs, _dc, _mosi, _sclk, _rst, _miso);
// Use hardware SPI

Adafruit_ILI9340 tft = Adafruit_ILI9340(_cs, _dc, _rst); // tft is our adadfruit ILI9340 control object

LedControl lc = LedControl(12, 11, 10, 1); // lc is our led control object
// arduino leonardo pin 12 is connected to the MAX7219 DIN pin 1
// arduino leonardo pin 11 is connected to the MAX7219 CLK pin 13
// arduino leonardo pin 10 is connected to the MAX7219 LOAD pin 12
// 1 as we are only using 1 MAX7219
// gnd on MAX7219 GND pin 4 and pin 9
// 5V on MAX7219 V+ pin 19
// resistor 10K betweenMAX7219 V+ pin 19 and ISET 18

// Define a structure for the input fuses

struct StrFuseList {
char FuseInputNr;
char FuseInputNameSmall[5];
char FuseInputName[20];
char FuseValue[5];
};

const StrFuseList FuseList[] PROGMEM = {
{ 1 , "F1", "Battery", "35A"},
{ 2 , "F2", "Charging", "25A"},
{ 3 , "F3", "Fuse", "1A"},
{ 4 , "F4", "Fuse", "1A"},
{ 5 , "F5", "Fuse", "1A"},
{ 6 , "FA1", "Fuse", "1A"},
{ 7 , "FA2", "IGN", "1A"},
{ 8 , "FA3", "FUEL PUMP", "3A"},
{ 9 , "FA4", "STROBE + NAV LIGHT", "3A"},
{ 10, "FA5", "HYDRAUL.PUMP", "30A"},
{ 11, "FA6", "WHEEL RETRACTION", "2A"},
{ 12, "FA7", "LANDING LIGHT", "1A"},
{ 13, "FA8", "CONSTANTSPEED", "5A"},
{ 14, "FA9", "PITOT HEATING", "2A"},
{ 15, "FA10", "SOCKET 12V", "5A"},
{ 16, "FA11", "USB 5V", "2A"},
{ 17, "FA12", "SPEED FLAPS", "?A"},
{ 18, "FA13", "SPEED WHEELS", "?A"},
{ 19, "FA14", "FLAPS", "7.5A"},
{ 20, "FA15", "AVIONICS RELE", "1A"},
{ 21, "FA16", "BACKUP CHARGER", "5A"},
{ 22, "FA17", "BACKUP BATTERY", "?A"},
{ 23, "FB1", "AX SERVO", "5A"},
{ 24, "FB2", "XPNDR", "3A"},
{ 25, "FB3", "COM", "5A"},
{ 26, "FB4", "GSU 25", "2A"},
{ 27, "FB5", "GEA 24", "2A"},
{ 28, "FB6", "GDU 460 LEFT", "5A"},
{ 29, "FB8", "TCA5", "?A"},
{ 30, "FB9", "GDU 460 RIGHT", "5A"},
{ 31, "FB10", "GMC307", "1A"}
};


// Define a structure for our menu text output view
struct StrMenu {
char textLineBold[20] ; // De tekst die in het vet moet staan (Hoofdtitel of subtitel)
char textLineNormal[23] ; // De tekst die normaal moet staan (Naast de subtitel)
boolean isMenuName; // Is het een hoofdtitel of een subtitel, true = hoofdtitel of menunaam
char nrMenu; // volgnummer, gelijke nummers horen bij elkaar
};


// Define a structure for our menu list
const StrMenu MenuList[] PROGMEM = {
{ "BEFORE FLIGHT CHECK" , "", true , 0 } ,
{ "AERODOME REGISTER", "FILLED IN", false , 0 },
{ "MASTER SWITCH" , "ON",false,0 },
{ "FUEL LEVEL" , "CHECK",false,0 },
{ "MASTER SWITCH", "OFF",false,0 },
//0+5=5
{ "EXTERNAL", "",true,1 },
{ "EXTERNAL", "COMPLETED",false,1 },
//5+2=7
{ "BEFORE ENGINE START", "",true,2 },
{ "SAFETY BELTS", "FASTEN",false,2 },
{ "CANOPY", "CLOSE LOCK",false,2 },
{ "SWITCHES", "OFF",false,2 },
{ "CIRCUIT BRAKERS", "ON",false,2 },
{ "BRAKES", "HOLD(OR PARKING BRAKE)",false,2 },
//7+6=13
{ "ENGINE START", "",true,3 },
{ "LANDING GEAR", "SWITCHED DOWN",false,3 },
{ "MASTER SWITCH", "ON",false,3 },
{ "FUELS VALVES", "OPEN ON LOWEST",false,3 },
{ "FUEL POMP", "CHECK",false,3 },
//13+5=18
{ "TAXI", "",true,4 },
{ "BRAKES", "CHECK",false,4 },
{ "SLIP INDICATOR", "CHECK",false,4 },
{ "COMPASS", "CHECK",false,4 },
//18+4=22
{ "RUN UP PART 1", "",true,5 },
{ "FULL TANK", "FULLEST(min 2min.)",false,5 },
{ "ENGINE INSTR.", "Oil press.1,5-5,0bar",false,5 },
{ "ENGINE INSTR.", "Oil temp. 50-110°C",false,5 },
{ "ENGINE INSTR.", "CHT max 110°C",false,5 },
{ "ENGINE INSTR.", "EGT max 900°C",false,5 },
{ "THROTTLE", "3000 RPM",false,5 },
{ "MAGNETOS", "CHECK-L,R,BOTH",false,5 },
{ "PROPELLER", "MANUAL/CHECK",false,5 },
{ "THROTTLE", "IDLE(+/-1400RPM)",false,5 },

{ "RUN UP PART 2", "",true,6 },
{ "FLIGHT CONTROLS", "FREE AND CORRECT",false,6 },
{ "TRIM", "NEUTRAL+TRAVELLING",false,6 },
{ "FLAPS", "POS.2+TRAVELLING",false,6 },
{ "FUEL TANK", "FULLEST/BOTH",false,6 },
{ "MAGNETOS", "BOTH",false,6 },
{ "ALTIMETER", "SET(ALSO EFIS)",false,6 },
{ "SAFETY BELTS", "FASTEN",false,6 },
{ "CANOPY", "CLOSED,LOCKED",false,6 },
{ "PROPELLER", "FULLY FINE(+/-5500RPM)",false,6 },
//22+20=42
{ "TAKE-OFF", "",true,7 },
{ "FUEL PUMP", "ON",false,7 },
{ "THROTTLE", "FULL OPEN",false,7 },
//42+3=45
{ "AFTER TAKE-OFF", "",true,8 },
{ "SPEED", "100",false,8},
{ "BRAKES", "APPLY (RG)",false,8},
{ "FLAPS", "UP",false,8 },
{ "GEAR", "UP AT 300FT",false,8 },
{ "MAP", "REDUCE TO OPTIMAL",false,8 },
{ "THROTTLE", "REDUCE TO OPTIMAL",false,8 },
{ "LANDING LIGHTS", "OFF",false,8 },
{ "CLIMB SPEED", "130KM/H",false,8 },
{ "FUEL PUMP", "OFF",false,8 },
//45+10=55
{ "CRUISSE", "",true,9 },
{ "THROTTLE", "AS REQUIRED",false,9 },
{ "SPEED", "AS REQUIRED",false,9 },
//55+3=58


{ "DOWNWIND", "",true,10 },
{ "ENGINE INSTR.", "CHECK",false,10},
{ "FUEL PUMP", "ON",false,10},
{ "LANDING LIGHTS", "ON",false,10},
{ "SAFETY BELTS", "FASTEN",false,10},
{ "SPEED", "140km/h",false,10},
{ "PROPELLER", "FULLY FINE(+-5500RPM)",false,10},
{ "LANDING GEAR", "DOWN 3GREENS",false,10},
{ "SPEED", "110km/h",false,10},
{ "FLAPS", "POSITION 1",false,10},
// 58+10 = 68

{ "BASE LEG", "",true,11},
{ "RPM", "AS REQUIRED",false,11},
{ "SPEED", "100km/h",false,11},
{ "FLAPS", "POSITION 2",false,11},
// 68+4 = 72

{ "FINAL", "",true,12},
{ "FLAPS", "POSITION 2(OR 3)",false,12},
{ "SPEED", "100km/h",false,12},
// 72+3 = 75

{ "AFTER LANDING", "",true,13},
{ "FLAPS", "UP",false,13},
{ "TRIM", "NEUTRAL",false,13},
{ "FUEL PUMP", "OFF",false,13},
// 75+5 = 79

{ "SHUT DOWN", "",true,14},
{ "AVIONICS", "OFF",false,14},
{ "SWITCHES", "OFF",false,14},
{ "POSITION LIGHTS", "OFF",false,14},
{ "THROTTLE", "MIN.(2000RPM)",false,14},
{ "MAGNETOS", "OFF",false,14},
{ "MASTER SWITCH", "OFF",false,14},
{ "LOGBOOK", "COMPLETED",false,14}
// 79+8 = 87

};



// Hieronder globle variabelen of const ivm de menu afhandeling
const char PROGMEM MenuMin = 0; // Hierin staat het startadres van de menulines (het hoeft dus niet perse 0 te zijn in de declaratie)
const char PROGMEM MenuChapters = 14; // Hierin staat het aantal hoofdstukken van het menu
const char PROGMEM MenuMax = 87; // MenuList.size(); //68 = 68-1 (67 = total menulines, -1 cause of starting from 0);
char MenuNr = 0;
char MenuNrOld = 255;
char key;

// Hieronder globale variabelen of const ivm met de EEPROM en tijd-telling
unsigned long EEPROMDagTeller; // Hierin staat het aantal millis dat de vorige keer werd weggeschreven naar de EEPROM, veranderd gedurig
unsigned long EEPROMTotaalTeller ; // Hierin staat het aantal millis dat bij de opstart van het programma werd uitgelezen uit de EEPROM, eenmalig !
unsigned long EEPROMDagOldMillis = 0; // Hierin staat het aantal millis dat er voorbij zijn tijdens het opstart van deze sessie in de ARDUINO
const char PROGMEM EEPROMAdresDagTeller = 100 ; // op deze locatie in de EEPROM staat de dagteller in millis
const char PROGMEM EEPROMAdresTotaalTeller = 110 ; // op deze locatie in de EEPROM staat de totaalteller in millis
bool TellerToegestaan = false; // false : er mag niet geteld worden, true, er moet geteld worden
char TellerSeconden = 0;
char TellerMinuten = 0;
char TellerUren = 0;

// Hieronder globale variabelen ivm de 4 aan te sturen relais
bool relayPump = false;
bool relayNaf = false;
bool relayST = false;
bool relayLL = false;
bool relayPitot = false;

// Hieronder variablen, declaraties ivm het clicktouch keypad
#define KEYPADROWS 4
#define KEYPADCOLS 4
#define key0 0
#define keyEnd 1
#define keyHome 2
#define keyLL 3
#define keyRight 4
#define keyOk 5
#define keyCorrection 6
#define keyST 7
#define keyMin 8
#define keyPlus 9
#define keyPitot 10
#define keyPump 11
#define keyDown 12
#define keyLeft 13
#define keyUp 14
#define keyNaf 15

char keys[KEYPADROWS][KEYPADCOLS] = {
{ key0,keyEnd,keyHome,keyLL },
{ keyRight,keyOk,keyCorrection,keyST },
{ keyMin,keyPlus,keyPitot,keyPump },
{ keyDown,keyLeft,keyUp,keyNaf }
};

byte colPins[KEYPADCOLS] = { A0, A1, A2, A3 }; //connect to the column pinouts of the keypad
byte rowPins[KEYPADROWS] = { A4, A5, 8, 9 }; //connect to the row pinouts of the keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEYPADROWS, KEYPADCOLS);


// hieronder variabelen om de dagteller en de totaalteller te resetten
char keyCToReset = 0; // 3 keer C na elkaar is reset dagteller
char keyOKToReset = 0; // 5 keer ok en dan 3 keer C na elkaar is reset totaalteller


// hieronder info over de SDA e, SCL (wire) pins op diverse arduino boards
// Board I2C / TWI pins
// Uno, Ethernet A4 (SDA), A5 (SCL)
// Mega2560 20 (SDA), 21 (SCL)
// Leonardo 2 (SDA), 3 (SCL)
// Due 20 (SDA), 21 (SCL), SDA1, SCL1

// hieronder variablen voor de in en uitgangskaarten

byte OldOutputValue = 0xFF; // deze wordt gebruikt om het scherm of de IIC te activeren, als de nieuwe outputvalues <> oldoutputvalue
const int OutputCard01 = 0x27; // 3 adress bits op 1
const int InputCard01 = 0x20; // 3 adress bits op 0
const int InputCard02 = 0x22; // middelste adres bit op 1
// MCP23017 internal registers - Not all registers included. See the Microchip MCP23017 datasheet for full list
const int IODIRA = 0x00; // Port A direction register. Write a 0 to make a pin an output, a 1 to make it an input
const int IODIRB = 0x01; // Port B DDD ?
const int GPIOA = 0x12; // Register Address of Port A - read data from or write output data to this port
const int GPIOB = 0x13; // Register B DDD ?
const int GPPUA = 0x0c; // Register to enable the internal pull up resistors on Port A. 1 = pull up enabled
const int GPPUB = 0x0d; // Register B DDD ?


void setup() {


/*

Wire.begin();


Wire.begin();
// Outputcard01 Set A port as output
Wire.beginTransmission(OutputCard01);
Wire.write(IODIRA); // IODIRA register
Wire.write(0x00); // set all of port A to outputs
Wire.endTransmission();

// Outputcard01 Set B port as output
Wire.beginTransmission(OutputCard01);
Wire.write(IODIRB); // IODIRB register
Wire.write(0x00); // set all of port B to outputs
Wire.endTransmission();

*/

// Outputcard01 Set A port as output
I2c.begin();
I2c.write(OutputCard01,IODIRA,0x00); // IODIRA register set all of port A to outputs
I2c.end();

/*
// InputCard01 Set A port as input Er zijn externe pull ups , dus geen GPPUA setten !
Wire.beginTransmission(InputCard01);
Wire.write(IODIRA); // IODIRA register
Wire.write(0xFF); // set all of port A to outputs
Wire.endTransmission();

// InputCard01 Set B port as input Er zijn externe pull ups , dus geen GPPUA setten !
Wire.beginTransmission(InputCard01);
Wire.write(IODIRA); // IODIRA register
Wire.write(0xFF); // set all of port A to outputs
Wire.endTransmission();

// InputCard02 Set A port as input Er zijn externe pull ups , dus geen GPPUB setten !
Wire.beginTransmission(InputCard02);
Wire.write(IODIRA); // IODIRA register
Wire.write(0xFF); // set all of port A to outputs
Wire.endTransmission();

// InputCard02 Set B port as input Er zijn externe pull ups , dus geen GPPUB setten !
Wire.beginTransmission(InputCard02);
Wire.write(IODIRA); // IODIRA register
Wire.write(0xFF); // set all of port A to outputs
Wire.endTransmission();
*/
Serial.begin(9600);

tft.begin();

showScreenWelcome();

delay(5000); // 5 seconden tijd om de seriele monitor aan te zetten

//EEPROMTimeWrite(0UL,EEPROMAdresDagTeller); // DEZE LIJN IS SLECHTS 1 MALIG UIT TE VOEREN OM ZEKER TE ZIJN DAT DE DAGTELLER OP 0 STAAT
//EEPROMTimeWrite(0UL,EEPROMAdresTotaalTeller); // DEZE LIJN IS SLECHTS 1 MALIG UIT TE VOEREN OM ZEKER TE ZIJN DAT DE TOTAALTELLER OP 0 STAAT

EEPROMDagTeller = EEPROMTimeRead(EEPROMAdresDagTeller); // LEES BIJ OPSTART DE DAGTELLER
EEPROMTotaalTeller = EEPROMTimeRead(EEPROMAdresTotaalTeller); // LEES BIJ OPSTART DE TOTAALTELLER

lc.shutdown(0, false);// turn off power saving, enables display
lc.setIntensity(0, 8);// sets brightness (0~15 possible values)
lc.clearDisplay(0);// clear screen


// The watchdog timer on the Arduino microcontrollers can operate in four different modes:
//Disabled: the program simply gets stuck if it runs into an infinite loop
//Reset: if wdt_reset() is not called within every timeout period, the watchdog
// timer will reset the program and it will start again from the beginning
//Interrupt: an interrupt will be generated if wdt_reset()
// isn’t called within every timeout period
//Interrupt + reset: a combination of the last two. If wdt_reset() isn’t called within the timeout
// period, the watchdog timer will first raise an interrupt. Then, if wdt_reset()
// isn’t called within another timeout period, the program will reset and start again
// wdt_enable(WDTO_5S); // Zet de ARDUINO watchdog aan, dit betekent dat een programmauitvoering nooit langer dan 2 sec mag duren tussen 2 wdt_reset() aanroepen
// wdt_disable();



// Wire.begin();
}




void loop(void) {
handleEEPROMTime();
handleLC();
handleKey();
handleMenu();

// handleInputFuses();

}

void handleKey(){

key = keypad.getKey();

if (key != NO_KEY) { // als er een toest is ingedrukt

handleResetTimeCounters(key);

ShowKey(key); // toon ook de toets die werd ingedrukt

switch (key) { // Test welke toets werd ingedrukt
case keyPump : // De pump ?
relayPump = !relayPump;
break;
case keyNaf : // De Naf ?
relayNaf = !relayNaf;
break;
case keyST : // De ST ?
relayST = !relayST;
break;
case keyLL : // De LL ?
relayLL = !relayLL;
break;
case keyPitot : // De Pitot ?
relayPitot = !relayPitot;
break;
case keyHome: // De Home ?
MenuNr = MenuMin;
break;
case keyEnd: // De End ?
MenuNr = MenuChapters;
break;
case keyUp: case keyPlus : // De Up of Plus ?
if (MenuNr > MenuMin) {
MenuNr--;
}
break;
case keyDown: case keyMin : // De Dn of Min ?
if (MenuNr < MenuChapters) {
MenuNr++;
}
break;
}
}
}

void handleResetTimeCounters(char key) {
// char keyCToReset = 0; // 3 keer C na elkaar is reset dagteller
// char keyOKToReset = 0; // 5 keer ok en dan 3 keer C na elkaar is reset totaalteller

switch (key) {
case keyOk : // als het de "ok" toest is
keyOKToReset++; // verhoog dan de teller van de ok toets
keyCToReset = 0; // vergeet dat een C toets werd ingedrukt want, eerst 5 keer ok vooraleer 3 keer op C
// Serial.println("verhoog de OK toets teller");
break;
case keyCorrection : // en is het de "C" toets
keyCToReset++; // verhoog dan de teller van de C toets
// Serial.println("verhoog de C toets teller");
break;
default: // De toets was niet de OK toets EN ook niet de Correction toets
keyCToReset = 0; // dus wis de teller op de correction toets
keyOKToReset = 0; // en de teller op de ok toets
// Serial.println("Het was niet de C of de Ok toets");
break;
}


// opeenvolgend 5 keer de ok toest en daarna 3 keer de C toets = wissen totaalteller en dagteller
if ( (keyOKToReset > 4) && (keyCToReset > 2) ){ // als 5 keer toets ok werd gedrukt en daarna 3 keer toets C
EEPROMDagTeller = 0; // wis de dagteller
EEPROMTotaalTeller = 0; // wis de totaalteller
EEPROMTimeWrite(0UL,EEPROMAdresDagTeller); // en werk de eeprom bij voor de dagteller
EEPROMTimeWrite(0UL,EEPROMAdresTotaalTeller); // en werk de eeprom bij voor de totaalteller
keyOKToReset = 0; // reset de ok toets teller
keyCToReset = 0; // reset de C toets teller
// Serial.println("5 keer de ok toets, 3 keer de C toets");
}

// opeenvolgend 3 keer de C toets = wissen dagteller
if (keyCToReset > 2) { // als de C toets 3 keer werd ingedrukt (maar niet de ok toetst, anders gingen we dit in de code hierboven zien)
EEPROMDagTeller = 0; // wis dan enkel de dagteller
EEPROMTimeWrite(0UL,EEPROMAdresDagTeller); // en werk de eeprom bij
keyCToReset = 0; // reset de C toets teller
// Serial.println("Enkel 3 keer de C toets");
}
}



void handleLC() {
// de rechtse 3 7 segmenten zijn de dagteller en is uitgedrukt in minuten 999min = 15uur
// de linkse 4 7 segmenten zijn de totaalteller en is uitgedrukt in uren 9999uur

// unsigned long EEPROMDagTeller; // Hierin staat het aantal millis dat de vorige keer werd weggeschreven naar de EEPROM, veranderd gedurig
// unsigned long EEPROMTotaalTeller ; // Hierin staat het aantal millis dat bij de opstart van het programma werd uitgelezen uit de EEPROM, eenmalig !
// unsigned long EEPROMDagOldMillis=0;// Hierin staat het aantal millis dat er voorbij zijn tijdens het opstart van deze sessie in de ARDUINO
// #define EEPROMAdresDagTeller 32 // op deze locatie in de EEPROM staat de dagteller in millis
// #define EEPROMAdresTotaalTeller 48 // op deze locatie in de EEPROM staat de totaalteller in millis

unsigned long TimeToWrite;

if ( ( millis() % 4096) == 1 ) { // om de ongeveer 4 seconden (4096mili seconden) de 7 segment bijwerken
// soms zal er niet bijgewerkt worden omwille van de tijd en de MODULUS, maar dit is niet erg

TimeToWrite = (EEPROMDagTeller/60000UL); // DagTeller in millis dus delen door 1000 = seconden, delen door 60 = minuten

lc.setDigit(0,0, (byte) (TimeToWrite % 10) , false); // ones op de 1ste digit van rechts , we nemen via modulo 10 de eenheden
TimeToWrite /= 10UL;
lc.setDigit(0,1, (byte) (TimeToWrite % 10) , false); // tens op de 2de digit van rechts , we nemen via modulo 10 (en ervoor delen door 10) de tientallen
TimeToWrite /= 10UL;
lc.setDigit(0,2, (byte) (TimeToWrite % 10) , false); // hundreds op de 3de digit van rechts , we nemen via modulo 10 (en ervoor delen door 100) de honderdtallen


TimeToWrite = (EEPROMTotaalTeller/3600000UL); // TotaalTeller in millis dus delen door 1000 = seconden, delen door 60 = minuten, delen door 60 = uren;

lc.setDigit(0,3, (byte) (TimeToWrite % 10) , false); // ones op de 4ste digit van rechts , we nemen via modulo 10 de eenheden
TimeToWrite /= 10UL;
lc.setDigit(0,4, (byte) (TimeToWrite % 10) , false); // tens op de 5de digit van rechts , we nemen via modulo 10 (en ervoor delen door 10) de tientallen
TimeToWrite /= 10UL;
lc.setDigit(0,5, (byte) (TimeToWrite % 10) , false); // hundreds op de 6de digit van rechts , we nemen via modulo 10 (en ervoor delen door 100) de honderdtallen
TimeToWrite /= 10UL;
lc.setDigit(0,6, (byte) (TimeToWrite % 10) , false); // thousands op de 7de digit van rechts , we nemen via modulo 10 (en ervoor delen door 1000) de duizendtallen
}
}
void EEPROMTimeWrite(unsigned long TimeToWrite,char EEPROMOffset) {
unsigned long HulpLong = 0;
char HulpByte = 0;

HulpLong = TimeToWrite & 0x000000FF; // alle bits wissen behalve de 8 eerste
HulpByte = (char) HulpLong; // long -> byte = enkel de 8 rechtse bits onthouden
EEPROM.write(3 + (byte) EEPROMOffset, HulpByte); // de kleinste bitwaarden op eeprom adres 3 zetten
HulpLong = TimeToWrite & 0x0000FF00; // alle bits wissen behalve bit 8-15
HulpLong = HulpLong >> 8; // verschuif alle bits 8 posities naar rechts zodat bit 8-15 komt naar bit 0-7
HulpByte = (char) HulpLong; // long -> byte = enkel de 8 rechtse bits onthouden
EEPROM.write(2 + (byte) EEPROMOffset, HulpByte);
HulpLong = TimeToWrite & 0x00FF0000; // alle bits wissen behalve bit 16-23
HulpLong = HulpLong >> 16; // verschuif alle bits 16 posities naar rechts zodat bit 16-23 komt naar bit 0-7
HulpByte = (char) HulpLong; // long -> byte = enkel de 8 rechtse bits onthouden
EEPROM.write(1 + (byte) EEPROMOffset, HulpByte);
HulpLong = TimeToWrite & 0xFF000000; // alle bits wissen behalve de 8 laatste
HulpLong = HulpLong >> 24; // verschuif alle bits 24 posities naar rechts zodat bit 24-31 komt naar bit 0-7
HulpByte = (char) HulpLong; // long -> byte = enkel de 8 rechtse bits onthouden
EEPROM.write(0 + (byte) EEPROMOffset, HulpByte); // de grootste bitwaarden op eeprom adres 0 zetten

}

unsigned long EEPROMTimeRead(char EEPROMOffset) {
unsigned long HulpLong = 0UL;
char HulpByte = 0;
HulpByte = EEPROM.read(0 + (byte) EEPROMOffset); // lees de grootste bitwaarden van op eeprom adres 0
HulpLong += (unsigned long) HulpByte;
HulpLong = HulpLong << 8; // verschruif de bitwaarden naar links voor 8 bits
HulpByte = EEPROM.read(1 + (byte) EEPROMOffset);
HulpLong += (unsigned long) HulpByte;
HulpLong = HulpLong << 8; // verschruif de bitwaarden naar links voor 8 bits
HulpByte = EEPROM.read(2 + (byte) EEPROMOffset);
HulpLong += (unsigned long) HulpByte;
HulpLong = HulpLong << 8; // verschruif de bitwaarden naar links voor 8 bits
HulpByte = EEPROM.read(3 + (byte) EEPROMOffset); // lees de kleinste bitwaarden van op eeprom adres 3
HulpLong += (unsigned long) HulpByte;
return HulpLong;
}

void handleEEPROMTime() {
// 4294967295 milli seconds = 1193.046470833 hours = 71582.78825 minutes = 4294967.295 seconds (0-4294967295 = range unsigned long)
// eeprom may be used for 100.000 eeprom read / write cycles

// unsigned long EEPROMDagTeller; // Hierin staat het aantal millis dat de vorige keer werd weggeschreven naar de EEPROM, veranderd gedurig
// unsigned long EEPROMTotaalTeller ; // Hierin staat het aantal millis dat bij de opstart van het programma werd uitgelezen uit de EEPROM, eenmalig !
// unsigned long EEPROMDagOldMillis=0;// Hierin staat het aantal millis dat er voorbij zijn tijdens het opstart van deze sessie in de ARDUINO
// #define EEPROMAdresDagTeller 32 // op deze locatie in de EEPROM staat de dagteller in millis
// #define EEPROMAdresTotaalTeller 48 // op deze locatie in de EEPROM staat de totaalteller in millis

// bool TellerToegestaan = false; // false : er mag niet geteld worden, true, er moet geteld worden

unsigned long HulpMillis = millis();



if (TellerToegestaan == true) {
if ( HulpMillis > EEPROMDagOldMillis + 90000UL ) { // Slechts om de 90000milis = 1MIN 30 uitvoeren
EEPROMDagOldMillis = HulpMillis;
EEPROMDagTeller += 90000UL;
EEPROMTotaalTeller += 90000UL;
EEPROMTimeWrite(EEPROMDagTeller,EEPROMAdresDagTeller);
EEPROMTimeWrite(EEPROMTotaalTeller,EEPROMAdresTotaalTeller);
}
}
}

void ShowKey(char aKey) {

char *Message = (char*) "";
// if (key != NO_KEY) {

switch (key) {
case keyHome:
Message = (char*) "Home";
break;
case keyEnd:
Message = (char*) "End";
break;
case keyPlus:
Message = (char*)"+";
break;
case keyMin:
Message = (char*)"-";
break;
case keyLeft:
Message = (char*)"<";
break;
case keyRight:
Message = (char*)">";
break;
case keyUp:
Message = (char*)"Up";
break;
case keyDown:
Message = (char*)"Dn";
break;
case keyST:
Message = (char*)"ST";
break;
case keyPitot:
Message = (char*)"Pitot";
break;
case keyOk:
Message = (char*)"Ok";
break;
case keyCorrection:
Message = (char*)"C";
break;
case keyPump:
Message = (char*)"pump";
break;
case keyNaf:
Message = (char*)"NAF";
break;
case keyLL:
Message = (char*)"LL";
break;

}
tft.setCursor(100, 100);
tft.setTextColor(ILI9340_BLUE);
tft.setTextSize(2);
tft.print(Message);
delay(100);
MenuNrOld = 255; // Als het oud menu nr <> menunr dan wordt het scherm straks hertekend, dus ...
// }

}

void handlePumpNafSTLLPitot(){
int hulpOutput = 0;
if (relayPump) {
hulpOutput += 1; // 00000001%;
}
if (relayNaf) {
hulpOutput += 2; // 00000010%;
};
if (relayST) {
hulpOutput += 4; // %00000100;
};
if (relayLL) {
hulpOutput += 8; // %00001000;
};
if (relayPitot) {
hulpOutput += 16; // %00010000
};
/*
Wire.beginTransmission(OutputCard01); // selecteer de outputcard op de IIC bus
if (Wire.endTransmission() == 0) {
Wire.beginTransmission(OutputCard01);
Wire.write(GPIOA); // selecteer daarop address port A
Wire.write(hulpOutput); // schrijf de waarde voor de relais (optocouplers)
Wire.endTransmission();
}
*/

I2c.begin();
I2c.write(OutputCard01,GPIOA,hulpOutput);
I2c.end();

if (OldOutputValue != hulpOutput) {
tft.setTextSize(1);
tft.setTextWrap(false);
tft.setRotation(1);
tft.setTextColor(ILI9340_CYAN);
tft.setCursor( 0,180);
tftPrintRelayText("Pump",relayPump, 5,220);
tftPrintRelayText("Naf",relayNaf, 65,220);
tftPrintRelayText("ST",relayST, 125,220);
tftPrintRelayText("LL",relayLL, 185,220);
tftPrintRelayText("Pitot",relayPitot,245,220);

OldOutputValue = hulpOutput;
}
}
void tftPrintRelayText(char *Tekst,bool Status,unsigned int XPos,unsigned int YPos){
tft.setCursor(XPos,YPos);
if (Status) {
tft.setTextColor(ILI9340_GREEN);
tft.print(Tekst);
tft.print(" ON ");
} else {
tft.setTextColor(ILI9340_RED);
tft.print(Tekst);
tft.print(" OFF ");
}
}


void handleMenu() {
char lus;
unsigned int ScreenX = 15; // op deze X coordinaat zal de volgende tekst op de tft komen (via tft.print)
unsigned int ScreenY = 10; // op deze Y coordinaat zal de volgende tekst op de tft komen (via tft.print)
StrMenu regelUitTabel; // deze variabele stelt een buffer voor van een menulijn die gekopieerd zal worden uit PROGMEM

if (MenuNr != MenuNrOld) { // als het vorig menu die op het scherm getekend was niet hetzelfde is als het nieuw te tekenen
// scherm, alleen dan wis het scherm en bouw het menu opnieuw op
// dit omdat het scherm anders teveel flikkert en er teveel cpu tijd verloren gaat
tft.fillScreen(ILI9340_BLACK);
tft.setTextWrap(false);
tft.setRotation(1);

handlePumpNafSTLLPitot();


for (lus = MenuMin; lus < ArraySize(MenuList); lus++) {

memcpy_P(&regelUitTabel, &MenuList[lus], sizeof(regelUitTabel)); // kopieer de te testen regel uit het menu uit het PROGMEM naar een lokale variable

if (regelUitTabel.nrMenu == MenuNr) { // dit is het chapter uit het menu die getoond moet worden
if (regelUitTabel.isMenuName) { // deze lijn is een menu naam
ScreenX = 10;
tft.setTextSize(2);
tft.setCursor(ScreenX, ScreenY);
tft.setTextColor(ILI9340_BLUE,ILI9340_BLACK); // menu namen zijn blauw
tft.print(regelUitTabel.textLineBold);
ScreenY += 30; // omdat een chapter in textsize 2 staat verhogen we Y met 30

}
else { // deze lijn is geen menu naam maar dus een menu item
ScreenX = 10;
tft.setTextSize(1);
tft.setCursor(ScreenX, ScreenY);
if (lus % 2 == 1) {
tft.setTextColor(ILI9340_WHITE, ILI9340_BLACK); // menu items links zijn wit
}
else {
tft.setTextColor(ILI9340_WHITE, ILI9340_BLUE);
}
tft.print(regelUitTabel.textLineBold);
ScreenX = 170;
tft.setCursor(ScreenX, ScreenY);
if (lus % 2 == 1) {
tft.setTextColor(ILI9340_YELLOW,ILI9340_BLACK); // menu items rechts zijn geel
}
else {
tft.setTextColor(ILI9340_YELLOW,ILI9340_BLUE);
}

tft.print(regelUitTabel.textLineNormal);
ScreenY += 15; // omdat dit geen chapter is maar een gewone regel in textsize 1 verhogen we Y met 15
}

}
}
MenuNrOld = MenuNr;
}
}

void handleInputFuses() {
// struct StrFuseList {
// char FuseInputNr;
// char FuseInputNameSmall[5];
// char FuseInputName[20];
// char FuseValue[5];
// };
char lus;
char hulpInputCard1A = 0;
char hulpInputCard1B = 0;
char hulpInputCard2A = 0;
char hulpInputCard2B = 0;

unsigned int ScreenX = 10; // op deze X coordinaat zal de volgende tekst op de tft komen (via tft.print)
unsigned int ScreenY = 10; // op deze Y coordinaat zal de volgende tekst op de tft komen (via tft.print)
StrFuseList regelUitTabel; // deze variabele stelt een buffer voor van een fuselijn die gekopieerd zal worden uit PROGMEM

/*
// read the inputs of bank A Inputcard 01
Wire.beginTransmission(InputCard01);
Wire.write(0x13); /////////////////////////////////////////////
Wire.endTransmission();
Wire.requestFrom(InputCard01, 1);
hulpInputCard1A=Wire.read();

// read the inputs of bank B Inputcard 01
Wire.beginTransmission(InputCard01);
Wire.write(0x13);
Wire.endTransmission();
Wire.requestFrom(InputCard01, 1);
hulpInputCard1B=Wire.read();

// read the inputs of bank B Inputcard 01
Wire.beginTransmission(InputCard02);
Wire.write(0x13); ////////////////////////////////////////////////
Wire.endTransmission();
Wire.requestFrom(InputCard01, 1);
hulpInputCard2A=Wire.read();

// read the inputs of bank B Inputcard 02
Wire.beginTransmission(InputCard02);
Wire.write(0x13);
Wire.endTransmission();
Wire.requestFrom(InputCard01, 1);
hulpInputCard2B=Wire.read();


*/



/*
if (millis() % 2000 == 7) {
for (lus = 0; lus < ArraySize(FuseList); lus++) {

memcpy_P(&regelUitTabel, &FuseList[lus], sizeof(regelUitTabel)); // kopieer de te testen regel uit het menu uit het PROGMEM naar een lokale variable
Serial.print("Foutregel : ");
Serial.print( (byte)regelUitTabel.FuseInputNr);
Serial.print(regelUitTabel.FuseInputNameSmall);
Serial.print(regelUitTabel.FuseInputName);
Serial.println(regelUitTabel.FuseValue);
}
}
*/
}

void showScreenWelcome() {
tft.fillScreen(ILI9340_BLACK);
tft.setTextSize(5);
tft.setTextWrap(false);
tft.setRotation(1);
tft.setCursor(50,20);
tft.setTextColor(ILI9340_BLUE);
tft.print("WELCOME");
tft.setTextSize(2);
tft.setTextColor(ILI9340_RED);
tft.setCursor(10,150);
tft.print("TO RESET DAY CLOCK: ");
tft.setCursor(10,170);
tft.print("PUSH 3 x RED BUTTON C");
delay(1000);
}

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 6 gasten