Seite 5 von 37

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

Verfasst: 22. Feb 2015
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*/
}

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

Verfasst: 22. Feb 2015
von artur
druebergeschaut. ist C.
gute Wahl))

wo liegt das Problem?

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

Verfasst: 23. Feb 2015
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)

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

Verfasst: 23. Feb 2015
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

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

Verfasst: 24. Feb 2015
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.

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

Verfasst: 24. Feb 2015
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++;
	}
}

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

Verfasst: 24. Feb 2015
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*/
  }

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

Verfasst: 24. Feb 2015
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.

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

Verfasst: 24. Feb 2015
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

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

Verfasst: 24. Feb 2015
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;
  }