Saab 9-5 Vector -05


Tänkte lägga upp lite uppgraderingar på 9-5an. Den har redan blivit Maptunad med ett Steg 1 BioPower program. Man måste ha lite extra krut (och så kör man miljövänligt...).
Sedan åkte Stereon ut och min gamla Alpine från 9000 monterades in dold med bara rattstyrningen och en framdragen USB uttag som extern koppling. 
Tog en blindknapp vid ratten och kom på att den kanske skulle passa nere vid stolvärmen istället.
Men döm om min förvåning när blindknappen där inte har samma storlek !! Här undrar man hur Saab tänkte, kul att göra flera pressverktyg eller...
Det blev en hembyggd Hög till Lågnivå kabel också. 2st. 680 ohm 1 Watts motstånd och ett 56 ohms 1/2 Watts per kanal.
Sedan lyckades man bland hane och hon kontakterna så det var bara att löda om (man hade ju 50% chans att gissa rätt)

Surfplattan passa som en smeck. Hål för laddkabel och ett smalt band för styra Standby knappen.
Nu börjar man känna sig hemma...
Byggt vidare på rattbelysningen jag gjort till 9000.
http://saab9000vector.blogspot.se/2014/02/rattknappsbelysning.html
Det jag gjorde mer var att Dremla hål i symbolerna +,- och pilarna.
Här får man inte dremla med en borr för den vobblar för mycket.(man lär sig på misstagen)
För den som har laserskärare eller nått liknande så underlättar det en massa.
Fyller "hålrummet" sedan med "matt" smältlim eller som jag stearin och därefter
klar lackade jag ett par gånger.


Saab 9000 ARC: Surfplatta, Nya Hjul, AQS och Regnsensor.

Nu kom sågen fram (ni får blund ni som inte tål bilderna). AQS sensorn blev också monterad.

 Sedan har det blivit Aero fälgar.
 Regnsensor har jag kopplat in på nytt sätt där jag ersätter hela relät med denna hemmagjorta kontakt.
 2 Reläer Hög och Lågfart och en kabel till spakstället för styrning av Högfartläget från Regnsensorn.
Schemat för den nya inkopplingen och reläkontakten.


Saab 9000 Vector

Såld och ersatt av Saab 9-5 Vector -05
Så det är väl bara att börja om från början....

2,0t -98 som är Etanol konverterad + T7 magnetventil (Nordic Steg 1 trim)
Den har precis passerat 30000 mila sträcket (and still going strong).



















Utrustad med
Automatisk avbländande inre backspegel,
Baksätesvärme 30 min. automatik samt
ventilation till baksätesutrymmet med fläkt.
DRL led lampor i läge 1 på ljusomkopplaren.
Den är också utrustad med Samsung Surfplatta som man kan kopplas upp med 3G via en telefon.
Finns fördraget el och ljud i bagageluckan för en subwoofer samt 3 cigg.uttag
allt övrigt som klimatanläggning och farthållare mm. finns och fungerar perfekt.
Nya sommardäck sedan i våras. Michelin Energy Saver.
Vinterdäck dubb på aluminium fälgar ingår.
Samt backvarnare ....

Lite små uppdateringar.

Det var lite rea efter jul så det blev lite små inköp.
Dashcam för 179 kr varför inte. Fungerar helt OK.
Jag gör nog en mer permanent och diskretare installation framöver.

 Sedan är det väl bra att ladda batteriet när man eldar på med kupevärmaren.
Och varför inte ha lite extra koll på däcktrycket för att se om däcktrycks övervakningen fungerar.
Toppen blir röd om det går under 2,5 bar.

Rattknappar-Arduino till JVC sterero. Mjukvaran.

Har byggt vidare på rattknappsstyrningen till att styra en JVC stereo.
Det blev en blandning mellan Alpine mjukvaran och JVC mjukvara jag hittat på nätet.
https://www.avforums.com/threads/jvc-stalk-adapter-diy.248455/
http://saab9000vector.blogspot.se/2012/05/rattknappar-till-en-alpine-stereo.html

Och här kommer mjukvaran...........

//Inklusive Tutan med egen utgång pin8 ,pull up moständ 470 ohm.
// Connect Arduino PIN to Base of NPN transistor
/* Emitter is tied to ground
Collector is tied to 3.5mm TIP
Ground 3.5mm Ring/Sleeve
__________ JVC remote input
---- | /C
| 3.3K |/
PIC|----/\/\/\---| NPN (PN2222 or 2N3904)
| B|\
---- | \E
|_________________|__________ Ground
*/
// this works with a simgle button and has the correct timings
// adding the send of signals to stereo.. simulating by sending to serial
#define CHECK_MS 5
#define DOUBLE_MS 400
#define HOLD_MS 1200

#define NO_B 870 //nothing pressed 4,2 volt
#define MODE_B 765 // NXT(mode)776 3,6
#define NXTD_B 643 // NEXT DOWN<< 3,0 #define NXTU_B 508 // NEXT UP>> 2,4
#define MUTE_B 385 // SRC (mute) 1,8
#define VOLU_B 264 // VOLUME UP+ 1,2
#define VOLD_B 151 // VOLUME DOWN- 0,7
#define HORN 020 // TUTAN 0,0 volt

#define outPIN 1 //utgång 7 JVC stereo
#define hornPin 3 //utgång 8 för tutan 480ms high
int Reps = 4; // 3 Number of times to repeat each transmission
int Length = 537; // Length in Microseconds

boolean spFlag = 0;
boolean dpFlag = 0;
boolean hpFlag = 0;

int button = 0;
int spbutton = 0;

void setup() {
Serial.begin(9600);
pinMode(outPIN, OUTPUT); // stereo utgång
pinMode(hornPin, OUTPUT); //tut utgången
}
void loop() {
//----------------- tut funktionen
int anaPin = 0; // rattknappsignal och tutan
anaPin = analogRead(anaPin);
if (anaPin > HORN - 20 && anaPin < HORN + 20 ) {digitalWrite(hornPin, HIGH); //hornPin delay(48); digitalWrite(hornPin, LOW); //hornPin } //-------------avläsning av rattknappar static unsigned long oldTime = 0; int switchStatus = 0; if (millis() >= oldTime + CHECK_MS) {
oldTime = millis();
switchStatus = CheckSwitch();

if (switchStatus == 0) { //no button press

} else if (switchStatus == 1) {
// single press
switch (spbutton) {
case 0: // no butto, why are wh here
break;
case 1: // NXT- PLAY ON/OFF
entPlaySend(); // JVC Equlizer
break;
case 2: // next up
trkUpSend();
break;
case 3: // next down
trkDnSend();
break;
case 4: // SRC
sourceSend();
break;
case 5: // vol up
volUpSend();
break;
case 6: // vol down
volDnSend();
break;
}
} else if (switchStatus == 2) {
//double press
switch (spbutton) {
case 0: // no butto, why are wh here
break;
case 1: // NXT mode
soundSend(); // JVC sound
break;
case 2: // next up (folder up)
pstUpSend();
break;
case 3: // next down (folder down)
pstDnSend();
break;
case 4: // SRC mute
muteSend();
break;
case 5: // vol up
volUpSend();
break;
case 6: // vol down
volDnSend();
break;
}
} else if (switchStatus == 3) {
//hold
switch (spbutton) {
case 0: // no butto, why are wh here
break;
case 1: // NXT mode mute
muteSend();
break;
case 2: // next up (track fwd)
trkUpSend();
break;
case 3: // next down (track rev)
trkDnSend();
break;
case 4: // SRC
powerSend();
break;
case 5: // vol up
volUpSend();
break;
case 6: // vol down
volDnSend();
break;
}
}
}
}

// Service routine called by a timer interrupt
int CheckSwitch() {
static uint16_t State = 0; // Current debounce status
static int curTime = 0;

State=(State<<1) | !RawKeyPressed() | 0xe000; if (!spFlag) { if (hpFlag) { if (State == 0xe000) { return 3; } else { hpFlag = 0; } } if (State==0xf000) { spFlag = 1; hpFlag = 1; dpFlag = 1; curTime = 0; spbutton = button; return 0; } } if (hpFlag && State != 0xe000) { hpFlag = 0; } if (spFlag && hpFlag && curTime > HOLD_MS/CHECK_MS) {
spFlag = 0;
dpFlag = 0;
return 3;
} else if (spFlag && dpFlag && State == 0xf000 && curTime < DOUBLE_MS) { spFlag = 0; hpFlag = 0; dpFlag = 0; return 2; } else if (spFlag && !hpFlag && curTime > DOUBLE_MS) {
spFlag = 0;
hpFlag = 0;
dpFlag = 0;
return 1;
} else {
curTime = curTime + CHECK_MS;
return 0;
}
}
//----------resistansnätet Spänningsnivån på knapparna
boolean RawKeyPressed() {
int anaPin = 0;
anaPin = analogRead(0);
if (anaPin > NO_B - 20) {
button = 0;
return 0;
} else if (anaPin > MODE_B - 20 && anaPin < MODE_B + 20 ) { button = 1; return 1; } else if (anaPin > NXTU_B - 40 && anaPin < NXTU_B + 40 ) { button = 2; return 1; } else if (anaPin > NXTD_B - 40 && anaPin < NXTD_B + 40 ) { button = 3; return 1; } else if (anaPin > MUTE_B - 40 && anaPin < MUTE_B + 40 ) { button = 4; return 1; } else if (anaPin > VOLU_B - 40 && anaPin < VOLU_B + 40 ) { button = 5; return 1; } else if (anaPin > VOLD_B - 40 && anaPin < VOLD_B + 40 ) {
button = 6;
return 1;
} else {
button = 0;
return 0;
}
}
//-----------SOURCE------------------
void sourceSend() { // Send 0x08
for (int i = 1; i <= Reps; i++) {
Preamble();
bZERO(); bZERO(); bZERO(); bONE(); // 8
bZERO(); bZERO(); bZERO(); // 0
Postamble();
}
}
//-----------POWER ON/OFF------------------
void powerSend() { // Send 0x00
for (int i = 1; i <= Reps; i++) {
Preamble();
bZERO(); bZERO(); bZERO(); bZERO(); // 0
bZERO(); bZERO(); bZERO(); // 0
Postamble();
}
}
//---------Track NEXT UP-----------------------------------------------
void trkUpSend() { // Send 0x12
for (int i = 1; i <= Reps; i++) {
Preamble();
bZERO(); bONE(); bZERO(); bZERO(); // 2
bONE(); bZERO(); bZERO(); // 1
Postamble();
}
}
//---------Track NEXT DOWN----------------------------------------------
void trkDnSend() { // Send 0x13
for (int i = 1; i <= Reps; i++) {
Preamble();
bONE(); bONE(); bZERO(); bZERO(); // 3
bONE(); bZERO(); bZERO(); // 1
Postamble();
}
}
//---------Folder PST? UP-----------------------------------------------
void pstUpSend() { // Send 0x14
for (int i = 1; i <= Reps; i++) {
Preamble();
bZERO(); bZERO(); bONE(); bZERO(); //4
bONE(); bZERO(); bZERO(); // 1
Postamble();
}
}
//---------Folder PST? DOWN----------------------------------------------
void pstDnSend() { // Send 0x15
for (int i = 1; i <= Reps; i++) {
Preamble();
bONE(); bZERO(); bONE(); bZERO(); // 5
bONE(); bZERO(); bZERO(); // 1
Postamble();
}
}
//---------MUTE-onoff?--------------------------------------------------
void onoffSend() { // Send 0x0E
for (int i = 1; i <= Reps; i++) {
Preamble();
bZERO(); bONE(); bONE(); bONE(); // E (14)
bZERO(); bZERO(); bZERO(); // 0
Postamble();
}
}
//----------Mute--------------------------------------------------
void muteSend() { // Send 0x06 ATT mute
for (int i = 1; i <= Reps; i++) {
Preamble();
bZERO(); bONE(); bONE(); bZERO(); // 6
bZERO(); bZERO(); bZERO(); // 0
Postamble();
}
}
//---------JVC Equilazer---------------------------------------------------
void entPlaySend() { // Send 0x16
for (int i = 1; i <= Reps; i++) {
Preamble();
bZERO(); bONE(); bONE(); bZERO(); // 6
bONE(); bZERO(); bZERO(); // 1
Postamble();
}
}
//---------VOL UP-----------------------------------------------
void volUpSend() { // Send 0x04
for (int i = 1; i <= Reps; i++) {
Preamble();
bZERO(); bZERO(); bONE(); bZERO(); //4
bZERO(); bZERO(); bZERO(); // 0
Postamble(); Serial.println("Vup");
}
}
//---------VOL DOWN-----------------------------------------------
void volDnSend() { // Send 0x05
for (int i = 1; i <= Reps; i++) {
Preamble();
bONE(); bZERO(); bONE(); bZERO(); // 5
bZERO(); bZERO(); bZERO(); // 0
Postamble();
}
}
//----------JVC sound----------------------------------------------
void soundSend() { // Send 0x0D
for (int i = 1; i <= Reps; i++) {
Preamble();
bONE(); bZERO(); bONE(); bONE(); // D (13)
bZERO(); bZERO(); bZERO(); // 0
Postamble();
}
}

//---------------JVC koder
void bONE() { // Send a binary ONE over the line
digitalWrite(outPIN, HIGH); // Pull 3.5mm TIP low
delayMicroseconds(Length); // for 537us
digitalWrite(outPIN, LOW); // Allow 3.5mm TIP to go high
delayMicroseconds(Length * 3); // for 537 * 3 = 1611us
Serial.print(" 1");
}
void bZERO() { // Send a binary ZERO over the line
digitalWrite(outPIN, HIGH); // Pull 3.5mm TIP low
delayMicroseconds(Length); // for 537us
digitalWrite(outPIN, LOW); // Allow 3.5mm TIP to go high
delayMicroseconds(Length); // for 537us
Serial.print(" 0");
}
void Preamble() {
digitalWrite(outPIN, LOW); // Not sure what this does
delayMicroseconds(Length * 1);
digitalWrite(outPIN, HIGH); // AGC
delayMicroseconds(Length * 16);
digitalWrite(outPIN, LOW); // AGC
delayMicroseconds(Length * 8);
bONE(); // 1 Start Bit
// (7 bit device code)
bONE(); bONE(); bONE(); bZERO(); // 7
bZERO(); bZERO(); bONE(); //4
}
void Postamble() {
bONE(); bONE(); // 2 stop bits
}

TPMS testmjukvaran x 2.

/*Larmar med ljud och LED-ljus om en ABS signal räknar fler pulser än dom andra = lågt lufttryck i ett däck.*/

const int larmPin = 7; // the number of the Buzzer pin
const int VFpin = 10; //
const int HFpin = 11; //
const int VBpin = 12; //
const int HBpin = 13; // blinkar vid uppstart
int VFvalue = 0; //ABS värde VF osv.
int HFvalue = 0;
int VBvalue = 0;
int HBvalue = 0;
int ABSvalue = 0;
unsigned long oldMillis = 0;
unsigned long kollMillis = 0; //timer för att nolla kollräknaren.
float punka = 1 ; // 0.95 skillnad som ger indikering på punktering
int Fel = 5; //antal Fel 5 innan larmindikering
int kollVF = 0; int kollHF = 0; int kollVB = 0; int kollHB = 0;
int kollVFtot = 0; int kollHFtot = 0; int kollVBtot = 0; int kollHBtot = 0;
int timer = 500; // tid som ABS pulserna räknas 250
volatile int SensorCountVF = 0; // Speed Sensor pulse count
void AddSensorCountVF() { // This is the subroutine that is called when interrupt 0 goes high
SensorCountVF++; // Increment SensorCount by 1
}
volatile int SensorCountHF = 0; // Speed Sensor pulse count
void AddSensorCountHF() { // This is the subroutine that is called when interrupt 0 goes high
SensorCountHF++; // Increment SensorCount by 1
}
volatile int SensorCountVB = 0; // Speed Sensor pulse count
void AddSensorCountVB() { // This is the subroutine that is called when interrupt 0 goes high
SensorCountVB++; // Increment SensorCount by 1
}
volatile int SensorCountHB = 0; // Speed Sensor pulse count
void AddSensorCountHB() { // This is the subroutine that is called when interrupt 0 goes high
SensorCountHB++; // Increment SensorCount by 1
}
void setup() {
pinMode(larmPin, OUTPUT);
pinMode(VFpin, OUTPUT);
pinMode(HFpin, OUTPUT);
pinMode(VBpin, OUTPUT);
pinMode(HBpin, OUTPUT);
//digitalWrite(VFpin, HIGH); delay(500);digitalWrite(HFpin, HIGH); delay(500);digitalWrite(VBpin, HIGH); delay(500);digitalWrite(HBpin, HIGH);
//delay(500);
//digitalWrite(VFpin, LOW); delay(500);digitalWrite(HFpin, LOW);delay(500); digitalWrite(VBpin, LOW);delay(500); digitalWrite(HBpin, LOW);
attachInterrupt(0, AddSensorCountHB, RISING); // HB Interrupt 0 is on digital pin 3
attachInterrupt(1, AddSensorCountVB, RISING); // VB Interrupt 1 pin 2
attachInterrupt(3, AddSensorCountHF, RISING); // HF Interrupt 3 is on digital pin 1
attachInterrupt(2, AddSensorCountVF, RISING); // VF Interrupt 2 pin 0
}
void loop() {
//------------ räknar pulser ABS senorerna
if(millis()-oldMillis > timer && millis()-oldMillis < timer*2 ){ attachInterrupt(2, AddSensorCountVF, RISING); // Interrupt 0 is on digital pin 3 if (VFvalue < SensorCountVF){ VFvalue = SensorCountVF; } attachInterrupt(3, AddSensorCountHF, RISING); // Interrupt 1 is on digital pin 2 if (HFvalue < SensorCountHF){ HFvalue = SensorCountHF; } attachInterrupt(1, AddSensorCountVB, RISING); // Interrupt 3 is on digital pin 1 if (VBvalue < SensorCountVB){ VBvalue = SensorCountVB; } attachInterrupt(0, AddSensorCountHB, RISING); // Interrupt 2 is on digital pin 0 if (HBvalue < SensorCountHB){ HBvalue = SensorCountHB; } ABSvalue=(VFvalue+HFvalue+VBvalue+HBvalue)/4 ; } // ---------------------- AntiSpinn--------ej aktiverat än... /* if (VFvalue-5 >HFvalue && VFvalue-5 >HBvalue && VFvalue-5 >VBvalue) // Om VF roterar snabbare än övriga
{ larmSend(); digitalWrite(VFpin, HIGH); delay(5000); digitalWrite(VFpin, LOW);
digitalWrite(VFpin, HIGH); delay(5000); digitalWrite(VFpin, LOW);
}
if (HFvalue-5 >VFvalue && HFvalue-5 >HBvalue && HFvalue-5 >VBvalue) // Om HF roterar snabbare än övriga
{ larmSend(); digitalWrite(HFpin, HIGH); delay(5000); digitalWrite(HFpin, LOW);
digitalWrite(HFpin, HIGH); delay(5000); digitalWrite(HFpin, LOW);
}
*/
//---------------------------------------Kontroll av ABS signaler varannan sek. 4*500ms
if(millis()-oldMillis > timer*4 && millis()-oldMillis < timer*5 ) { // -------------ABS sensor fel/avbrott if (VFvalue<5 && HFvalue>200 && HBvalue>200 && VBvalue>200) // om VF saknar pulser medans dom andra visar mer än 200
{ digitalWrite(VFpin, HIGH); //digitalWrite(VBpin, HIGH); digitalWrite(HBpin, HIGH); // inget larmljud, bilen bör visa ABS fel.
delay(10000); digitalWrite(VFpin, LOW); digitalWrite(HFpin, LOW); digitalWrite(VBpin, LOW); digitalWrite(HBpin, LOW);
}
if (HFvalue<5 && VFvalue>200 && HBvalue>200 && VBvalue>200) //HF
{ digitalWrite(HFpin, HIGH); //digitalWrite(VBpin, HIGH); digitalWrite(HBpin, HIGH);
delay(10000); digitalWrite(VFpin, LOW); digitalWrite(HFpin, LOW); digitalWrite(VBpin, LOW); digitalWrite(HBpin, LOW);
}
if (VBvalue<5 && HFvalue>200 && HBvalue>200 && VFvalue>200) //VB
{ digitalWrite(VBpin, HIGH); //digitalWrite(HFpin, HIGH); digitalWrite(HBpin, HIGH);
delay(10000); digitalWrite(VFpin, LOW); digitalWrite(HFpin, LOW); digitalWrite(VBpin, LOW); digitalWrite(HBpin, LOW);
}
if (HBvalue<5 && HFvalue>200 && VFvalue>200 && VBvalue>200) //HB
{ digitalWrite(HBpin, HIGH); //digitalWrite(HFpin, HIGH); digitalWrite(VBpin, HIGH);
delay(10000); digitalWrite(VFpin, LOW); digitalWrite(HFpin, LOW); digitalWrite(VBpin, LOW); digitalWrite(HBpin, LOW);
}
//---------------------------------------Kontroll av ABS signaler mer än 30km/t och 150km/t skillnad på 1 puls.
if (VFvalue>200 && HFvalue>200 && HBvalue>200 && VBvalue>200){ //120 ca 20 km/h, 760 ca 110 km/tim
if (VFvalue<800 && HFvalue<800 && HBvalue<800 && VBvalue<800){ //max värde 800 150 km/h // Jämför VF med dom andra värdena if (VFvalue-punka>HFvalue && VFvalue-punka>HBvalue && VFvalue-punka>VBvalue)
{ kollVF=kollVF+1 ; // räknar med 1 vid varje fel
if (kollVF == Fel) // kontroll x antal gånger innan fel indikeras
{ kollVFtot=kollVFtot+1 ;larmSend(); digitalWrite(HFpin, HIGH); digitalWrite(VBpin, HIGH); digitalWrite(HBpin, HIGH); delay(10000);
digitalWrite(VFpin, LOW); digitalWrite(HFpin, LOW); digitalWrite(VBpin, LOW); digitalWrite(HBpin, LOW); kollVF=0;
}} // Jämför HF med dom andra värdena
if (HFvalue-punka>VFvalue && HFvalue-punka>HBvalue && HFvalue-punka>VBvalue)
{ kollHF=kollHF+1 ;
if (kollHF == Fel) // kontroll 3 gånger innan fel indikeras
{ kollHFtot=kollHFtot+1 ;larmSend(); digitalWrite(VFpin, HIGH); digitalWrite(VBpin, HIGH); digitalWrite(HBpin, HIGH); delay(10000);
digitalWrite(VFpin, LOW); digitalWrite(HFpin, LOW); digitalWrite(VBpin, LOW); digitalWrite(HBpin, LOW); kollHF=0;
} } // Jämför VB med dom andra värdena
if (VBvalue-punka>VFvalue && VBvalue-punka>HFvalue && VBvalue-punka>HBvalue)
{ kollVB=kollVB+1 ;
if (kollVB == Fel) // kontroll 3 gånger innan fel indikeras
{ kollVBtot=kollVBtot+1 ;larmSend(); digitalWrite(VFpin, HIGH); digitalWrite(HFpin, HIGH); digitalWrite(HBpin, HIGH); delay(10000);
digitalWrite(VFpin, LOW); digitalWrite(HFpin, LOW); digitalWrite(VBpin, LOW); digitalWrite(HBpin, LOW); kollVB=0;
} } // Jämför HB med dom andra värdena
if (HBvalue-punka>VFvalue && HBvalue-punka>HFvalue && HBvalue-punka>VBvalue)
{ kollHB=kollHB+1 ;
if (kollHB == Fel) // kontroll 3 gånger innan fel indikeras
{ kollHBtot=kollHBtot+1 ;larmSend(); digitalWrite(VFpin, HIGH); digitalWrite(HFpin, HIGH); digitalWrite(VBpin, HIGH); delay(10000);
digitalWrite(VFpin, LOW); digitalWrite(HFpin, LOW); digitalWrite(VBpin, LOW); digitalWrite(HBpin, LOW); kollHB=0;
} } } }
//---------Om den indikerar fel fler än 3 ggr indikerar den fel hela tiden
if (kollVFtot == 3) // kontroll x antal gånger innan fel indikeras
{ digitalWrite(HFpin, HIGH); digitalWrite(VBpin, HIGH); digitalWrite(HBpin, HIGH); kollVF=0; }
if (kollHFtot == 3) // kontroll 3 gånger innan fel indikeras
{ digitalWrite(VFpin, HIGH); digitalWrite(VBpin, HIGH); digitalWrite(HBpin, HIGH); kollHF=0; }
if (kollVBtot == 3) // kontroll 3 gånger innan fel indikeras
{ digitalWrite(VFpin, HIGH); digitalWrite(HFpin, HIGH); digitalWrite(HBpin, HIGH); kollVB=0; }
if (kollHBtot == 3) // kontroll 3 gånger innan fel indikeras
{ digitalWrite(VFpin, HIGH); digitalWrite(HFpin, HIGH); digitalWrite(VBpin, HIGH); kollHB=0; }
//---------------------------------------Nollar sensor värdena och ny tid efter kontrollerna
SensorCountVF = 0; SensorCountHF = 0; SensorCountVB = 0; SensorCountHB = 0;
oldMillis = millis();
VFvalue = 0; HFvalue = 0; VBvalue = 0; HBvalue = 0;
}
//---------------------------------------nollar felräknaren vart 30 sek
if(millis()-kollMillis > 30000) { // 15 sek intervall
kollVF = 0; kollHF = 0; kollVB = 0; kollHB = 0;
kollMillis = millis(); // nollar koll timern§
}
}
void larmSend() { // larm vid punkterings indikering
digitalWrite(larmPin, HIGH); delay(800);
digitalWrite(larmPin, LOW);
}
--------------------------------------------------------------------------------------------------------
// Test mjukvara för TPMS Däcktrycks övervakning. Uppdat2014/12 nya tider..
#include <LiquidCrystal.h>
const int larmPin =  7;      // the number of the Buzzer pin
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
int backlightPin = 6; //pwm pin
int brightness = 150; //0-255 0=svagtljus
int kontrastPin =5;  //pwm pin
int kontrast = 50; //från 0-110 110=svagt
int VFvalue = 0;  //ABS värde VF osv.
int HFvalue = 0;
int VBvalue = 0;
int HBvalue = 0;
int ABSvalue = 0;    //medelvärdet för testning
unsigned long oldMillis = 0;
unsigned long kollMillis = 0; //timer för att nolla kontrollräknaren.
float punka = 1 ;  // 7 (5=0.95) antal pulser som skiljer och ger indikering på punktering
int Fel = 5;  //antal Fel innan larmindikering
int kollVF = 0; int kollHF = 0; int kollVB = 0; int kollHB = 0;
int timer = 500 ;  // tid som ABS pulserna räknas (250)
 volatile int SensorCountVF = 0;                      // Speed Sensor pulse count
  void AddSensorCountVF()  {                  // This is the subroutine that is called when interrupt 0 goes high
          SensorCountVF++;                          // Increment SensorCount by 1
          }
volatile int SensorCountHF = 0;                      // Speed Sensor pulse count
  void AddSensorCountHF()  {                  // This is the subroutine that is called when interrupt 0 goes high
          SensorCountHF++;                          // Increment SensorCount by 1
          }
volatile int SensorCountVB = 0;                      // Speed Sensor pulse count
  void AddSensorCountVB()  {                  // This is the subroutine that is called when interrupt 0 goes high
          SensorCountVB++;                          // Increment SensorCount by 1
          }
volatile int SensorCountHB = 0;                      // Speed Sensor pulse count
  void AddSensorCountHB()  {                  // This is the subroutine that is called when interrupt 0 goes high
          SensorCountHB++;                          // Increment SensorCount by 1
          }        
void setup() {
 pinMode(larmPin, OUTPUT);     
  pinMode(backlightPin, OUTPUT);
  pinMode(kontrastPin, OUTPUT);
   attachInterrupt(0, AddSensorCountVF, RISING);  // VF Interrupt 0 is on digital pin 3
   attachInterrupt(1, AddSensorCountHF, RISING);  // HF Interrupt 1 pin 2
   attachInterrupt(3, AddSensorCountVB, RISING);  // VB Interrupt 3 is on digital pin 1
   attachInterrupt(2, AddSensorCountHB, RISING);  // HB Interrupt 2 pin 0
   lcd.begin(20,4);
  }
void loop() {
      analogWrite(kontrastPin, kontrast);
      analogWrite(backlightPin, brightness);
 //------------  räknar pulser ABS senorerna                          
  if(millis()-oldMillis > timer && millis()-oldMillis < timer*2 ){                       
        attachInterrupt(0, AddSensorCountVF, RISING);    // Interrupt 0 is on digital pin 3
       if (VFvalue < SensorCountVF){
        VFvalue = SensorCountVF;   
         }
        attachInterrupt(1, AddSensorCountHF, RISING);    // Interrupt 1 is on digital pin 2
       if (HFvalue < SensorCountHF){
        HFvalue = SensorCountHF;
        }
        attachInterrupt(3, AddSensorCountVB, RISING);  // Interrupt 3 is on digital pin 1
       if (VBvalue < SensorCountVB){
        VBvalue = SensorCountVB;
        }
        attachInterrupt(2, AddSensorCountHB, RISING);  // Interrupt 2 is on digital pin 0
       if (HBvalue < SensorCountHB){
        HBvalue = SensorCountHB;
        }
       ABSvalue=(VFvalue+HFvalue+VBvalue+HBvalue)/4 ;
 }
  //---------------------------------------Kontroll av ABS signaler mer än 120-400 och skillnad på 5 %
    if(millis()-oldMillis > timer*4  && millis()-oldMillis < timer*6 ) {
         if (VFvalue>220 && HFvalue>220 && HBvalue>220 && VBvalue>220){    //170 ca 50 km/h, 360 ca 110 km/tim
         if (VFvalue<800 && HFvalue<800 && HBvalue<800 && VBvalue<800){    //max värde 400 150 km/h
  lcd.setCursor(0,2); //delay(2000);
  lcd.print("                    "); // 20(16) tecken för att rensa
  lcd.setCursor(0,2);  //kolumn,rad
  lcd.print(ABSvalue-VFvalue); lcd.setCursor(5,2); lcd.print(ABSvalue-HFvalue);lcd.setCursor(10,2);
  lcd.print(ABSvalue-VBvalue);lcd.setCursor(15,2); lcd.print(ABSvalue-HBvalue);
                            // Jämför VF med dom andra värdena
  if (VFvalue-punka>HFvalue && VFvalue-punka>HBvalue && VFvalue-punka>VBvalue)
   { kollVF=kollVF+1 ;
    if (kollVF == Fel)      // kontroll 3 gånger innan fel indikeras               
    { larmSend();
     lcd.setCursor(0, 1);  //kolumn,rad
     lcd.print("Punka V-fram");lcd.print(VFvalue-punka);delay(8000);
     lcd.clear(); kollVF=0; larmSend();
    }}                                                 // Jämför HF med dom andra värdena
  if (HFvalue-punka>VFvalue && HFvalue-punka>HBvalue && HFvalue-punka>VBvalue)
  { kollHF=kollHF+1 ;
    if (kollHF == Fel)      // kontroll 3 gånger innan fel indikeras               
   { larmSend();
     lcd.setCursor(0, 1);  //kolumn,rad
     lcd.print("Punka H-fram");lcd.print(HFvalue-punka);delay(8000);
     lcd.clear(); kollHF=0;
   } }                                                  // Jämför VB med dom andra värdena
  if (VBvalue-punka>VFvalue && VBvalue-punka>HFvalue && VBvalue-punka>HBvalue)
  { kollVB=kollVB+1 ;
    if (kollVB == Fel)      // kontroll 3 gånger innan fel indikeras               
   { larmSend();
     lcd.setCursor(0, 1);  //kolumn,rad
     lcd.print("Punka V-bak");lcd.print(VBvalue-punka);delay(8000);
     lcd.clear(); kollVB=0;
   }  }                                                    // Jämför HB med dom andra värdena
  if (HBvalue-punka>VFvalue && HBvalue-punka>HFvalue && HBvalue-punka>VBvalue)
  { kollHB=kollHB+1 ;
    if (kollHB == Fel)      // kontroll 3 gånger innan fel indikeras               
   { larmSend();
     lcd.setCursor(0, 1);  //kolumn,rad
     lcd.print("Punka H-bak");lcd.print(HBvalue-punka);delay(8000);
     lcd.clear(); kollHB=0;
    }  }  } }
//---------------------------------------Nollar sensor värdena och ny tid
    SensorCountVF = 0; SensorCountHF = 0; SensorCountVB = 0; SensorCountHB = 0;
    oldMillis = millis();
    lcd.setCursor(0,1); //delay(2000);
    lcd.print("                    "); // 20(16) tecken för att rensa
    VFvalue = 0; HFvalue = 0; VBvalue = 0; HBvalue = 0;
    lcd.setCursor(0,3); lcd.print(oldMillis/1000);lcd.setCursor(5,3);lcd.print(kollMillis/1000);//delay(2000);
    } 
    //---------------------------------------nollar kontrollen vart 5 sek 250*20
    if(millis()-kollMillis > 150000) {  // 15000 = 15 sek intervall
       kollVF = 0;  kollHF = 0;  kollVB = 0;  kollHB = 0;
       kollMillis = millis();  // nollar koll timern§
        lcd.setCursor(0,2); //delay(200);
        lcd.print("                   ");
      } 
      //--------------LCD presentation------------
  lcd.setCursor(0,0); //delay(200);
  lcd.print("VFi"); lcd.setCursor(5,0); lcd.print("HFi");lcd.setCursor(10,0); lcd.print("VBi");lcd.setCursor(15,0); lcd.print("HBi");
  lcd.setCursor(0,1); //delay(200);
  lcd.print(VFvalue); lcd.setCursor(5,1); lcd.print(HFvalue);lcd.setCursor(10,1); lcd.print(VBvalue);lcd.setCursor(15,1); lcd.print(HBvalue);
  lcd.setCursor(10,3); //lcd.print(oldMillis);//delay(2000);
  lcd.print(kollVF);lcd.print(kollHF);lcd.print(kollVB);lcd.print(kollHB);  //display av koll värdena TEST
  }  
 void larmSend() { // larm vid punkterings indikering
 digitalWrite(larmPin, HIGH); delay(300);
 digitalWrite(larmPin, LOW);
   }

TPMS Tyre Pressure Monitoring System eller nåttsånt..

Det har ju blivit lag på att måste ha däcktrycksövervakning på nya bilar så
man får väl inte vara sämre att man fixar det och hänger med i utvecklingen.
Teorin är att man kontrollerar ABS signalerna under en viss tid och ser om ett
däck snurrar fortare än något annat. Och den får räkna fel ett antal gånger under en viss tid
innan en felindikering ges. Här labbar jag med antal och tid för att undvika falsklarm men ändå
kunna indikera på lågt lufttryck. Detta krävde att man fick förnya sig ned ett
Arduino Leonardo kort som har fler interupt kanaler som kan räkna snabba pulser.

ABS signalerna tog jag inifrån ABS boxen
Pin 48,47,46,och 45. Vänster Fram, HF, VB & HB och sedan med ett litet förstärknings steg
(FET transistor) in till Leonardo kortet. ABS boxen var väl tillsluten men det gick att lossa locket efter att man forcerat det sega limmet.

Nu kör jag med en display som visar värden och
larmar vid fel men tanken är att jag ska ha 4 lysdioder för varje däck som lyser rött vid fel och ger en kort larmsignal.
Det blev lite dålig bild på LCDdisplayen men den räknar pulser väldigt fort

Uppdatering 2014-12: Vid test så dyker det upp sporadiska larm när ett däck har 1,8 bar (VB) jämfört med 2,3 bar på dom övriga. (22 % diff.)
Kan få lite falsklarm nångång men det är svårt att hitta gränsen när den ska larma.
                                                                     Uppdatering 2015-03: Monterat in LED dioderna och ändrat lite i mjukvaran. Vid larm lyser 3 dioder och den felande däcket är släckt , lättare att läsa av i mörkret vilket däck som larmar. Även ändrat så om den indikerar fel 3 gånger lyser dioderna konstant och den slutar ljudindikera. Fick en större pyspunka och det blev lite irritation i bilen när den larmade hela tiden. Inga fellarm har kommit utan när det är 20% fel så kommer intermittenta larmindikeringar. Då är det dags att pumpa däcket. Skönt att det är dags för sommardäck snart. Lagt in en fel indikering om en ABS sensor sluta indikera pulser och får se om Antispinn indikering kommer såsmåning om..
Uppdatering 2015-05: Den nya placeringen på TPMS dioderna och förstärknings steget.
Lite ändrat i mjukvaran med 7 fel under 20 sek. Tyvärr så har jag fått se att TPMS fungerar,
punktering på nya sommardäcket och nytt däck var jag tvungen att köpa...sur sa räven.