Detta skrivs ut på en Oled display men här blir det inte som jag tänkt och får inte till det.
Mäter jag jag tex 1555mA så skriver den ut 1555 vilket är ok.
Mäter jag 555mA så skriver den ut 5550. Vilket blir fel att läsa.
Ni hittar detta i Display_out();
Hur gör jag ?
Kod: Markera allt
#include "SSD1306driver_lite.h" // include SSD1306 OLED display driver source code
#define BTN LATC.F5
#define OUT LATC.F4
#define EN4 LATC.F7
#define EN3 LATB.F4
#define EN2 LATC.F1
#define EN1 LATA.F2
#define SSD1306_SOFT_I2C
#define SSD1306_128_64
char PrintOut[5];
float Temp, TempOut, Vbat, Adc1, Adc2, Adc3, Adc4;
// Software I2C connections
sbit Soft_I2C_Scl at RB7_bit;
sbit Soft_I2C_Sda at RB5_bit;
sbit Soft_I2C_Scl_Direction at TRISB7_bit;
sbit Soft_I2C_Sda_Direction at TRISB5_bit;
// End Software I2C connections
void NTC_Lookup(){
if(Temp<365)
TempOut=10;
if((365<=Temp)&&(Temp<414))
TempOut=15;
if((414<=Temp)&&(Temp<465))
TempOut=20;
if((465<=Temp)&&(Temp<511))
TempOut=25;
if((511<=Temp)&&(Temp<559))
TempOut=30;
if((559<=Temp)&&(Temp<604))
TempOut=35;
if((604<=Temp)&&(Temp<646))
TempOut=40;
if((646<=Temp)&&(Temp<686))
TempOut=45;
if((686<=Temp)&&(Temp<722))
TempOut=50;
if((722<=Temp)&&(Temp<755))
TempOut=55;
if((755<=Temp)&&(Temp<785))
TempOut=60;
if((785<=Temp)&&(Temp<812))
TempOut=65;
if((812<=Temp)&&(Temp<836))
TempOut=70;
if((836<=Temp)&&(Temp<858))
TempOut=75;
if((858<=Temp)&&(Temp<875))
TempOut=80;
if((875<=Temp)&&(Temp<893))
TempOut=85;
if((893<=Temp)&&(Temp<908))
TempOut=90;
if((908<=Temp)&&(Temp<922))
TempOut=95;
if((922<=Temp)&&(Temp<934))
TempOut=100;
if((934<=Temp)&&(Temp<944))
TempOut=105;
if((944<=Temp)&&(Temp<953))
TempOut=110;
if((953<=Temp)&&(Temp<961))
TempOut=115;
if((961<=Temp)&&(Temp<968))
TempOut=120;
if((968<=Temp)&&(Temp<974))
TempOut=125;
}
void Adc_Read_All(){
Temp=ADC_Read(4); //ANA4
Delay_ms(10);
NTC_Lookup();
Vbat=ADC_Read(5); //ANA5
Delay_ms(10);
Vbat=(Vbat*88)/10000;
Adc1=ADC_Read(16); //CH1
if(Adc1<20) //filter
Adc1=0;
Delay_ms(10);
Adc1=(Adc1*60)*1000;
Adc2=ADC_Read(18); //CH2
if(Adc2<20)
Adc2=0;
Delay_ms(10);
Adc2=(Adc2*49)*1000;
Adc3=ADC_Read(14); //CH3
if(Adc3<20)
Adc3=0;
Delay_ms(10);
Adc3=(Adc3*39)*1000;
Adc4=ADC_Read(22); //CH4
if(Adc4<20)
Adc4=0;
Delay_ms(10);
Adc4=(Adc4*56)*1000;
}
void Display_Out(){
SSD1306_Color = 1;
SSD1306_TextSize(1);
sprintf(PrintOut, "%.2f", Vbat);
SSD1306_GotoXY(1, 8);
SSD1306_Print(PrintOut);
sprintf(PrintOut, "%.0f", TempOut);
SSD1306_GotoXY(1, 16);
SSD1306_Print(PrintOut);
sprintf(PrintOut, "%-.0f", Adc1);
SSD1306_GotoXY(1, 24);
PrintOut[4]=0;
SSD1306_Print(PrintOut);
sprintf(PrintOut, "%-.0f", Adc2);
SSD1306_GotoXY(1, 32);
PrintOut[4]=0;
SSD1306_Print(PrintOut);
sprintf(PrintOut, "%-.0f", Adc3);
SSD1306_GotoXY(1, 40);
PrintOut[4]=0;
SSD1306_Print(PrintOut);
sprintf(PrintOut, "%-.0f", Adc4);
SSD1306_GotoXY(1, 48);
PrintOut[4]=0;
SSD1306_Print(PrintOut);
SSD1306_Display();
delay_ms(2000);
SSD1306_ClearDisplay(); // clear the buffer
}
Init_main(){
OSCCON1=0B00000001;
OSCFRQ=0b00000110; // set internal oscillator to 16MHz
OSCTUNE=0b00000000;
ANSELA=0b00110000; // configure all PORTS
ANSELB=0b01000000;
ANSELC=0b01000101;
TRISA=0b00110000;
TRISB=0b01000000;
TRISC=0b01100101;
delay_ms(1000); // wait a second
Soft_I2C_Init(); // initialize I2C communication
SSD1306_Begin(SSD1306_SWITCHCAPVCC, SSD1306_I2C_ADDRESS);
SSD1306_Display();
delay_ms(2000);
SSD1306_ClearDisplay(); // clear the buffer
ADC_Init();
EN1=1;
EN2=1;
EN3=1;
EN4=1;
}
// main function
void main(){
Init_main();
while(1){
ADC_Read_All();
Delay_ms(10);
Display_Out();
}
}