07-29-2016, 04:47 PM | #71 |
Senior Member
Join Date: Apr 2014
Drives: 2013 Ultramarine FR-S
Location: Springfield, MO
Posts: 1,948
Thanks: 2,539
Thanked 1,414 Times in 804 Posts
Mentioned: 31 Post(s)
Tagged: 3 Thread(s)
|
Shiv Based his kit off of this. So I assume he is using the same pin, which may not pass emissions.
__________________
|
07-29-2016, 07:46 PM | #72 | |
Banned
Join Date: Dec 2013
Drives: FT86
Location: Australia
Posts: 7,998
Thanks: 1,035
Thanked 4,987 Times in 2,981 Posts
Mentioned: 598 Post(s)
Tagged: 2 Thread(s)
|
Quote:
Im pretty sure the openflash guys are just using ztans flex rom coded A01G rom and flashing that directly into USA 700C to B01C ecus. The ECU hardware is likely same and the A01G roms dont have evap code enabled as we dont have evap system here . So unlikly you will pass emissions in some states depending on tests done as evap will show failed. I think any auto guy will be out of luck at present as their is no auto flex coded roms although wayno is close on that, but again it will be A01I rom, and its a crap load of work to port code to other roms and test. |
|
07-29-2016, 09:07 PM | #73 | |
Senior Member
Join Date: Apr 2014
Drives: Toyota 86 GTS
Location: Australia
Posts: 1,129
Thanks: 453
Thanked 895 Times in 424 Posts
Mentioned: 211 Post(s)
Tagged: 0 Thread(s)
|
Quote:
|
|
07-29-2016, 09:38 PM | #74 | |
Senior Member
Join Date: May 2014
Drives: Silver 2013 BRZ Ltd Auto 45,000 mi
Location: Vancouver, WA.USA
Posts: 965
Thanks: 86
Thanked 450 Times in 277 Posts
Mentioned: 60 Post(s)
Tagged: 2 Thread(s)
|
Quote:
I'm going to fill with E85 for the first time tomorrow using the OFT ESC E85 tune. Let me know if you want to help me port this to a US A/T rom. Edit; I'm NOT going to switch to E85 yet. All my local stations closed. I'm not driving 30 miles round trip just to fill up, then constantly worry whether or not I have enough fuel to get back to the station again. Plus, it's in Oregon where I can't pump my own gas.
__________________
If I say yes, will that make you think I understand?
Last edited by KoolBRZ; 07-30-2016 at 03:10 PM. Reason: All closed |
|
07-29-2016, 09:46 PM | #75 |
Banned
Join Date: Dec 2013
Drives: FT86
Location: Australia
Posts: 7,998
Thanks: 1,035
Thanked 4,987 Times in 2,981 Posts
Mentioned: 598 Post(s)
Tagged: 2 Thread(s)
|
|
08-21-2017, 02:13 AM | #76 |
Senior Member
Join Date: Apr 2014
Drives: Toyota 86 GTS
Location: Australia
Posts: 1,129
Thanks: 453
Thanked 895 Times in 424 Posts
Mentioned: 211 Post(s)
Tagged: 0 Thread(s)
|
Anyone who wants a flex tune for any AU/EU/US MY12-MY16 can message me.
Not for free. And do not message me for MY17. Calibrations: A01G A01G as 700G A01G as A00G A01G as A02G A01G as D00G A01G as F10G A01G as F20P A01I A01I as 700I A01I as A00I A01I as A02I A01I as E00I A01I as F20Q A01G as 500C A01G as 700C A01G as 900C A01G as A00C A01G as A01C A01G as B00C A01G as B01C A01G as D00C A01G as F00C A01G as F40C A01I as 500D A01I as 700D A01I as 900D A01I as A00D A01I as A01D A01I as B00D A01I as B01D A01I as D00D A01I as F00D A01I as F40D |
07-30-2018, 12:01 PM | #77 |
Junior Member
Join Date: Dec 2017
Drives: Toyota GT86
Location: Slovakia
Posts: 9
Thanks: 0
Thanked 2 Times in 2 Posts
Mentioned: 0 Post(s)
Tagged: 0 Thread(s)
|
I want to share with you about the adaptation of Ztan flex fuel analyzer.
I designed the PCB, and instead of the PLX display, used the small OLED SSD1306, because it is cheaper. I also added fuel temperature and sensor frequency measurement. Is not yet connected to Evap pin A35-20, because I have a not modified ROM (01G), as instructed by Ztan. The voltage at the output is the same as for Ztan. You can also use Arduino Nano or Uno, and use Ztan wiring diagram, but instead of the PLX display, plug in the A4 and A5 OLED SSD1306. Wiring Diagram with Eagle software. https://drive.google.com/file/d/1KJb...ew?usp=sharing List of parts C1, C2, C4 = 100nF C6, C7 = 22pF C5 = crystal 16mhz C8, C9 = 330nF C3 = 10uF C10 = 100uF R2, R5 = 3k3 R4, R6, R7 = 1k8 R1 = 10k R3 = 6k8 T1 = BC547 E_SENSOR = 13577429 flexfuel sensor Code:
#include <Arduino.h> #include <Wire.h> #include <EEPROM.h> #include <U8glib.h> U8GLIB_SSD1306_128X64 mujOled(U8G_I2C_OPT_NONE); uint16_t pwm_output = 0; //integer for storing PWM value (0-255 value) int HZ = 0; //unsigned 16bit integer for st int inpPin = 8; int V_out_int; float V_out, V_out_avg, E_scalar; //Define global variables volatile uint16_t revTick; //Ticks per revolutionoring HZ input int ethanol = 0; //Store ethanol percentage here float expectedv; //store expected voltage here - range for typical GM sensors is usually 0.5-4.5v uint16_t voltage = 0; //store display millivoltage here (0-5000) //temperature variables int duty; //Duty cycle (0.0-100.0) float period; //Store period time here (eg.0.0025 s) float temperature = 0; //Store fuel temperature here int fahr = 0; int cels = 0; int celstemp = 0; float fahrtemp = 0; static long highTime = 0; static long lowTime = 0; static long tempPulse; //EEPROM store int EE_V_addr = 0; float V_out_default = 147; long Elast, Enow, Edelta; //TRAC switch double click bool TRAC_buttonMonitor = HIGH; int debounce = 20; int doubleClick = 200; int longClick = 3000; int TRAC_initializeDelay = 5000; int TRAC_buttonState = 4; //initialize to 0 for normal operation, 4 for on by default after delay long TRAC_buttonCounter = 0; void setupTimer() // setup timer1 { TCCR1A = 0; // normal mode TCCR1B = 132; // (10000100) Falling edge trigger, Timer = CPU Clock/256, noise cancellation on TCCR1C = 0; // normal mode TIMSK1 = 33; // (00100001) Input capture and overflow interupts enabled TCNT1 = 0; // start from 0 } ISR(TIMER1_CAPT_vect) // PULSE DETECTED! (interrupt automatically triggered, not called by main program) { revTick = ICR1; // save duration of last revolution TCNT1 = 0; // restart timer for next revolution } ISR(TIMER1_OVF_vect) // counter overflow/timeout { revTick = 0; } // Ticks per second = 0 void setup() { pinMode (3, OUTPUT); pinMode (10, OUTPUT); digitalWrite (10, LOW); pinMode (6, INPUT); EEPROM.get(EE_V_addr, V_out_avg); //load last V_out_avg if (isnan(V_out_avg)) { V_out_avg = V_out_default; } V_out_int = (int)V_out_avg; //convert to integer for analogWrite analogWrite(3, V_out_int); //output V_out as PWM voltage on pin 3 setupTimer(); Serial.begin(9600); } void loop() { getfueltemp(inpPin); //read fuel temp from input duty cycle if (revTick > 0) // Avoid dividing by zero, sample in the HZ {HZ = 62700 / revTick;} // (62200) 3456000ticks per minute, 57600 per second else // 62200 calibrated for more accuracy {HZ = 0;} //calculate ethanol percentage if (HZ > 50) // Avoid dividing by zero {ethanol = HZ-50;} else {ethanol = 0;} if (ethanol > 99) // Avoid overflow in PWM {ethanol = 99;} { V_out = 255 - (2.73 * ethanol); V_out_avg = V_out_avg + (0.1 * (V_out - V_out_avg)); //V_out_avg as moving average V_out_int = (int)V_out_avg; //convert to integer for analogWrite analogWrite(3, V_out_int); //output V_out as PWM voltage on pin 3 } //Store EEPROM data every 5 minutes Enow = millis(); Edelta = Enow - Elast; if (Edelta >= 300000) { Elast = Enow; EEPROM.put(EE_V_addr, V_out_avg ); //store V_out_avg to EEPROM } mujOled.firstPage(); do { mujOled.setFont(u8g_font_helvB08); //Printing the data on the OLED mujOled.drawStr(0, 15, "Eth: "); mujOled.drawStr(0, 30, "Temp: "); mujOled.drawStr(0, 45, "Freq: "); mujOled.setPrintPos(72, 15); //setting the dimensions to print the ethanol mujOled.print(ethanol, 10); mujOled.println("%"); mujOled.setPrintPos(72, 30); //setting the dimensions to print the temperature fuel mujOled.print(cels, 10); mujOled.println("C"); mujOled.setPrintPos(72, 45); //setting the dimensions to print the frequency mujOled.print(HZ, 10); mujOled.println("Hz"); } while( mujOled.nextPage() ); delay(250); } void getfueltemp(int inpPin){ //read fuel temp from input duty cycle highTime = 0; lowTime = 0; tempPulse = pulseIn(inpPin,HIGH); if(tempPulse>highTime){ highTime = tempPulse; } tempPulse = pulseIn(inpPin,LOW); if(tempPulse>lowTime){ lowTime = tempPulse; } duty = ((100*(highTime/(double (lowTime+highTime))))); //Calculate duty cycle (integer extra decimal) float T = (float(1.0/float(HZ))); //Calculate total period time float period = float(100-duty)*T; //Calculate the active period time (100-duty)*T float temp2 = float(10) * float(period); //Convert ms to whole number temperature = ((40.25 * temp2)-81.25); //Calculate temperature for display (1ms = -40, 5ms = 80) celstemp = int(temperature); cels = celstemp; fahrtemp = ((temperature*1.8)+32); fahr = fahrtemp; //TRAC switch doubleclick TRAC_buttonMonitor = digitalRead(6); switch (TRAC_buttonState) { case 0: //inactive if (TRAC_buttonMonitor == LOW) // button pressed { digitalWrite (10, HIGH); //Transistor on TRAC_buttonState = 1; //increment state } break; case 1: //check for release if (TRAC_buttonMonitor == HIGH) //if button released { TRAC_buttonCounter = millis(); //start counter TRAC_buttonState = 2; //increment state } break; case 2: //wait for doubleClick if (TRAC_buttonMonitor == LOW && (millis() - TRAC_buttonCounter) > debounce && (millis() - TRAC_buttonCounter) < doubleClick) //second click registered { TRAC_buttonState = 3; //increment state } else if ((millis() - TRAC_buttonCounter) > doubleClick) { digitalWrite (10, LOW); //Transistor off TRAC_buttonState = 0; //reset state } break; case 3: //doubleClick made if ((millis() - TRAC_buttonCounter) > longClick) { digitalWrite (10, LOW); //Transistor off TRAC_buttonState = 0; //reset state } break; case 4: //initialize after delay by default if (millis() > TRAC_initializeDelay) { digitalWrite (10, HIGH); //Transistor on TRAC_buttonCounter = millis(); //start counter TRAC_buttonState = 3; //set state to doubleClick } break; } } Last edited by mato2sk; 08-01-2018 at 11:37 AM. |
The Following User Says Thank You to mato2sk For This Useful Post: | steve99 (07-30-2018) |
07-30-2018, 08:31 PM | #78 | |
Banned
Join Date: Dec 2013
Drives: FT86
Location: Australia
Posts: 7,998
Thanks: 1,035
Thanked 4,987 Times in 2,981 Posts
Mentioned: 598 Post(s)
Tagged: 2 Thread(s)
|
Quote:
Message me if you need modified rom Nice work :-) |
|
07-30-2018, 10:17 PM | #79 |
Senior Member
Join Date: Jul 2012
Drives: BR86
Location: Location
Posts: 841
Thanks: 310
Thanked 146 Times in 114 Posts
Mentioned: 5 Post(s)
Tagged: 0 Thread(s)
|
Great stuff although I would rather a bigger display = easier to read.
|
07-31-2018, 11:50 AM | #80 |
Junior Member
Join Date: Dec 2017
Drives: Toyota GT86
Location: Slovakia
Posts: 9
Thanks: 0
Thanked 2 Times in 2 Posts
Mentioned: 0 Post(s)
Tagged: 0 Thread(s)
|
|
08-01-2018, 06:00 AM | #81 | |
Junior Member
Join Date: Dec 2017
Drives: Toyota GT86
Location: Slovakia
Posts: 9
Thanks: 0
Thanked 2 Times in 2 Posts
Mentioned: 0 Post(s)
Tagged: 0 Thread(s)
|
I changed the font size, and the individual data is rotated every 5 seconds on the OLED display.
Recovery time can be changed Quote:
Code:
#include <Arduino.h> #include <Wire.h> #include <EEPROM.h> #include <U8glib.h> U8GLIB_SSD1306_128X64 mujOled(U8G_I2C_OPT_NONE); int p; void pageEthanol(); // Page-1 void pageTemp(); // Page-2 void pageFreq(); // Page-3 void (*pages[])() = { pageEthanol, pageTemp, pageFreq } ; uint16_t pwm_output = 0; //integer for storing PWM value (0-255 value) int HZ = 0; //unsigned 16bit integer for st int inpPin = 8; int V_out_int; float V_out, V_out_avg, E_scalar; long int prepis = 0; //Define global variables volatile uint16_t revTick; //Ticks per revolutionoring HZ input int ethanol = 0; //Store ethanol percentage here //float expectedv; //store expected voltage here - range for typical GM sensors is usually 0.5-4.5v //uint16_t voltage = 0; //store display millivoltage here (0-5000) //temperature variables int duty; //Duty cycle (0.0-100.0) float period; //Store period time here (eg.0.0025 s) float temperature = 0; //Store fuel temperature here int fahr = 0; int cels = 0; int celstemp = 0; float fahrtemp = 0; static long highTime = 0; static long lowTime = 0; static long tempPulse; //EEPROM store int EE_V_addr = 0; float V_out_default = 147; long Elast, Enow, Edelta; //TRAC switch double click bool TRAC_buttonMonitor = HIGH; int debounce = 20; int doubleClick = 200; int longClick = 3000; int TRAC_initializeDelay = 5000; int TRAC_buttonState = 4; //initialize to 0 for normal operation, 4 for on by default after delay long TRAC_buttonCounter = 0; void setupTimer() // setup timer1 { TCCR1A = 0; // normal mode TCCR1B = 132; // (10000100) Falling edge trigger, Timer = CPU Clock/256, noise cancellation on TCCR1C = 0; // normal mode TIMSK1 = 33; // (00100001) Input capture and overflow interupts enabled TCNT1 = 0; // start from 0 } ISR(TIMER1_CAPT_vect) // PULSE DETECTED! (interrupt automatically triggered, not called by main program) { revTick = ICR1; // save duration of last revolution TCNT1 = 0; // restart timer for next revolution } ISR(TIMER1_OVF_vect) // counter overflow/timeout { revTick = 0; } // Ticks per second = 0 void setup() { pinMode (3, OUTPUT); pinMode (10, OUTPUT); digitalWrite (10, LOW); pinMode (6, INPUT); EEPROM.get(EE_V_addr, V_out_avg); //load last V_out_avg if (isnan(V_out_avg)) { V_out_avg = V_out_default; } V_out_int = (int)V_out_avg; //convert to integer for analogWrite analogWrite(3, V_out_int); //output V_out as PWM voltage on pin 3 mujOled.setFont(u8g_font_fub25); mujOled.setColorIndex(1); p = 0; setupTimer(); Serial.begin(9600); } void loop() { getfueltemp(inpPin); //read fuel temp from input duty cycle if (revTick > 0) // Avoid dividing by zero, sample in the HZ {HZ = 62700 / revTick;} // (62200) 3456000ticks per minute, 57600 per second else // 62200 calibrated for more accuracy {HZ = 0;} //calculate ethanol percentage if (HZ > 50) // Avoid dividing by zero {ethanol = HZ-50;} else {ethanol = 0;} if (ethanol > 99) // Avoid overflow in PWM {ethanol = 99;} { V_out = 255 - (2.65 * ethanol); V_out_avg = V_out_avg + (0.1 * (V_out - V_out_avg)); //V_out_avg as moving average V_out_int = (int)V_out_avg; //convert to integer for analogWrite analogWrite(3, V_out_int); //output V_out as PWM voltage on pin 3 } //Store EEPROM data every 5 minutes Enow = millis(); Edelta = Enow - Elast; if (Edelta >= 300000) { Elast = Enow; EEPROM.put(EE_V_addr, V_out_avg ); //store V_out_avg to EEPROM } mujOled.firstPage(); do { (*pages[p])(); } while( mujOled.nextPage() ); delay(3000); // recovery time Oled p = p+1; if (p == 3) p=0; } void getfueltemp(int inpPin){ //read fuel temp from input duty cycle highTime = 0; lowTime = 0; tempPulse = pulseIn(inpPin,HIGH); if(tempPulse>highTime){ highTime = tempPulse; } tempPulse = pulseIn(inpPin,LOW); if(tempPulse>lowTime){ lowTime = tempPulse; } duty = ((100*(highTime/(double (lowTime+highTime))))); //Calculate duty cycle (integer extra decimal) float T = (float(1.0/float(HZ))); //Calculate total period time float period = float(100-duty)*T; //Calculate the active period time (100-duty)*T float temp2 = float(10) * float(period); //Convert ms to whole number temperature = ((40.25 * temp2)-81.25); //Calculate temperature for display (1ms = -40, 5ms = 80) celstemp = int(temperature); cels = celstemp; fahrtemp = ((temperature*1.8)+32); fahr = fahrtemp; //TRAC switch doubleclick TRAC_buttonMonitor = digitalRead(6); switch (TRAC_buttonState) { case 0: //inactive if (TRAC_buttonMonitor == LOW) // button pressed { digitalWrite (10, HIGH); //Transistor on TRAC_buttonState = 1; //increment state } break; case 1: //check for release if (TRAC_buttonMonitor == HIGH) //if button released { TRAC_buttonCounter = millis(); //start counter TRAC_buttonState = 2; //increment state } break; case 2: //wait for doubleClick if (TRAC_buttonMonitor == LOW && (millis() - TRAC_buttonCounter) > debounce && (millis() - TRAC_buttonCounter) < doubleClick) //second click registered { TRAC_buttonState = 3; //increment state } else if ((millis() - TRAC_buttonCounter) > doubleClick) { digitalWrite (10, LOW); //Transistor off TRAC_buttonState = 0; //reset state } break; case 3: //doubleClick made if ((millis() - TRAC_buttonCounter) > longClick) { digitalWrite (10, LOW); //Transistor off TRAC_buttonState = 0; //reset state } break; case 4: //initialize after delay by default if (millis() > TRAC_initializeDelay) { digitalWrite (10, HIGH); //Transistor on TRAC_buttonCounter = millis(); //start counter TRAC_buttonState = 3; //set state to doubleClick } break; } } void pageEthanol() { mujOled.drawStr(0, 28, "Ethanol "); mujOled.setPrintPos(32, 64); //setting the dimensions to print the ethanol mujOled.print(ethanol, 10); mujOled.println("%"); } void pageTemp(){ mujOled.drawStr(10, 28, "Temp: "); mujOled.setPrintPos(33, 64); //setting the dimensions to print the temperature fuel mujOled.print(cels, 10); mujOled.println("C"); } void pageFreq() { mujOled.drawStr(20, 28, "Freq: "); mujOled.setPrintPos(12, 64); //setting the dimensions to print the frequency mujOled.print(HZ, 10); mujOled.println("Hz"); } Last edited by mato2sk; 08-07-2018 at 06:15 AM. |
|
08-01-2018, 01:54 PM | #82 | |
Member
Join Date: Jun 2017
Drives: European gt86
Location: France
Posts: 92
Thanks: 36
Thanked 23 Times in 14 Posts
Mentioned: 0 Post(s)
Tagged: 0 Thread(s)
|
Quote:
You may want to look at this if you wanna plug it to the obd: http://www.ft86club.com/forums/showthread.php?t=123339 (So you can show oil temp, intake temp, etc.) If you make a plugin using this project I'll be glad to add it to the git hub sources |
|
08-03-2018, 01:37 PM | #83 |
Junior Member
Join Date: Dec 2017
Drives: Toyota GT86
Location: Slovakia
Posts: 9
Thanks: 0
Thanked 2 Times in 2 Posts
Mentioned: 0 Post(s)
Tagged: 0 Thread(s)
|
In winter I want to upgrade to a turbo.
I want to integrate other functions in this device (temperature and pressure oil, turbo pressure, etc.) Or I will build a separate device on the arduino platform. When I have this device built, I like to share it. |
08-03-2018, 02:08 PM | #84 | |
Member
Join Date: Nov 2014
Drives: 2013 Scion FR-S 6MT
Location: South Bay
Posts: 71
Thanks: 23
Thanked 40 Times in 21 Posts
Mentioned: 6 Post(s)
Tagged: 1 Thread(s)
|
Quote:
http://www.ft86club.com/forums/showt...ht=instruments |
|
|
|
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Open source Over Boost Fuel Cut | ztan | Software Tuning | 18 | 07-05-2023 08:30 AM |
Open Source Electric Supercharger | neutron256 | Forced Induction | 913 | 08-22-2021 05:16 PM |
open source software question | GeeTee86 | AFRICA | 15 | 02-15-2015 06:52 PM |
The Retrofit Source summer open house! | soundman98 | Southeast | 0 | 06-23-2014 08:41 PM |
ECUtek Flex Fuel REVOLUTION: World's First Flex Fuel Factory ECU GTR - BRZ soon! | Visconti | Engine, Exhaust, Transmission | 356 | 05-20-2013 09:36 AM |