Multitasking

Guten Tag

Wäre es möglich diese beiden codes in ein programm bzw. auf ein arduino zu laden?

1 code (Smart home steuerung):

#define relay_1 4
#define relay_2 5
#define relay_3 6
#define relay_4 7

int state = 0;


void setup() {
  Serial.begin(9600);
  pinMode(relay_1, OUTPUT);
  pinMode(relay_2, OUTPUT);
  pinMode(relay_3, OUTPUT);
  pinMode(relay_4, OUTPUT);

  // Ininially all relay pin HIGH because relay active LOW
  digitalWrite(relay_1, HIGH);
  digitalWrite(relay_2, HIGH);
  digitalWrite(relay_3, HIGH);
  digitalWrite(relay_4, HIGH);

}

void loop() {

  if (Serial.available() > 0)
  {
    state = Serial.read();
  }
  if (state == 'A')
  {
    digitalWrite(relay_1, HIGH);  // relay_1 turn OFF
    state = 0;
  }
  else if (state == '1')
  {
    digitalWrite(relay_1, LOW); // relay_1 turn ON
    state = 0;
  }
  else if (state == 'B')
  {
    digitalWrite(relay_2, HIGH);  // relay_2 turn OFF
    state = 0;
  }
  else if (state == '2')
  {
    digitalWrite(relay_2, LOW);  // relay_2 turn ON
    state = 0;
  }
  else if (state == 'C')
  {
    digitalWrite(relay_3, HIGH);  // relay_3 turn OFF
    state = 0;
  }
  else if (state == '3')
  {
    digitalWrite(relay_3, LOW);  // relay_3 turn ON
    state = 0;
  }
  else if (state == 'D')
  {
    digitalWrite (relay_4, HIGH); // relay_4 turn OFF
    state = 0;
  }
  else if (state == '4')
  {
    digitalWrite(relay_4, LOW);  // relay_4 turn ON
    state = 0;
  }



}
  1. Code ( DHT11 Sensor):
// DHT11 Temperature and Humidity Via Bluetooth
// By keuwlsoft:  www.keuwl.com  26th Sept 2015
// cc Attribution-ShareAlike

// The DHT11 returns 5 bytes of data:
// Bytes 1 & 2 are Humidity, Bytes 3 & 4 are Temperature
// and Byte 5 is the checksum (ignored in this demo).
// Since sensor is only 8-bit resolution, we ignore bytes 2 and 4.
// Internal 20k pullup on Arduino used, so no external 5k resistor needed.
// Powered from digital output lines so no breadboard/cables required.

int data_pin = 9;
int vcc_pin=8;
int gnd_pin=10;
boolean result[41]; //holds the result
int interval=2000; //Sample every 2 seconds
unsigned int temp; //in celcius
unsigned int humidity; //in %RH

void setup() {

  //Supply power to DHT11 (Uses upto 2.5mA)
    pinMode(gnd_pin, OUTPUT);
    pinMode(vcc_pin, OUTPUT);
    digitalWrite(gnd_pin,LOW);
    digitalWrite(vcc_pin,HIGH);
    
  //Initiate Serial for Bluetooth Communication
    Serial.begin(9600); 
}

void loop() {
  //Pause before taking next measurement
    delay(interval); 
 
  //Trigger reading by holding data pin low for 18ms
    pinMode(data_pin, OUTPUT);
    digitalWrite(data_pin,LOW);
    delay(18);
    digitalWrite(data_pin,HIGH);
    pinMode(data_pin, INPUT_PULLUP); 
  
  //read 41 bits of signal
    for(int i=0;i<=40;i++){
      result[i]=(pulseIn(data_pin, HIGH)>40);
    }

  //Extract Humidity (from byte 1)
    humidity=0;
    for (int i=1;i<=8;i++){
      humidity=humidity<<1;
      if (result[i]) humidity|=1;
    }
      
  //Extract Temperature (from Byte 3)
    temp=0;
    for (int i=17;i<=24;i++){
      temp=temp<<1;
      if (result[i]) temp|=1;
    }
    
   //Send data over Bluetooth
    Serial.print("*T"+String(temp)+"*");
    Serial.print("*H"+String(humidity)+"*");

}

Nein.

Du musst einen Code schreiben, in dem beide Funktionalitäten quasi scheibchenweise nacheinander abgearbeitet werden.

mal die eine, mal die andere.

Scheint mir lösbar, nur gibs für dich am Uno kein "Multitasking" und kein "parallel". Schnell hintereinander - das kannst machen und wird scheinbar auch so funktionieren wie du dir das vorstellst.

Klar geht das, hat aber nix mit "Multitasking" zu tun.

Du musst deine Tele so zusammen setzen, dass keine doppelten Namen der Variablen und Funktionen auftreten.
Die 2. loop kann auch als Funktion eingesetzt werden.

Einfach probieren, die IDE meckert, wenn etwas falsch ist.

HotSystems:
Die 2. loop kann auch als Funktion eingesetzt werden.

was meinst du damit?

aaronwaelchli:
was meinst du damit?

Du schreibst das was in der loop steht, als Funktion mit einem neuen Namen in den neuen Sketch.

Hi

Solange Du delay() benutzt, wird Das extrem schwer (combie bekäme Das wohl trotzdem hin ... :wink: ).

Sonst kannst Du die Funktion loop() des einen Sketch doch loop1() nennen, oder?
Die loop() des 2.ten Sketch loop2() - dann hättest Du zwei Funktionen, Die eigenständig sind und, sofern nur lokale Variablen benutzen, Nichts miteinander zu tun haben.
Nun musst Du 'nur' in der neneen loop() diese beiden Funktionen aufrufen.

Und zumindest in loop2() etwas Basteln, damit Du von delay() weg kommst.
Stichwort Endlicher Automat/State-Maschine/Schritt-Kette
Suchwort 'Nahctwächter-Erklärung' hier im Forum.

Davon ab ist der DHT11 noch schuntiger als der DHT22 und von Dem liest man nicht viel Gutes.
Für Luftfeuchte ist ein BME280 um Welten besser/stabiler.
(Der kann auch noch ein Bisschen mehr, also Umrechnen von relativer Feuchte auf absolute Feuchte geht mit den Werten - z.B. für eine Keller/Garagen-Belüftung interessant, daß wirklich trockene Luft reingeblasen wird.)

MfG

postmaster-ino:
Sonst kannst Du die Funktion loop() des einen Sketch doch loop1() nennen, oder?
Die loop() des 2.ten Sketch loop2() - dann hättest Du zwei Funktionen, Die eigenständig sind und, sofern nur lokale Variablen benutzen, Nichts miteinander zu tun haben.
Nun musst Du 'nur' in der neneen loop() diese beiden Funktionen aufrufen.

Kannst du den skech sicken so wie du es meinst. bin noch anfänger

HotSystems:
Du schreibst das was in der loop steht, als Funktion mit einem neuen Namen in den neuen Sketch.

?

Hi

Klar KANN ich Das - aber warum sollte ich Dir den Kram vorkauen?
Was verstehst Du nicht daran, die loop() aus Sketch 1 in loop1() umzubenennen?
Klar: Dann hast Du keine loop() mehr - Die solltest (MUSST) Du wieder erstellen, also:
void loop(void){
loop1();
}
Da Das kein wirkliches Hexenwerk ist, hätte ich Das wohl auch im Mittelalter ohne Scheiterhaufen überlebt.

MfG

(combie bekäme Das wohl trotzdem hin ... :wink: )

Natürlich!

combie:
Natürlich!

Aber geh ...

zwieblum:
Aber geh ...

Ösi?

--

Beweis:

/**
 * Basisprogramm: 
 * Das Blink Beispiel aus der Arduino IDE
 * 
 * Zusaetzliche nebenlaeufige Funktionalitaet: 
 * Eine Ablaufsteuerung
 * 
 * Nach betaetigen des Schalters startet die Absaugung und danach
 * die Maschine. Nach abschalten stoppt erst die Maschine und danach die 
 * Absaugung
 * 
 * 
 *    Ablaufdiagramm - Zeitdiagramm
 *    
 *        schalter  _----------_____  Schalterstellung
 *        absaugung _-------------__  Verzoegertes abschalten
 *        maschine  ____-------_____  Verzoegertes einschalten
 *        
 *        Der Schalter arbeitet invers und ist entprellt
 *        
 *
*/

#include <CombieTimer.h>
#include <CombiePin.h>
#include <CombieTypeMangling.h>

using namespace Combie::Pin;
using namespace Combie::Timer;
using namespace Combie::Millis;

TasterGND<2> schalter; // zwischen Pin und GND(invertierend)
OutputPin<3> absaugung;
OutputPin<4> maschine;


EntprellTimer    entprell { 20_ms};  // Schalter entprellen
RisingEdgeTimer  ton      {500_ms};  // steigende Flanke wird verzoegert
FallingEdgeTimer toff     {500_ms};  // abfallende Flanke wird verzoegert
 
void setup(void) 
{
  schalter.initPullup();
  absaugung.init();
  maschine.init();
  pinMode(LED_BUILTIN, OUTPUT); // unveraendert aus Blink.ino
}

void yield(void) 
{
  bool schalterMerker  =  entprell  =  schalter; 
  absaugung  =  toff  =  schalterMerker;
  maschine   =  ton   =  schalterMerker;
}

void loop(void) // unveraendert aus Blink.ino
{
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

aaronwaelchli:
?

Ach....dann schreib doch mal, was du kannst und was du nicht kannst.

noiasca:
weist du wie man eine Funktion ertellt?

Nein

HotSystems:
Ach....dann schreib doch mal, was du kannst und was du nicht kannst.

Also ich habe mir dieses Forum freundlicher vorgestellt. Jeder ist mal anfänger !!!

aaronwaelchli:
Nein

Ist nicht schwer und gibt genügend Beschreibungen im Web.

Z.B.

void meineFunktion(void) 
{
// deinen Code der ausgeführt werden soll
}

aaronwaelchli:
Also ich habe mir dieses Forum freundlicher vorgestellt. Jeder ist mal anfänger !!!

Wieso....sind wir unfreundlich ?

Wir erklären dir alles, machen musst du es.
Wir können nicht in deinem PC tippen, schreiben musst du es.
Oder sollen wir dir alles vorschreiben ?

Dann bist du hier falsch. Lernen und schreiben musst immer noch du !
Auch als Anfänger musst du lernen.

HotSystems:
Ach....dann schreib doch mal, was du kannst und was du nicht kannst.

diesen satz meine ich. der ist für mich frech auf hohem niveau

aaronwaelchli:
diesen satz meine ich. der ist für mich frech auf hohem niveau

So, dann will ich jetzt mal ganz freundlich sein.

Lerne erstmal Grundlagen, bevor du dich an die Controller-Programmierung ranwagst.
Ohne Grundlagen wird das nix.

Du darfst auch kein Auto ohne Führerschein auf öffentlichem Gelände fahren.

Sorry, wenn ich zu ehrlich war.

Du darfst auch kein Auto ohne Führerschein auf öffentlichem Gelände fahren.

Nicht alles was hinkt, ist ein Vergleich. An einem Arduino darfst du rumbasteln wie du willst. Und dabei so tief in Details einsteigen wie du willst und kannst.

Aus diesem verunglückten Thread kannst du schonmal lernen:

  • "Multitasking" ist wohl nicht die Lösung.
  • "bin Anfänger, kannst du mir den Sketch machen" funktioniert hier nicht so wie du dir das wünschst.
  • Ein Beispiel finden und feststellen "geht nicht" ist deutlich zu wenig Eigeninitiative.