Arduino läuft nur wenn er per USB versorgt wird

Moin,

nachdem ich den Code soweit fertig habe und nun die Heizung eig. Heizung sein lassen wollte habe ich nun folgenes Problem:

Sobald der Arduino vom Notebook getrennt wird macht er nur noch was er will. Das drückt sich folgendermaßen aus: Die Relais werden völlig willkürlich angezogen und auch losgelassen

Ich tippte erst darauf das evtl. durch die 6 sensoren(DS18b20) die Bus spannung zusammenbricht also ein externes Netzteil angeklemmt aber immernoch selbes Fehlerprofil

dann das Netzteil erstmal wieder abgeklemmt und versucht mit einem 0,1µf Kondensator die Buspannung zu stabiliesieren(Zwischen GND und +5V) Immernoch selbes Problem..

Dann den Code bearbeitet so das er die Sensoren nur alle 8 sekunden ausliest und die genauigkeit auf 9 bit runtergesetzt allerdings immernoch das selbe Problem... habt ihr noch einen tipp? als nächstes würde ich jetzt den Arduino tauschen....der kommt allerdings erst montag oder dienstag.

Grüße

#include <OneWire.h>
#include <DallasTemperature.h>

//Aufloesung der Sensoren
#define RESOLUTION 9
//Pins, an welchen die Relais 
//fuer den Temperatursensorbus, den Mischer, 
//das Zonenventil und die Pumpe angeschlossen sind
#define ONE_WIRE_BUS 8
#define MISCHER_OPEN 9
#define MISCHER_CLOSE 10
#define ZONENVENTIL 11
#define PUMPE 12
//Abweichung von der DESIRED_TEMP, bei der der Mischer anfaengt zu mischen
#define MISCHERTEMPERATURE_VARIANCE 2
// Verzoegerung in ms, die das Programm wartet, um Temperatur von Sensoren auszulesen 
// Herstellervorgabe: 700 ms bei 12 Bit
#define CONVERSION_DELAY 8000
//Angestrebte Temperatur in der Ruecklaufanhebung
//muss mindestens 55 Grad warm sein, damit der Waermetauscher keinen Glanzruss ansetzt
#define DESIRED_TEMP 55

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

//Pufferspeicher Oben
DeviceAddress sensor0 = { 0x28, 0xF8, 0x1F, 0xD0, 0x5, 0x0, 0x0, 0xEA }; 
//Pufferspeicher Mitte
DeviceAddress sensor1 = { 0x28, 0x6B, 0x8E, 0xCF, 0x5, 0x0, 0x0, 0xDA };  
//Pufferspeicher Unten
DeviceAddress sensor2 = { 0x28, 0xEF, 0xC4, 0xCF, 0x5, 0x0, 0x0, 0xB8 };  
//Gemeinsamer Ruecklauf
DeviceAddress sensor3 = { 0x28, 0xD3, 0xC8, 0xE4, 0x5, 0x0, 0x0, 0xED };  
//Ruecklaufanhebung 
DeviceAddress sensor4 = { 0x28, 0xEE, 0xC7, 0xE4, 0x5, 0x0, 0x0, 0x25 };
//Ofen
DeviceAddress sensor5 = { 0x28, 0x27, 0x2, 0xD0, 0x5, 0x0, 0x0, 0x9A};

float tempPSOben;
float tempPSMitte;
float tempPSUnten;
float tempGemeinsamerRuecklauf;
float tempRuecklaufanhebung;
float tempOfen;

unsigned long lastTempRequest;
boolean allowTempRequest = true;
unsigned long lastIteration = 0;
boolean currentlyMoving = false;
unsigned long startTime;
unsigned long timeToMove;

void setup(void)
{             
  pinMode(MISCHER_OPEN, OUTPUT); 
  pinMode(MISCHER_CLOSE, OUTPUT); 
  pinMode(ZONENVENTIL, OUTPUT);
  pinMode(PUMPE, OUTPUT);
  digitalWrite(MISCHER_OPEN, LOW);
  digitalWrite(MISCHER_CLOSE, LOW);
  digitalWrite(ZONENVENTIL, LOW);
  digitalWrite(PUMPE, LOW);
  
  //Serial.begin(9600);
  sensors.begin();
  
  int numberOfDevices = sensors.getDeviceCount();
  Serial.print(numberOfDevices, DEC);
  Serial.println(" Devices gefunden.");
  
  Serial.print("Parasite power ist "); 
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");
  
  sensors.setResolution(sensor0, RESOLUTION);
  sensors.setResolution(sensor1, RESOLUTION);
  sensors.setResolution(sensor2, RESOLUTION);
  sensors.setResolution(sensor3, RESOLUTION);
  sensors.setResolution(sensor4, RESOLUTION);
  sensors.setResolution(sensor5, RESOLUTION);
  sensors.setWaitForConversion(false);
}

//Falls die Temperatur des Pufferspeichers 3° groesser als die des Ruecklaufs wird das Zonenventil geoeffnet 
//wenn es nur noch 1° groesser ist wieder geschlossen
void zonenventilSchalten(void)
{
  Serial.print("Pufferspeicher oben - Gemeinsamer Ruecklauf: ");
  Serial.println(tempPSOben - tempGemeinsamerRuecklauf);
  
  if((tempPSOben - tempGemeinsamerRuecklauf) >= 6)
  { 
  digitalWrite(ZONENVENTIL, HIGH);
  Serial.println("Oeffne Zonenventil.");
  }
  if ((tempPSOben - tempGemeinsamerRuecklauf) <= 3)
  {
   digitalWrite(ZONENVENTIL, LOW);
   Serial.println("Schliesse Zonenventil.");
  }
}

//Mischer faehrt auf, wenn Temperatur in der Ruecklaufanhebung groesser als die angestrebte Temperatur ist.
//Mischer faehrt zu, wenn Temperatur in der Ruecklaufanhebung kleiner als die angestrebte Temperatur ist.
//Mischer braucht 140 Sekunden, um von komplett geschlossen auf komplett geoeffnet zu fahren.
//Je groesser der Unterschied zwischen aktueller und angestrebter Temperatur ist, 
//desto laenger faehrt der Mischer.
void mischerSchalten(void)
{
  if(!currentlyMoving && tempRuecklaufanhebung > (DESIRED_TEMP + MISCHERTEMPERATURE_VARIANCE))
  {
    startTime = millis();
    timeToMove = (tempRuecklaufanhebung - DESIRED_TEMP) * 500;
    Serial.print("Mischer faehrt fuer ");
    Serial.print(timeToMove);
    Serial.println(" Millisekunden auf.");
    currentlyMoving = true;
    digitalWrite(MISCHER_OPEN, HIGH);
  }

  if(!currentlyMoving && tempRuecklaufanhebung < (DESIRED_TEMP - MISCHERTEMPERATURE_VARIANCE))
  {
    startTime = millis();
    timeToMove = (DESIRED_TEMP - tempRuecklaufanhebung) * 500;
    Serial.print("Mischer faehrt fuer ");
    Serial.print(timeToMove);
    Serial.println(" Millisekunden zu.");
    currentlyMoving = true;
    digitalWrite(MISCHER_CLOSE, HIGH);
  }
}

void loop(void)
{
  //Testet so oft wie moeglich (sinnvoll bspw. fuer Alarmtemperatur)
  if (allowTempRequest)
  {
    sensors.requestTemperatures();
    allowTempRequest = false;
    lastTempRequest = millis();
  }
  
  //Wenn genug Zeit vergangen ist um die Temperatur der Sensoren auszulesen
  if (millis() - lastTempRequest >= CONVERSION_DELAY)
   {
    tempPSOben = sensors.getTempC(sensor0);
    tempPSMitte = sensors.getTempC(sensor1);
    tempPSUnten = sensors.getTempC(sensor2);  
    tempGemeinsamerRuecklauf = sensors.getTempC(sensor3);   
    tempRuecklaufanhebung = sensors.getTempC(sensor4);
    tempOfen = sensors.getTempC(sensor5);    
    allowTempRequest = true;
   }
  //Alle 10 Sekunden
  if(millis() - lastIteration > 10000)
  {    
    Serial.print("Temperatur Pufferspeicher oben: ");
    Serial.println(tempPSOben);
    Serial.print("Temperatur gemeinsamer Ruecklauf ist: ");
    Serial.println(tempGemeinsamerRuecklauf);
    Serial.print("Temperatur Ruecklaufanhebung ist: ");
    Serial.println(tempRuecklaufanhebung);
    Serial.print("Temperatur Ofen ist: ");
    Serial.println(tempOfen);
  
    if(tempOfen > 45)
   {
    digitalWrite(PUMPE, HIGH);
    mischerSchalten();
    Serial.println("Pumpe an");
   }
    else
   {
    digitalWrite(PUMPE, LOW);
    Serial.println("Pumpe aus");
   }
    
    zonenventilSchalten();
    lastIteration = millis();
  
  //Falls der Mischer lange genug geoeffnet bzw. geschlossen wurde wieder ausschalten
  if(currentlyMoving && (millis() - startTime > timeToMove))
  {
    digitalWrite(MISCHER_OPEN, LOW);
    digitalWrite(MISCHER_CLOSE, LOW);
    Serial.println("Mischer stoppt.");
    currentlyMoving = false;
  }
 }
}

Hallo,

könnte eine Überlastung der Arduino'ischen 5V sein. Wenn ...

Hast Du das Netzteil auch dran wenn Du USB angesteckt hast? Oder hast Du nur USB dran wenn Du USB dran hast? Sind die Relais extern versorgt? Oder mit über den Arduino? Hast Du zufällig einen kompletten Schaltplan der auch das wiederspiegelt was wie verkabelt ist?

Irgendwie widerspricht sich noch eine Aussage. Wenn per USB versorgt klappt es. Wenn USB abgesteckt ist klappt nichts. Wenn extern versorgt klappt auch nichts. Wie wird denn der Arduino versorgt wenn Du USB abgesteckt ist? Hier fehlt irgendwas.

Was ist das denn für ein Netzteil?

Moin,

Das netzteil war meist auch eingesteckt wenn der arduino per usb am rechner hing schaltplan hätte ich

Schaltplan

allerdings ist +12V mit Vin verbunden. Die Relais werden über 12V versorgt

Als netzteil kommt der 12V haus Bus zur verwendung allerdings habe ich es probehalber auch mit 12V bleigel akku probiert was allerdings keine besserung einbrachte.

Grüße Felix

Du mußt uns schon etwas mehr bezüglich Deiner Schaltung bzw Netzteil verraten. Welche und wieviele Verbraucher (zB Relais und andere?? ) hast Du angeschlossen? Grüße Uwe

Moin,

es hängen 4 Relais über einen ULN 2803 an dem Arduino und der One wire Bus mit 6 Sensoren

an dem 12V Bus vom haus Hängen allerlei Led`s und andere Arduinos und sonstiger öhm Kram. allerdings habe ich das ganze per halb vollem 12V blei gel akku gegengetestet.

Grüße Felix

Hab Deine Antwort erst später gesehen.

Ich vermisse am ULN2803 den Anschluß der 12 V am pin 10 com (Schutzdode der Ausgänge).

Der Spannungsstabilisator auf dem Arduino verträgt max 200mA (den Verbrauch des Arduino nicht mitgerechnet) da er wegen der Verlustleistung und begrenzten Kühlfläche überhizt und abschaltet.

Grrüße Uwe

Der COM Anschluss beim ULN2803 muss auf +12V! Nicht auf GND. Der ist für die internen Freilaufdioden.

Und Pin 9 auf GND. Das ist der Pin über den der Strom abfließt

Hallo,

der Schaltplan ist nicht komplett wie gewünscht.

Wird der ULN2803 auch mit dem 5V vom Arduino versorgst?

Mach Dir mal bitte die Mühe und zeichne auch die Spannungsversorgungen komplett mit ein. Aber so wie Du sie auch aufgebaut hast. Manche zeichnen nämlich was die gedacht, aber nicht gebaut haben.

Mußt nicht zwangsweise Linien malen. Aber überall eindeutige Bezeichnungen. Wo sind 5V wo sind 12V überall dran.

Moin,

Oh der schaltplan ist etwas öhm naja falsch ;) Ist aber in er Realität richtig abgeklemmt tut mir leid ;/ Ich werde mal eben noch einen Neuen schlatplan zeichnen

Die spanungsregelung vom arduino muss ja auch nur den 1 Wire Bus versorgen und den ULN2803 denke das Sollte reichen allerdings besteht das Problem ja auch wenn er Extern per 5 volt versorgt wird

Grüße Felix

EDit: Hier nun der Richtige schaltplan

Immer noch falsch. Der ULN ist ein Open Collector Transistor Array. Einen Eingang für +12V gibt es da nicht. Die Betriebsspannung hängt an der Last und der Strom fließt über die Transistoren gegen Masse ab (normale Emitter-Schaltung).

Ich nehme mal an Masse ist korrekt an Pin 9, da es funktioniert, aber die Freilaufdioden (COM, Pin 10) müssen an +12V angeschlossen sein und nicht auf GND.

Hallo,

ich war zugegeben auch erstmal verwirrt über die Anschlussbezeichnungen. Aber wie Serenilfy schon sagt, Du hast den COM Pin 10 mit Masse verwechselt. COM steht nicht für Masse, sondern für common, gemeinsam. Und einen Pin namens VIN gibts auch nicht am ULN. Nur GND Pin 9 darf und muß auf Masse. Vielleicht guckst Du auch den IC falsch an und zählst die Pin nummern falsch durch. Die Pins sind und werden durchnummerriert von 1-18. Ich habs mal richtig beschalten. Guck es Dir genau an.

COM auf Masse könnte einen Kurzschluss erklären, warum alles verrückt spielt. Ich hoffe die internen Dioden haben es überlebt.

Doc_Arduino:
Wird der ULN2803 auch mit dem 5V vom Arduino versorgst?

Der ULN2803 braucht keine Versorgungspannung. Das sind Open Collektor Darlington-Transistoren. Diese schalten bei einem Basisstrom den Kollektor auf Masse. Da braucht es keine positive Versorgungsspannung. Der ULN2803 hat Schutzdioden um Abschaltspitzen von Spulen kurzzuschließen. Darum müssen in Falle von induktiven Lasten die Dioden auf + Versorgungspannung der Last geschaltet werden.
Grüße Uwe

Zu meinem vorletzen Antwortung.
Die Lasten (Relais) werden über 12 V und den ULN versorgt und darum wird der Arduino nur minimal belastet. Auch bei 12V müßte der Spannungsstabilisator nicht wegen überhitzung abschalten.

Grüße Uwe

Moin,

Also heute bin ich mit einem befreundeten Elektroniker mal an die sache herangegangen... Als erstes mit dem Arduino Mega(der ist eig. normalerweiße verbaut) mal probehalber über 5v aus einem Handy ladegerät geprüft(Per usb anschluss) ergebnis selbes Problem.

dann die selbst gebaute elektronik überprüft ergebnis > alles richtig zusammengebraten

Dann klingelte der Freundliche Paketbote und reichte mir ein Päckchen Ausgepackt und siehe da der Uno ist heut schon gekommen also mal probehalber mit der Software bespielt und reingehangen... und siehe da es geht seit jetzt 12 uhr mittags problemlos... Mein Kumpel wollte mal den Mega mitnehmen allerdings muss ich ihn erst ausbauen...

Grüße Felix

Ist der Arduino MEGA orginal? Grüße Uwe

Moin,

Ja der Mega war original der Uno allerdings nicht...

Grüße

Hallo,

irgendwas muß falsch beschalten gewesen sein, wenn Du COM vom ULN auf Masse legst laut Schaltplan statt auf +. Und was VIN am ULN sein soll laut Deinem Schaltplan weis ich immer noch nicht.