Brauche ein Delay, das macht mir aber woanders was kaputt

Ich habe ein doofes Problem: Ich messe wie im ersten Codeschnipsel angegeben die Temperatur eines Sensors. Dann schicke ich diese Werte an einen PC der gibt mir einen Wert für eine Steppersteuerung retour.

#include <OneWire.h>
#include <DallasTemperature.h>
 
OneWire  ds(2); //pin für ds1820
 
//DeviceAdressen der einzelnen ds1820 Temperatursensoren angeben. (loop anpassen)
DeviceAddress sensor1 = { 0x10, 0x38, 0x27, 0x57, 0x2, 0x8, 0x0, 0x79 };
DeviceAddress sensor2 = { 0x10, 0x16, 0x2E, 0x57, 0x2, 0x8, 0x0, 0x2F };
DeviceAddress sensor3 = { 0x10, 0x11, 0x40, 0xC0, 0x1, 0x8, 0x0, 0x9A };
DeviceAddress sensor4 = { 0x10, 0x77, 0x38, 0x57, 0x2, 0x8, 0x0, 0x3B };
 
char sensor1Name[] = "Garten: ";
char sensor2Name[] = "Wohnzimmer: ";
char sensor3Name[] = "Heizkeller: ";
char sensor4Name[] = "Aquarium: ";
 
void setup(void) 
{
  Serial.begin(9600);
}
 
void writeTimeToScratchpad(byte* address)
{
  //reset the bus
  ds.reset();
  //select our sensor
  ds.select(address);
  //CONVERT T function call (44h) which puts the temperature into the scratchpad
  ds.write(0x44,1);
  //sleep a second for the write to take place
  delay(1000);
}
 
void readTimeFromScratchpad(byte* address, byte* data)
{
  //reset the bus
  ds.reset();
  //select our sensor
  ds.select(address);
  //read the scratchpad (BEh)
  ds.write(0xBE);
  for (byte i=0;i<9;i++){
    data[i] = ds.read();
  }
}
 
float getTemperature(byte* address)
{
  int tr;
  byte data[12];
 
  writeTimeToScratchpad(address);
 
  readTimeFromScratchpad(address,data);
 
  //put in temp all the 8 bits of LSB (least significant byte)
  tr = data[0];
 
  //check for negative temperature
  if (data[1] > 0x80)
  {
    tr = !tr + 1; //two's complement adjustment
    tr = tr * -1; //flip value negative.
  }
 
  //COUNT PER Celsius degree (10h)
  int cpc = data[7];
  //COUNT REMAIN (0Ch)
  int cr = data[6];
 
  //drop bit 0
  tr = tr >> 1;
 
  return tr - (float)0.25 + (cpc - cr)/(float)cpc;
}
 
void loop(void) 
{
  float temp1 = getTemperature(sensor1);
}

In der Funktion writeTimeToScratchpad ist am Ende ein delay(1000) drin - den mag mein Stepper aber gar nicht. Den Stepper steuere ich mit

stepper.setSpeed(incoming_float);
stepper.run();

an. Gibt es eine Möglichkeit das irgendwie parallel laufen zu lassen?

Nur so eine Idee, beim ersten Aufruf von writeTimeToScratchpad die Zeit messen (millis()) , und ein Boolean auf false setzen. Solange diese Variable auf false steht --> return .

In readTimeFromScratchpad immer zurückspringen solange keine Sekunde vergangen ist, wenn ja Werte auslesen und writeTimeToScratchpad (Boolean auf true) wieder freigeben. Beide Funktionen werden dann quasi wie ein flipflop ausgeführt.

Hallo,

wenn ich Dein Problem richtig verstanden habe, wäre ein Lösungsansatz vielleicht:

Du nimmst die beiden Aufrufe
writeTimeToScratchpad(address);
readTimeFromScratchpad(address,data);
aus der Funktion getTemperature() raus.

Mit
void setup(){
noInterrupts();
TIMSK &= ~(1<<TOIE0);
TCCR1A = (0<<COM1A1) | (0<<COM1A0) | (0<<WGM11) | (0<<WGM10);
TCCR1B = (0<<CS12) | (1<<CS11) | (1<<CS10);
TIMSK |= (1<<TOIE1);
TCNT1H = 0xFF;
TCNT1L = 0x06;
interrupts();
writeTimeToScratchpad(address);
zaehler = 0;
}//setup
baust Du Dir einen Timer auf. Die Registernamen musst Du dabei an Deinen Controller anpassen, dieser Code hier wäre für den ATMega8.

In einer Timerfunktion zählst Du einen Counter hoch:
ISR(TIMER1_OVF_vect) {
TCNT1H = 0xFF;
TCNT1L = 0x06;
zaehler++;
}

Die Funktion loop() änderst Du so:
void loop(void) {
if(zaehler == 0) {
writeTimeToScratchpad(address);
}
if(zaehler > 1000) {
readTimeFromScratchpad(address,data);
float temp1 = getTemperature(sensor1);
zaehler = 0;
}
}

Damit würde zaehler dann im Interrupt (1000 mal pro Sekunde) hochgezählt und readTimeFrom… und getTemperature… würden erst eine Sekunde nach der Funktion writeTimeTo… aufgerufen.

Ich hoffe, ich habe Dein Problem richtig verstanden und das hier hilft ein wenig.

Gruß,
Ralf