Notices
E85 / Ethanol This section is dedicated to tuning with ethanol.

E85 Gauge w/ output for under $100

Thread Tools
 
Search this Thread
 
Old Jun 13, 2017, 06:56 PM
  #121  
Evolved Member
iTrader: (4)
 
4G63_EVO's Avatar
 
Join Date: Jul 2012
Location: Pasadena CA
Posts: 721
Received 46 Likes on 45 Posts
this is awesome, Might do this soon
Old Jun 13, 2017, 07:47 PM
  #122  
Newbie
iTrader: (1)
 
evo8tanner's Avatar
 
Join Date: Jul 2013
Location: Long Beach, Ca
Posts: 79
Received 0 Likes on 0 Posts
Re-uploaded the code and it happened to display. Thanks!
Old Jun 13, 2017, 08:06 PM
  #123  
Evolved Member
iTrader: (4)
 
4G63_EVO's Avatar
 
Join Date: Jul 2012
Location: Pasadena CA
Posts: 721
Received 46 Likes on 45 Posts
so if you dont do the output to ECU the second resistor is not necessary right?
Old Jun 15, 2017, 02:24 PM
  #124  
Evolving Member
Thread Starter
 
mrb00st's Avatar
 
Join Date: Jan 2008
Location: Ohio
Posts: 122
Received 15 Likes on 6 Posts
Originally Posted by evo8tanner
Re-uploaded the code and it happened to display. Thanks!
Awesome!

Originally Posted by 4G63_EVO
so if you dont do the output to ECU the second resistor is not necessary right?
That is correct. I dont use it. Just mainly there for map switching
Old Jun 16, 2017, 01:36 PM
  #125  
Evolved Member
iTrader: (4)
 
4G63_EVO's Avatar
 
Join Date: Jul 2012
Location: Pasadena CA
Posts: 721
Received 46 Likes on 45 Posts
Originally Posted by mrb00st
Awesome!



That is correct. I dont use it. Just mainly there for map switching
I ordered everything just waiting on the sensor, For the harness on the sensor, I assume you cut the opposite end of the sensor off and attach to the board?
Old Jun 16, 2017, 06:54 PM
  #126  
Evolved Member
iTrader: (4)
 
4G63_EVO's Avatar
 
Join Date: Jul 2012
Location: Pasadena CA
Posts: 721
Received 46 Likes on 45 Posts
Originally Posted by mrb00st

Code
Code:
/*******************************************************
This program will sample a 50-150hz signal depending on ethanol 
content, and output a 0-5V signal via PWM.
The LCD will display ethanol content, hz input, mv output, fuel temp
********************************************************/

// include the library code:
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

#define I2C_ADDR 0x27 // <<- Add your address here.
#define Rs_pin 0
#define Rw_pin 1
#define En_pin 2
#define BACKLIGHT_PIN 3
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7

LiquidCrystal_I2C lcd(0x27,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

int inpPin = 8;     //define input pin to 8
int outPin = 11;    //define PWM output, possible pins with LCD and 32khz freq. are 3 and 11 (UNO)

//Define global variables
volatile uint16_t revTick;    //Ticks per revolution
uint16_t pwm_output  = 0;     //integer for storing PWM value (0-255 value)
int HZ;                   //unsigned 16bit integer for storing 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)
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;
static long highTime = 0;
static long lowTime = 0;
static long tempPulse;

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()
{
  Serial.begin(9600);
  pinMode(inpPin,INPUT);
  setPwmFrequency(outPin,1); //Modify frequency on PWM output
 setupTimer();
   // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  lcd.setBacklightPin(3,POSITIVE);
  lcd.setBacklight(HIGH);
  // Initial screen formatting
  lcd.setCursor(1, 0);
  lcd.print("Ethanol:     %");
  lcd.setCursor(0, 1);
  lcd.print("     Hz       F");
}
 
void loop()
{
  getfueltemp(inpPin); //read fuel temp from input duty cycle
  
  if (revTick > 0) // Avoid dividing by zero, sample in the HZ
    {HZ = 62200 / revTick;}     // 3456000ticks per minute, 57600 per second 
    else                     
    {HZ = 0;}                   //needs real sensor test to determine correct tickrate

  //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;}

  expectedv = ((((HZ-50.0)*0.01)*4)+0.5);
  //Screen calculations
  pwm_output = 1.11 * (255 * (expectedv/5.0)); //calculate output PWM for NEMU
  
  lcd.setCursor(12, 0);
  lcd.print(ethanol);
  
  lcd.setCursor(2, 1);
  lcd.print(HZ);
  
  lcd.setCursor(12, 1); 
  lcd.print(fahr); //Use this for celsius

  //PWM output
  analogWrite(outPin, pwm_output); //write the PWM value to output pin

  delay(1000);  //make screen more easily readable by not updating it too often

  Serial.println(ethanol);
  Serial.println(pwm_output);
  Serial.println(expectedv);
  Serial.println(HZ);
  delay(1000);

  
}

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)
int cels = int(temperature);
cels = cels*0.1;
float fahrtemp = ((temperature*1.8)+32);
fahr = fahrtemp*0.1;

}

void setPwmFrequency(int pin, int divisor) { //This code snippet raises the timers linked to the PWM outputs
  byte mode;                                 //This way the PWM frequency can be raised or lowered. Prescaler of 1 sets PWM output to 32KHz (pin 3, 11)
  if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 64: mode = 0x03; break;
      case 256: mode = 0x04; break;
      case 1024: mode = 0x05; break;
      default: return;
    }
    if(pin == 5 || pin == 6) {
      TCCR0B = TCCR0B & 0b11111000 | mode;
    } else {
      TCCR1B = TCCR1B & 0b11111000 | mode;
    }
  } else if(pin == 3 || pin == 11) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 32: mode = 0x03; break;
      case 64: mode = 0x04; break;
      case 128: mode = 0x05; break;
      case 256: mode = 0x06; break;
      case 1024: mode = 0x7; break;
      default: return;
    }
    TCCR2B = TCCR2B & 0b11111000 | mode;
  }
}

I have modified my own code for a lcd screen output. If you would like the code to have a 16x2 display, please let me know.

Does this get directly copied and pasted, or were supposed to fill in the blanks here lol, can you send me your code complete? I believe I bought a slightly different LCD but i think it should work the same. Im completely new to the arduino
Old Jun 17, 2017, 06:28 PM
  #127  
Evolving Member
Thread Starter
 
mrb00st's Avatar
 
Join Date: Jan 2008
Location: Ohio
Posts: 122
Received 15 Likes on 6 Posts
Originally Posted by 4G63_EVO
Does this get directly copied and pasted, or were supposed to fill in the blanks here lol, can you send me your code complete? I believe I bought a slightly different LCD but i think it should work the same. Im completely new to the arduino
the only think that could/may need changed is the "#define I2C_ADDR 0x27 // <<- Add your address here." that is dependent on what the address of your I2C screen is
Old Jun 17, 2017, 07:34 PM
  #128  
EvoM Community Team Leader
 
Biggiesacks's Avatar
 
Join Date: Aug 2005
Location: West Coast
Posts: 5,688
Received 704 Likes on 592 Posts
I was researching my own diy gauge project when I came across these https://www.sparkfun.com/products/11442 has an ATmega328 built into it with the arduino bootloader and complete arduino IDE support. Im waiting for them to get the red ones in stock before I order and start tinkering but i figured i would share what i found.
Old Jun 17, 2017, 08:22 PM
  #129  
Evolving Member
Thread Starter
 
mrb00st's Avatar
 
Join Date: Jan 2008
Location: Ohio
Posts: 122
Received 15 Likes on 6 Posts
Originally Posted by Biggiesacks
I was researching my own diy gauge project when I came across these https://www.sparkfun.com/products/11442 has an ATmega328 built into it with the arduino bootloader and complete arduino IDE support. Im waiting for them to get the red ones in stock before I order and start tinkering but i figured i would share what i found.
oh snap. thats pretty neat. i have some OLED displays coming. gonna try to switch over them once they get here, once i do. i'll upload the code for that as well
Old Jun 22, 2017, 04:38 PM
  #130  
Evolved Member
iTrader: (4)
 
4G63_EVO's Avatar
 
Join Date: Jul 2012
Location: Pasadena CA
Posts: 721
Received 46 Likes on 45 Posts
Heres what im getting right now

Arduino: 1.8.3 (Windows 7), Board: "Arduino/Genuino Uno"

In file included from C:\Users\CJ Windows 7\Documents\Arduino\sketch_jun21a\sketch_jun21a.in o:9:0:

C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LCD.h:30:3: error: stray '\302' in program

<title>Arduino-Library/LCD.h at master · nherment/Arduino-Library · GitHub</title>

^

C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LCD.h:30:3: error: stray '\267' in program

C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LCD.h:30:3: error: stray '\302' in program

C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LCD.h:30:3: error: stray '\267' in program

In file included from C:\Users\CJ Windows 7\Documents\Arduino\sketch_jun21a\sketch_jun21a.in o:9:0:

C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LCD.h:140:8: warning: missing terminating ' character

<!-- '"` --><!-- </textarea></xmp> --></option></form><form accept-charset="UTF-8" action="/nherment/Arduino-Library/search" class="js-site-search-form" data-scoped-search-url="/nherment/Arduino-Library/search" data-unscoped-search-url="/search" method="get"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div>

^

C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LCD.h:140:3: error: missing terminating ' character

<!-- '"` --><!-- </textarea></xmp> --></option></form><form accept-charset="UTF-8" action="/nherment/Arduino-Library/search" class="js-site-search-form" data-scoped-search-url="/nherment/Arduino-Library/search" data-unscoped-search-url="/search" method="get"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div>

^

In file included from C:\Users\CJ Windows 7\Documents\Arduino\sketch_jun21a\sketch_jun21a.in o:9:0:

C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LCD.h:528:70: error: stray '#' in program

<td id="LC17" class="blob-code blob-code-inner js-file-line">#<span class="pl-k">ifndef</span> LCD_h</td>

^

C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LCD.h:532:70: error: stray '#' in program

<td id="LC18" class="blob-code blob-code-inner js-file-line">#<span class="pl-k">define</span> <span class="pl-en">LCD_h</span></td>

^

C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LCD.h:541:70: error: stray '#' in program

<td id="LC20" class="blob-code blob-code-inner js-file-line">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds">&quot;</span>WProgram.h<span class="pl-pds">&quot;</span></span></td>

^

C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LCD.h:631:70: error: stray '#' in program

<td id="LC42" class="blob-code blob-code-inner js-file-line">#<span class="pl-k">endif</span></td>

^

C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LCD.h:641:10: warning: missing terminating ' character

<!-- '"` --><!-- </textarea></xmp> --></option></form><form accept-charset="UTF-8" action="" class="js-jump-to-line-form" method="get"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div>

^

C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LCD.h:641:5: error: missing terminating ' character

<!-- '"` --><!-- </textarea></xmp> --></option></form><form accept-charset="UTF-8" action="" class="js-jump-to-line-form" method="get"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div>

^

In file included from C:\Users\CJ Windows 7\Documents\Arduino\sketch_jun21a\sketch_jun21a.in o:9:0:

C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LCD.h:689:12: warning: missing terminating ' character

You can't perform that action at this time.

^

C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LCD.h:689:5: error: missing terminating ' character

You can't perform that action at this time.

^

In file included from C:\Users\CJ Windows 7\Documents\Arduino\sketch_jun21a\sketch_jun21a.in o:9:0:

C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LCD.h:7:1: error: expected unqualified-id before '<' token

<!DOCTYPE html>

^

In file included from C:\Users\CJ Windows 7\Documents\Arduino\sketch_jun21a\sketch_jun21a.in o:9:0:

C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LCD.h:406:187: error: 'modified' does not name a type

<a href="/nherment/Arduino-Library/commit/25af561ee8dd5361fb8a41edeb1ede620a5e50c1" class="message" data-pjax="true" title="Adding doc &amp; modified license">Adding doc &amp; modified license</a>

^

In file included from C:\Users\CJ Windows 7\Documents\Arduino\sketch_jun21a\sketch_jun21a.in o:9:0:

C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LCD.h:541:151: error: expected unqualified-id before '<' token

<td id="LC20" class="blob-code blob-code-inner js-file-line">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds">&quot;</span>WProgram.h<span class="pl-pds">&quot;</span></span></td>

^

C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LCD.h:541:195: error: expected unqualified-id before '<' token

<td id="LC20" class="blob-code blob-code-inner js-file-line">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds">&quot;</span>WProgram.h<span class="pl-pds">&quot;</span></span></td>

^

C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LCD.h:622:72: error: expected unqualified-id before '<' token

<td id="LC40" class="blob-code blob-code-inner js-file-line">};</td>

^

In file included from C:\Users\CJ Windows 7\Documents\Arduino\sketch_jun21a\sketch_jun21a.in o:9:0:

C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C/LCD.h:672:18: error: expected unqualified-id before numeric constant

<li>&copy; 2017 <span title="0.10192s from github-fe-b03c132.cp1-iad.github.net">GitHub</span>, Inc.</li>

^

C:\Users\CJ Windows 7\Documents\Arduino\sketch_jun21a\sketch_jun21a.in o: In function 'void setup()':

sketch_jun21a:69: error: 'lcd' was not declared in this scope

lcd.begin(16, 2);

^

sketch_jun21a:70: error: 'POSITIVE' was not declared in this scope

lcd.setBacklightPin(3,POSITIVE);

^

C:\Users\CJ Windows 7\Documents\Arduino\sketch_jun21a\sketch_jun21a.in o: In function 'void loop()':

sketch_jun21a:101: error: 'lcd' was not declared in this scope

lcd.setCursor(12, 0);

^

exit status 1
'lcd' was not declared in this scope

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.


Code:
#include <LiquidCrystal_I2C.h>

#include <LiquidCrystal_I2C.h>

#include <LiquidCrystal.h>

// include the library code:
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

#define I2C_ADDR = 0x3f // <<- Add your address here.
#define Rs_pin 0
#define Rw_pin 1
#define En_pin 2
#define BACKLIGHT_PIN 3
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7

LiquidCrystal_I2C lcd(0x3f,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

int inpPin = 8;     //define input pin to 8
int outPin = 11;    //define PWM output, possible pins with LCD and 32khz freq. are 3 and 11 (UNO)

//Define global variables
volatile uint16_t revTick;    //Ticks per revolution
uint16_t pwm_output  = 0;     //integer for storing PWM value (0-255 value)
int HZ;                   //unsigned 16bit integer for storing 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)
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;
static long highTime = 0;
static long lowTime = 0;
static long tempPulse;

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()
{
  Serial.begin(9600);
  pinMode(inpPin,INPUT);
  setPwmFrequency(outPin,1); //Modify frequency on PWM output
 setupTimer();
   // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  lcd.setBacklightPin(3,POSITIVE);
  lcd.setBacklight(HIGH);
  // Initial screen formatting
  lcd.setCursor(1, 0);
  lcd.print("Ethanol:     %");
  lcd.setCursor(0, 1);
  lcd.print("     Hz       F");
}
 
void loop()
{
  getfueltemp(inpPin); //read fuel temp from input duty cycle
  
  if (revTick > 0) // Avoid dividing by zero, sample in the HZ
    {HZ = 62200 / revTick;}     // 3456000ticks per minute, 57600 per second 
    else                     
    {HZ = 0;}                   //needs real sensor test to determine correct tickrate

  //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;}

  expectedv = ((((HZ-50.0)*0.01)*4)+0.5);
  //Screen calculations
  pwm_output = 1.11 * (255 * (expectedv/5.0)); //calculate output PWM for NEMU
  
  lcd.setCursor(12, 0);
  lcd.print(ethanol);
  
  lcd.setCursor(2, 1);
  lcd.print(HZ);
  
  lcd.setCursor(12, 1); 
  lcd.print(fahr); //Use this for celsius

  //PWM output
  analogWrite(outPin, pwm_output); //write the PWM value to output pin

  delay(1000);  //make screen more easily readable by not updating it too often

  Serial.println(ethanol);
  Serial.println(pwm_output);
  Serial.println(expectedv);
  Serial.println(HZ);
  delay(1000);

  
}

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)
int cels = int(temperature);
cels = cels*0.1;
float fahrtemp = ((temperature*1.8)+32);
fahr = fahrtemp*0.1;

}

void setPwmFrequency(int pin, int divisor) { //This code snippet raises the timers linked to the PWM outputs
  byte mode;                                 //This way the PWM frequency can be raised or lowered. Prescaler of 1 sets PWM output to 32KHz (pin 3, 11)
  if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 64: mode = 0x03; break;
      case 256: mode = 0x04; break;
      case 1024: mode = 0x05; break;
      default: return;
    }
    if(pin == 5 || pin == 6) {
      TCCR0B = TCCR0B & 0b11111000 | mode;
    } else {
      TCCR1B = TCCR1B & 0b11111000 | mode;
    }
  } else if(pin == 3 || pin == 11) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 32: mode = 0x03; break;
      case 64: mode = 0x04; break;
      case 128: mode = 0x05; break;
      case 256: mode = 0x06; break;
      case 1024: mode = 0x7; break;
      default: return;
    }
    TCCR2B = TCCR2B & 0b11111000 | mode;
  }
}
Old Jun 23, 2017, 05:04 PM
  #131  
Evolving Member
Thread Starter
 
mrb00st's Avatar
 
Join Date: Jan 2008
Location: Ohio
Posts: 122
Received 15 Likes on 6 Posts
I edited this for your I2C address, copy and paste this. and reinstalled the libarys i have on page one. delete the 2 folders u have, and move the new ones over.


Code:
/*******************************************************
This program will sample a 50-150hz signal depending on ethanol 
content, and output a 0-5V signal via PWM.
The LCD will display ethanol content, hz input, mv output, fuel temp
********************************************************/

// include the library code:
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

#define I2C_ADDR 0x3f // <<- Add your address here.
#define Rs_pin 0
#define Rw_pin 1
#define En_pin 2
#define BACKLIGHT_PIN 3
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7

LiquidCrystal_I2C lcd(0x27,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

int inpPin = 8;     //define input pin to 8
int outPin = 11;    //define PWM output, possible pins with LCD and 32khz freq. are 3 and 11 (UNO)

//Define global variables
volatile uint16_t revTick;    //Ticks per revolution
uint16_t pwm_output  = 0;     //integer for storing PWM value (0-255 value)
int HZ;                   //unsigned 16bit integer for storing 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)
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;
static long highTime = 0;
static long lowTime = 0;
static long tempPulse;

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()
{
  Serial.begin(9600);
  pinMode(inpPin,INPUT);
  setPwmFrequency(outPin,1); //Modify frequency on PWM output
 setupTimer();
   // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  lcd.setBacklightPin(3,POSITIVE);
  lcd.setBacklight(HIGH);
  // Initial screen formatting
  lcd.setCursor(1, 0);
  lcd.print("Ethanol:     %");
  lcd.setCursor(0, 1);
  lcd.print("     Hz       F");
}
 
void loop()
{
  getfueltemp(inpPin); //read fuel temp from input duty cycle
  
  if (revTick > 0) // Avoid dividing by zero, sample in the HZ
    {HZ = 62200 / revTick;}     // 3456000ticks per minute, 57600 per second 
    else                     
    {HZ = 0;}                   //needs real sensor test to determine correct tickrate

  //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;}

  expectedv = ((((HZ-50.0)*0.01)*4)+0.5);
  //Screen calculations
  pwm_output = 1.11 * (255 * (expectedv/5.0)); //calculate output PWM for NEMU
  
  lcd.setCursor(12, 0);
  lcd.print(ethanol);
  
  lcd.setCursor(2, 1);
  lcd.print(HZ);
  
  lcd.setCursor(12, 1); 
  lcd.print(fahr); //Use this for celsius

  //PWM output
  analogWrite(outPin, pwm_output); //write the PWM value to output pin

  delay(1000);  //make screen more easily readable by not updating it too often

  Serial.println(ethanol);
  Serial.println(pwm_output);
  Serial.println(expectedv);
  Serial.println(HZ);
  delay(1000);

  
}

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)
int cels = int(temperature);
cels = cels*0.1;
float fahrtemp = ((temperature*1.8)+32);
fahr = fahrtemp*0.1;

}

void setPwmFrequency(int pin, int divisor) { //This code snippet raises the timers linked to the PWM outputs
  byte mode;                                 //This way the PWM frequency can be raised or lowered. Prescaler of 1 sets PWM output to 32KHz (pin 3, 11)
  if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 64: mode = 0x03; break;
      case 256: mode = 0x04; break;
      case 1024: mode = 0x05; break;
      default: return;
    }
    if(pin == 5 || pin == 6) {
      TCCR0B = TCCR0B & 0b11111000 | mode;
    } else {
      TCCR1B = TCCR1B & 0b11111000 | mode;
    }
  } else if(pin == 3 || pin == 11) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 32: mode = 0x03; break;
      case 64: mode = 0x04; break;
      case 128: mode = 0x05; break;
      case 256: mode = 0x06; break;
      case 1024: mode = 0x7; break;
      default: return;
    }
    TCCR2B = TCCR2B & 0b11111000 | mode;
  }
}
[/QUOTE]
Old Jun 23, 2017, 05:21 PM
  #132  
Evolved Member
iTrader: (4)
 
4G63_EVO's Avatar
 
Join Date: Jul 2012
Location: Pasadena CA
Posts: 721
Received 46 Likes on 45 Posts
Originally Posted by mrb00st
I edited this for your I2C address, copy and paste this. and reinstalled the libarys i have on page one. delete the 2 folders u have, and move the new ones over.
Ill try that, thank you!
Old Jun 23, 2017, 06:14 PM
  #133  
Evolving Member
Thread Starter
 
mrb00st's Avatar
 
Join Date: Jan 2008
Location: Ohio
Posts: 122
Received 15 Likes on 6 Posts
Deleted
Old Jun 27, 2017, 12:05 AM
  #134  
Newbie
iTrader: (1)
 
evo8tanner's Avatar
 
Join Date: Jul 2013
Location: Long Beach, Ca
Posts: 79
Received 0 Likes on 0 Posts
expectedv = ((((HZ-50.0)*0.01)*4)+0.5);
//Screen calculations
pwm_output = 1.11 * (255 * (expectedv/5.0)); //calculate output PWM for NEMU

^^^Is this the only line of code that needs to be edited if I want my output to the ecu to remain in Hz? Thanks for the assistance!
Old Jun 27, 2017, 06:50 PM
  #135  
Evolved Member
iTrader: (4)
 
4G63_EVO's Avatar
 
Join Date: Jul 2012
Location: Pasadena CA
Posts: 721
Received 46 Likes on 45 Posts
Worked without a problem! Just gotta test it out now


Quick Reply: E85 Gauge w/ output for under $100



All times are GMT -7. The time now is 09:27 PM.