|
Ämnessammanfattning
Skrivet av: bopakoster
« skrivet: 01 november 2013, 14:38:25 »
Såja, då är min RG20-display klar... Så här ser den ut. Om någon är intresserad av en liknande display (antingen byggsats, bara programmerad PIC-processor eller färdigbyggd) så maila mig på mail@ridax.se. Den visar aktuell temperatur och blinkar med vissa intervaller till med inställd temperatur. När man snurrar på ratten, så växlar den över till att visa inställd temperatur ett tag.
Jag garanterar inte att den visar rätt hela tiden än, måste kanske trimma in "resistanskurvorna" lite, men det är i så fall bara en enkel ombränning av PICen.
Fortfarande möjligt?
Skrivet av: Rdx
« skrivet: 01 november 2013, 13:32:59 »
Här är PIC 16F688-koden /*
Compiling instructions: Go into Project->Build options->Project and check Global->MPLAB ICD and PICC Linker command from .COF to .HEX
13mm borr
16F688 Pin assignments
+5/3.3V 1 14 GND D1- 2 13 Temp-setting input AN0 B 3 12 G 4 11 Room-temp input AN2 C 5 10 A E 6 9 F D 7 8 D2-
Supply voltage 4,7V each step 4,7/1024 = 0,00458984375 Minimum 5deg 0.28V = 54 AD-value Maximum 30deg 4.36V = 950 AD-value
Room temp Volt Degree 2,64 10,0 2,44 14,5 2,15 20,5 1,78 27,5 1,73 29,0 1,72 29,5 1,60 32,5
Konstant 1V = 21,875 3,10 00,0 1,50 35,0
67,8125 - k * V
*/
#define _16F688 #include <pic.h> #include <string.h> #define RUM_KOMP -3
__CONFIG(CP_ON & MCLRE_OFF & PWRTE_ON & WDTE_OFF & FOSC_INTOSCIO & BOREN_OFF & FCMEN_OFF & IESO_OFF); // __CONFIG(PROTECT & MCLRDIS & PWRTEN & WDTDIS & INTIO & BORDIS & FCMDIS & IESODIS & RCIO);
#define MS_count 10 // 1000000/4/256/10 = 100 Hz static bit DISP_A @ ((unsigned)&PORTC*8+0); // Display segment A static bit DISP_B @ ((unsigned)&PORTA*8+4); // Display segment B static bit DISP_C @ ((unsigned)&PORTC*8+5); // Display segment C static bit DISP_D @ ((unsigned)&PORTC*8+3); // Display segment D static bit DISP_E @ ((unsigned)&PORTC*8+4); // Display segment E static bit DISP_F @ ((unsigned)&PORTC*8+1); // Display segment F static bit DISP_G @ ((unsigned)&PORTA*8+1); // Display segment G static bit DISP_D1 @ ((unsigned)&PORTA*8+5); // Display cathode 1 static bit DISP_D2 @ ((unsigned)&PORTC*8+2); // Display cathode 2 static bit TEMP_SET @ ((unsigned)&PORTA*8+0); // Temp setting input static bit TEMP_CUR @ ((unsigned)&PORTA*8+2); // Temp current input
volatile static char dispValue = 0; bit firstDisp;
static void dispDigit(char d) { switch(d) { case 0 : DISP_A = 1; DISP_B = 1; DISP_C = 1; DISP_D = 1; DISP_E = 1; DISP_F = 1; DISP_G = 0; break; case 1 : DISP_A = 0; DISP_B = 1; DISP_C = 1; DISP_D = 0; DISP_E = 0; DISP_F = 0; DISP_G = 0; break; case 2 : DISP_A = 1; DISP_B = 1; DISP_C = 0; DISP_D = 1; DISP_E = 1; DISP_F = 0; DISP_G = 1; break; case 3 : DISP_A = 1; DISP_B = 1; DISP_C = 1; DISP_D = 1; DISP_E = 0; DISP_F = 0; DISP_G = 1; break; case 4 : DISP_A = 0; DISP_B = 1; DISP_C = 1; DISP_D = 0; DISP_E = 0; DISP_F = 1; DISP_G = 1; break; case 5 : DISP_A = 1; DISP_B = 0; DISP_C = 1; DISP_D = 1; DISP_E = 0; DISP_F = 1; DISP_G = 1; break; case 6 : DISP_A = 1; DISP_B = 0; DISP_C = 1; DISP_D = 1; DISP_E = 1; DISP_F = 1; DISP_G = 1; break; case 7 : DISP_A = 1; DISP_B = 1; DISP_C = 1; DISP_D = 0; DISP_E = 0; DISP_F = 0; DISP_G = 0; break; case 8 : DISP_A = 1; DISP_B = 1; DISP_C = 1; DISP_D = 1; DISP_E = 1; DISP_F = 1; DISP_G = 1; break; case 9 : DISP_A = 1; DISP_B = 1; DISP_C = 1; DISP_D = 0; DISP_E = 0; DISP_F = 1; DISP_G = 1; break; } }
static void interrupt irq(void) { // Interrupt routine if (T0IF) { // Timer interrupt TMR0 -= MS_count; T0IF = 0; if (firstDisp) { // Display refresh first digit x10 DISP_D2 = 1; dispDigit(dispValue / 10); DISP_D1 = 0; firstDisp = 0; } else { // Display refresh seond digit x1 DISP_D1 = 1; dispDigit(dispValue % 10); DISP_D2 = 0; firstDisp = 1; } } }
static unsigned int getTemp(unsigned char ansel) { ADCON0 = 0b10000001 + (ansel << 2); GO_DONE = 1; while (GO_DONE) { } return ((ADRESH << + ADRESL); }
static char translateSetTemp(unsigned int t) { if (t < 54) { return 5; } else if (t > 950) { return 30; } t -= 54; t = t * 25 + 448; t = t / 896; t += 5; return t; }
static char translateRoomTemp(unsigned int t) { signed char r;
r = 68 - t / 10 + RUM_KOMP; if (r < 0) { return 0; } else { return r; } }
void main(void) { unsigned int setTemp; unsigned int oldSetTemp; unsigned int roomTemp; unsigned int i; char changing = 0;
OSCCON = 0b01001010; // 1 Mhz CMCON0 = 7; // Comparators off, digital I/O ANSEL = 0b00000101; // AN0 and AN2 configured as analog input TRISA = 0b00000101; TRISC = 0b00000000; WPUA = 0; OPTION_REG = 0b00000111; // Prescaler to TMR0 1:256 (Fosc/4/64 = 3900 Hz INTCON = 0b10100000; // Global int | TMR0IE ADCON0 = 0b10000001; ADCON1 = 0b00000000; // Fosc/2 (1 Mhz) for (; { changing = 0; roomTemp = translateRoomTemp(getTemp(2)); for (i = 0; i < 2000; i++) { // 1 Mhz setTemp = translateSetTemp(getTemp(0)); if (setTemp != oldSetTemp) { oldSetTemp = setTemp; changing = 1; i = 1000; } if (changing) { dispValue = setTemp; } else { dispValue = roomTemp; } } for (i = 0; i < 500; i++) { // 1 Mhz oldSetTemp = translateSetTemp(getTemp(0)); dispValue = oldSetTemp; } } }
Skrivet av: Rdx
« skrivet: 01 november 2013, 13:17:17 »
Skrivet av: bopakoster
« skrivet: 01 november 2013, 13:08:50 »
Tack för länken Carl N! har PM-at DIY-freak.
Skrivet av: Carl N
« skrivet: 01 november 2013, 12:50:27 »
Skrivet av: bopakoster
« skrivet: 01 november 2013, 11:31:24 »
Bra idé , bortsett från att jag måste gå ner och knappa fram rätt menybilder, dom ligger inte kvar permanent.
Skrivet av: purjo__
« skrivet: 01 november 2013, 11:28:01 »
Sätt fast en IP-kamera så att den filmar displayen och häng en bättre begagnad mobil eller billig surfplatta på väggen uppe.
Skrivet av: bopakoster
« skrivet: 01 november 2013, 11:18:20 »
Kan man hitta någon sådan som funkar istället för RG20? Vill ha nåt som visar aktuell temperatur och inställt börvärde på rumstemp så man slipper springa ner i källaren för att se vad som givaren står på.
|
|
|