forum logo image
caferacer-forum.de - Das Forum für Petrolheads, Garagenschrauber, Ölfinger, Frickelracer und Alteisentreiber

Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM etc)

Technische Fragen und Antworten, Tipps und Tricks für Profis und Bastler
Benutzeravatar
GalosGarage
Beiträge: 6151
Registriert: 22. Aug 2013
Motorrad:: Ducati ST2 Umbau ( 9.5 )
Cagiva Alazzurra (Caffè Corretto) im Aufbau
digitaler Umbau Ducati 750ss (emozione) später mal
Cagiva-Duc-BMW Mix (Quattro Stagioni) im Aufbau
Wohnort: 41564 Kaarst

Re: Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM et

Beitrag von GalosGarage »

ich dachte, das sei ein sammelfred.... :dontknow:

ich hab da noch jemad mit ins boot genommen, aber ich/wir kommen da nicht weiter.

der ntc ist mit einem 680 ohm widerstand als spannungsteiler geschaltet.
(°C) (Ohm)
40 417
50 269
60 179
70 124
80 88
90 64
100 48
110 36
120 28
130 22
140 18
150 15



kann da ein wissender mal über den sketch schaun?
wurde mit der arduino IDE geschrieben

#define DEBUG

#define LED_ONE 10
#define LED_TWO 5
#define analogPin 2
#define updateTime 1000

#define BLUE 0
#define GREEN 1
#define RED 2
#define RED_BLINK 3

int currentMode = 0;
int currentResistance = 0;
long lastUpdate = 0;

void setLED(int led, int r, int g, int b) {
analogWrite(led, r);
analogWrite(led + 1, g);
analogWrite(led + 2, b);
}

void enableLED(int led) {
for (int col = 0; col < 3; col++) {
Serial.write(led+col);
pinMode(led + col, OUTPUT);
}
}

void startSequence(int led) {
for (int col = 0; col < 4; col++) {
setLED(led, col == 0 ? 255 : 0, col == 1 ? 255 : 0, col == 2 ? 255 : 0);
delay(500);
}
}

int getBlinkmode(int temp) {
if (temp <= 60) {
return BLUE;
} else if (temp >= 140) {
return RED_BLINK;
} else if (temp >= 120) {
return RED;
} else {
return GREEN;
}
}

int measureResistance() {
if (millis() - lastUpdate > updateTime) {

int raw = 0;
int Vin = 5;
float Vout = 0;
float R1 = 10;
float R2 = 0;
float buffer = 0;

raw = analogRead(analogPin); // Reads the Input PIN
Vout = (5.0 / 1023.0) * raw; // Calculates the Voltage on th Input PIN
buffer = (Vin / Vout) - 1;
R2 = R1 / buffer;
Serial.print("Voltage: "); //
Serial.println(Vout); // Outputs the information
Serial.print("R2: "); //
Serial.println(R2); //
lastUpdate = millis();
}

return 0;
}

void handleBlinkmode(int led, int mode) {
switch(mode) {
case BLUE:
setLED(led, 0, 0, 255);
break;
case GREEN:
setLED(led, 0, 255, 0);
break;
case RED:
setLED(led, 255, 0, 0);
break;
case RED_BLINK:
setLED(led, millis() % 15 >= 7 ? 255 : 0, 0, 0);
break;
}
}

void setup() {
#ifdef DEBUG
Serial.begin(9600);
#endif
enableLED(LED_ONE);
startSequence(LED_ONE);
}

void loop() {
int res = measureResistance();
currentResistance = res != 0 ? res : currentResistance;
currentMode = getBlinkmode(currentResistance);
handleBlinkmode(LED_ONE, currentMode);
/* #ifdef DEBUG
Serial.print(res);
Serial.print("\t");
Serial.print(currentResistance);
Serial.print("\t");
Serial.println(currentMode);
#endif*/
}
Projekte:

9.5
Quattro Stagioni (abgebrochen)
Caffè Corretto
Emozione
Ducati 750SSie (noch keine Idee)
Cagiva SST 250 (noch keine Idee)

Benutzeravatar
artur
Beiträge: 297
Registriert: 13. Mär 2013
Motorrad:: Moto Guzzi LM II
Wohnort: Nürnberg

Re: Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM et

Beitrag von artur »

druebergeschaut. ist C.
gute Wahl))

wo liegt das Problem?

Benutzeravatar
artur
Beiträge: 297
Registriert: 13. Mär 2013
Motorrad:: Moto Guzzi LM II
Wohnort: Nürnberg

Re: Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM et

Beitrag von artur »

Noch was:
Ich würde den Widerstand im Spannungsteiler in etwa dem Bereich wählen in dem auch der NTC bei Betriebstemperatur liegt. Damit legst Du den Genauigkeitsbereich Deiner Messung fest.
Wenn also Deine erwartete Betriebstemperatur bei 100° legit, nimmst etwas um die 47 Ohm. Den Gund kannst Du Dir vielleicht denken: die Spannungshübe am ADC werden so erhöht und die Messung genauer.
Als Beispiel R-Wert zwischen 130 und 140° schwankt um die 4Ohm...Im Vergleich zu den 680 ist das wenig - mit dem Rauschen des ADC ist das nichts.

Die Kehrseite:
Mit dem kleinen Widerstand von in Summe 100 Ohm fließt natürlich ein höherer Strom durch den Spannungsteiler.
Musst vielleicht weiter tüfteln)

Benutzeravatar
GalosGarage
Beiträge: 6151
Registriert: 22. Aug 2013
Motorrad:: Ducati ST2 Umbau ( 9.5 )
Cagiva Alazzurra (Caffè Corretto) im Aufbau
digitaler Umbau Ducati 750ss (emozione) später mal
Cagiva-Duc-BMW Mix (Quattro Stagioni) im Aufbau
Wohnort: 41564 Kaarst

Re: Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM et

Beitrag von GalosGarage »

danke für die rückmeldung.

ich hab noch ne liste won einem vergleichbaren NTC gefunden, der aber im widerstandswert höher liegt.
das schöne ist, da hat mal jemand die spannungen zu vermessen.
wenn ich mich nun ganz einfach nur an die spannungswerte halte (setze vorraus die stimmen) müsste der sketch etwas schmaler ausfallen.

dann fällt die berechnung über die widerstände weg.

alles mit if, else, less than , greater than anweisungen usw.

nur den spannungsteiler dann mit 3Kohm (2 x 1,5k/reihe)

°C Ohm Volt 049 919 563 B VAG sensor

15 3630 selbst ermittelt
20 2990 selbst ermittelt
40 1200 4,80
60 550 4,58
65 420 4,47
70 330 4,34
75 268 4,21
80 227 4,10
85 195 3,98
90 162 3,82
95 140 3,68
100 122 3,55
105 108 3,42
110 92 3,24
115 85 3,15
120 77 3,03
125 66 2,84
130 48 2,45
135 43 2,31
140 39 2,19
145 34 2,02
150 30 1,88
155 27 1,75
160 24 1,62
170 23 1,58
Projekte:

9.5
Quattro Stagioni (abgebrochen)
Caffè Corretto
Emozione
Ducati 750SSie (noch keine Idee)
Cagiva SST 250 (noch keine Idee)

Benutzeravatar
GalosGarage
Beiträge: 6151
Registriert: 22. Aug 2013
Motorrad:: Ducati ST2 Umbau ( 9.5 )
Cagiva Alazzurra (Caffè Corretto) im Aufbau
digitaler Umbau Ducati 750ss (emozione) später mal
Cagiva-Duc-BMW Mix (Quattro Stagioni) im Aufbau
Wohnort: 41564 Kaarst

Re: Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM et

Beitrag von GalosGarage »

mist, irgendwas stimmt mit der abfrage auf pin 2 nicht.... tappingfoot

wenn ich den auf masse oder +5v lege, müsste sich doch die anzeige ändern. :?:

meine grauen haare werden stetig mehr.
Projekte:

9.5
Quattro Stagioni (abgebrochen)
Caffè Corretto
Emozione
Ducati 750SSie (noch keine Idee)
Cagiva SST 250 (noch keine Idee)

Benutzeravatar
artur
Beiträge: 297
Registriert: 13. Mär 2013
Motorrad:: Moto Guzzi LM II
Wohnort: Nürnberg

Re: Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM et

Beitrag von artur »

Was für ne Anzeige? Wohin schreibt Serial.print()?
Pin 2 ist bei Dir ein analoger In.

Mehr Infos bitte und mit "Code" kannst Du sogar Deinen Code (leserlich) posten.
Und bitte einrücken!
Etwa so:

Code: Alles auswählen

#include <avr/io.h>
#define F_CPU 16000000    // Systemtakt in Hz
#define BAUD 9600      // Baudrate
.
.
.
void uart_puts (const char *s)
{
	while (*s) 
	{
		uart_putc(*s);
		s++;
	}
}

Benutzeravatar
GalosGarage
Beiträge: 6151
Registriert: 22. Aug 2013
Motorrad:: Ducati ST2 Umbau ( 9.5 )
Cagiva Alazzurra (Caffè Corretto) im Aufbau
digitaler Umbau Ducati 750ss (emozione) später mal
Cagiva-Duc-BMW Mix (Quattro Stagioni) im Aufbau
Wohnort: 41564 Kaarst

Re: Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM et

Beitrag von GalosGarage »

ausgabe auf eine 4-pin RGB LED, liegt mit den anoden über widerstände auf D10,11,12 katode auf masse

Ergebnis soll sein:
bis 60° = blau
bis 80° = grün
80 bis 120° = aus
120° bis 140° rot
ab 140° rot blinken

die eingangssequenz läuft auch durch, blau, grün ,rot - alles ok.

dann soll mit pin A2 soll der spannungsteiler abgefragt werden, deswegen einen analogen genommen.

die formatierung gibt die arduino IDE so vor... :dontknow:

Code: Alles auswählen

  
  #define DEBUG
   
  #define LED_ONE 10
  #define LED_TWO 11
  #define LED_THREE 12
  #define analogPin 2
  #define updateTime 1000
   
  #define BLUE 0
  #define GREEN 1
  #define OUT 2
  #define RED 3
  #define RED_BLINK 4
   
  int currentMode = 0;
  int currentResistance = 0;
  long lastUpdate = 0;
   
  void setLED(int led, int r, int g, int b) {
   analogWrite(led, r);
   analogWrite(led + 1, g);
   analogWrite(led + 2, b);
  }
   
  void enableLED(int led) {
  for (int col = 0; col < 5; col++) {
    Serial.write(led+col);
    pinMode(led + col, OUTPUT);
  }
  }
   
  void startSequence(int led) {
  for (int col = 0; col < 5; col++) {
    setLED(led, col == 0 ? 255 : 0, col == 1 ? 255 : 0, col == 2 ? 255 : 0);
    delay(700);
  }
  }
   
  int getBlinkmode(int temp) {
  if (temp <= 39) {
    return RED_BLINK;
  } else if (temp <= 77 >= 39){
    return RED;
  } else if (temp >= 550) {
    return BLUE;
  } else if (temp <= 550 >= 227) {
    return GREEN;  
  } else {
    return OUT;
  }
   
  }
   
  int measureResistance() {
  if (millis() - lastUpdate > updateTime) {
   
    int raw = 0;          
    int Vin = 5;        
    float Vout = 0;      
    float R1 = 10;        
    float R2 = 0;        
    float buffer = 0;
   
    raw = analogRead(analogPin);    // Reads the Input PIN
    Vout = (5.0 / 1023.0) * raw;    // Calculates the Voltage on th Input PIN
    buffer = (Vin / Vout) - 1;
    R2 = R1 / buffer;
    Serial.print("Voltage: ");      //
    Serial.println(Vout);           // Outputs the information
    Serial.print("R2: ");           //
    Serial.println(R2);             //
    lastUpdate = millis();
  }
   
  return 0;
  }
   
  void handleBlinkmode(int led, int mode) {
  switch(mode) {
   case BLUE:
     setLED(led, 0, 0, 255);
     break;
   case GREEN:
     setLED(led, 0, 255, 0);  
   case OUT:
     setLED(led, 0, 0, 0);
     break;
   case RED:
     setLED(led, 255, 0, 0);
     break;
   case RED_BLINK:
     setLED(led, millis() % 15 >= 7 ? 255 : 0, 0, 0);
     break;
  }
  }
   
  void setup() {
  #ifdef DEBUG
    Serial.begin(9600);
  #endif
  enableLED(LED_ONE);
  startSequence(LED_ONE);
  }
   
  void loop() {
  int res = measureResistance();
  currentResistance = res != 0 ? res : currentResistance;
  currentMode = getBlinkmode(currentResistance);
  handleBlinkmode(LED_ONE, currentMode);
  /*  #ifdef DEBUG
    Serial.print(res);
    Serial.print("\t");
    Serial.print(currentResistance);
    Serial.print("\t");
    Serial.println(currentMode);
  #endif*/
  }
Projekte:

9.5
Quattro Stagioni (abgebrochen)
Caffè Corretto
Emozione
Ducati 750SSie (noch keine Idee)
Cagiva SST 250 (noch keine Idee)

Benutzeravatar
artur
Beiträge: 297
Registriert: 13. Mär 2013
Motorrad:: Moto Guzzi LM II
Wohnort: Nürnberg

Re: Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM et

Beitrag von artur »

Deine IDE hindert Dich nicht daran ein paar Tabs einzufügen.

Zum Problem:
Dein measureResistance() gibt den Wert 0 zurück. Das wird IMMER res zugewiesen.

Gib mal res einen konstanten Wert mit return 200 oder 600;, oder return raw; in measureResistance() und kompilier mal.
Zuletzt geändert von artur am 24. Feb 2015, insgesamt 1-mal geändert.

Benutzeravatar
GalosGarage
Beiträge: 6151
Registriert: 22. Aug 2013
Motorrad:: Ducati ST2 Umbau ( 9.5 )
Cagiva Alazzurra (Caffè Corretto) im Aufbau
digitaler Umbau Ducati 750ss (emozione) später mal
Cagiva-Duc-BMW Mix (Quattro Stagioni) im Aufbau
Wohnort: 41564 Kaarst

Re: Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM et

Beitrag von GalosGarage »

meinste so?

void loop() {
int res = measureResistance();
currentResistance = res != 600 ? res : currentResistance;
currentMode = getBlinkmode(currentResistance);
handleBlinkmode(LED_ONE, currentMode);

nee, kann nicht. zeigt der compiler FEHLER
Zuletzt geändert von GalosGarage am 24. Feb 2015, insgesamt 1-mal geändert.
Projekte:

9.5
Quattro Stagioni (abgebrochen)
Caffè Corretto
Emozione
Ducati 750SSie (noch keine Idee)
Cagiva SST 250 (noch keine Idee)

Benutzeravatar
artur
Beiträge: 297
Registriert: 13. Mär 2013
Motorrad:: Moto Guzzi LM II
Wohnort: Nürnberg

Re: Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM et

Beitrag von artur »

So:

Code: Alles auswählen

  int measureResistance() {
  if (millis() - lastUpdate > updateTime) {
   
    int raw = 0;          
    int Vin = 5;        
    float Vout = 0;      
    float R1 = 10;        
    float R2 = 0;        
    float buffer = 0;
   
    raw = analogRead(analogPin);    // Reads the Input PIN
    Vout = (5.0 / 1023.0) * raw;    // Calculates the Voltage on th Input PIN
    buffer = (Vin / Vout) - 1;
    R2 = R1 / buffer;
    Serial.print("Voltage: ");      //
    Serial.println(Vout);           // Outputs the information
    Serial.print("R2: ");           //
    Serial.println(R2);             //
    lastUpdate = millis();
  }
   
  return raw ; // oder return 600;
  }

Antworten

Zurück zu „Elektrik/Beleuchtung“

Sloping Wheels