Hello World - Meine ersten Schritte

Hallo liebe Community,

ich bin neu in der Arduinowelt. Aufgrund eines Technikerprojektes bin ich von einer S7-SPS auf den Arduino umgesprungen und bewege mich in eine komplett neue Umgebung.

Ich erstelle eine automatisierte Poolanlage die eine automatische pH- und Redoxregelung beinhaltet.

Da ich vorher noch nie mit einem Arduino zutun hatte, habe ich erstmal genug zum Einlesen.
Möglicherweise bietet hier jemand seine Hilfe an, in dem er/sie mir die seiner/ihrer Meinung nach besten Videos oder Beiträge im Forum verlinkt.

Ich habe mich für den Arduino Mega 2560 Rev3 entschieden, da dieser mir genügend analoge In- und Outputs bietet. Gibt es weitere Argumente für den Mega 2560?

So viel wie ich weiß, ist es so, dass der Arduino nicht wirklich über Analogsignale verfügt, sondern über PWM aus digitalen Signalen, analoge generiert. Verbessert mich gerne, wenn ich falsch liegen sollte

Schön hier zu sein und liebe Grüße

Babosinho

Ja.

Was hast Du denn für Sensoren und Aktoren im Blick (bitte mit Link)?
Die bisherigen Infos sind weitgehend nichtssagend.
Der Arduino generiert aus PWM keine analogen Signale, sondern nur PWM. Wofür brauchst Du analoge Ausgangssignale?

Gruß RTommy

Das wäre die pH Elektrode: DFRobot Gravity Analog pH Sensor / Meter Kit For Arduino - Arduino -

Dies die Redoxelektrode: Gravity: Arduino ORP Meter V1.0 - DFRobot

Das bedeutet, dass der Arduino nur über analoge Eingänge verfügt, jedoch die über die PWM Kontakte analoge Werte ausgeben kann? Oder habe ich da was falsch verstanden? Bitte um Gnade :slight_smile:

die wären? :slight_smile:

Wofür Du analoge Ausgangssignale brauchen willst, hast Du immer noch nicht erklärt.
Beide Sensoren haben einen Beispielcode für Arduino. Hast Du sie damit schon probiert?

Gruß Tommy

Da ich erst vor 2 Tagen auf den Arduino umgesprungen bin, habe ich die Komponenten noch nicht bestellt.

Geplant ist, die Werte auszulesen und sie anschließend mit flüssigem pH Minus/Plus und Chlor nach zu regeln. Daher benötige ich selbstverständlich analoge Signale.

Sicher?
Wenn die Suppen, die Du dazugeben willst in flüssiger Form vorliegen, werden sie doch - meine Vermutung - über eine Pumpe ins Becken gefördert. Die kann man kurz oder länger einschalten: Mit einem digitalen Signal.

Kann natürlich auch sein, dass ich gründlich danebenliege.

Wie @Tommy56 schreibt nix Analog nur reine Pulsweitenmodulation

Das ist korrekt. Im Bezug auf die Dosierpumpen werden nur digitale Signale benötigt. Jedoch die Messung der Werte erfolgt über Analoge.

Und damit hat Mega keine Probleme außer, das es wird nur in 10 Bit Auflösung gerechnet

Da Du schon Sensioren ausgesucht hast... Hast Du mal geschaut, wie der ExampleCode dazu aussieht?
zumindest für den PH-Wert ist der recht simpel und zeigt, wie es geht.

da hast du mich getroffen :slight_smile:

was ist der example code? Der Beispielcode des Bauteils der dazugehörigen Manuals?

Was möchtest du denn hören?

Das sind dann aber Eingänge. Davon haben Uno, Nano, Mega und Co. genügend - analogRead() ist die Funktion, die dann hilft.

Gilt auch für den ORP Sensor.

In beiden Links gibt es "Documents" bzw. "Dokumente". Da drin "Arduino Sample Code" - das ist jeweils ein ZIP mit genau einer .ino-Datei.

Bei den Sensoren ist der TAB Dokumente - Da gibt es den Beispielcode. (@wno158 war schneller :wink: )
Und wenn Du wirklich ganz neu und vollkommen unwissend bist, kannst Du Dir hier ein pdf runterladen, einmal durchlesen und dann weisst, was drin steht - der Rest kommt dann schon.
Und dann kannst auch unter DATEI - BEISPIELE - einfach mal durchklicken, was es alles gibt....
Nur reinschauen und wissen, das es was gibt.

1 Like

Analoge Eingangssignale sind kein Problem für den Mega. Da hast du 16 Eingänge. Nur keine analogen Ausgänge. Das heißt du bekommst aus dem Arduino Mega an keinem Ausgang geregelte 0-5 Volt raus. Die PWM Ausgänge geben nur gepulste 5 Volt mit verschiedenen Pulslängen raus. Wenn man saubere Analoge Ausgänge braucht, ist das aber kein Problem. Dafür gibt es kleine Zusatzplatinen, für kleines Geld, die dann auf 4 Kanälen saubere geregelte Analoge Spannungen rausgeben 0-5 Volt, oder auch 0-10 Volt, vom Arduino Mega gesteuert über den I2C - Bus. Da benutze ich die hier im Link gerne.

1 Like

Wenn sich die Sensoren an den Mega2560 anschließen lassen, benötigst Du noch eine Anzeige und Eingabeelemente. Dafür solltest Du die Pins für in Hardware gegossene Schnittstellen wie I²C, SPI und UART (RXn, TXn) freihalten.

Anschließbare Displays gibt es viele, einfach in der Programmierung sind vierzeilige I²C LCD Module.

Sollwerte können beispielsweise per Spannung am Potentiometer oder Drehencoder eingegeben werden.

Da wünsche ich Dir eine weiche Landung, denn das ist schon etwas anders. Manchmal wird Dir die SPS gedanklich im Wege stehen.

  1. Tipp: In Beispielen wird häufig delay() verwendet. Du solltest ganz schnell lernen, Zeiten mit millis() zu messen, um ein blockadearmes Programm zu erhalten, also quasi parallele Aktivitäten in Zeitscheiben. Lasse zur Kontrolle eine LED als Herzschlag blinken.
  2. Tipp: Wenn Du eine Schleife brauchst, versuche es mit loop(), denn das ist eine Schleife.
  3. Tipp: Programmabläufe packt man am besten in Schrittketten (= finite state machine = endlicher Automat). Für mich war das der AHA-Effekt beim Arduino.
  4. Tipp: Nutze die Referenz.
  5. Tipp: Lerne allgemeingültige Beispiele aus C++-Anleitungen für Dich zu übernehmen. Ein paar wenige Möglichkeiten sind für den Mega2560 nicht verfügbar, das Allermeiste aber schon. Dein Kompiler "berät" Dich.
  6. Tipp: Fange klein an und steigere Dich langsam. Ich lerne gerne von fremden Programmen, klaue voller Dankbarkeit aber hemmungslos, ändere solange, bis es für mich paßt und spiele, bis ich glaube, den Ablauf verstanden zu haben. Dann ist es "mein" Programm :slightly_smiling_face:

Ich habe mit blinkenden LEDs angefangen, mich in die Programmierung des Arduinos einzugewöhnen. Daher ein Beispiel mit einer Herzschlag-LED und einer unregelmäßig blinkenden LED, wobei die unterschiedlichen Zeiten mit einer Schrittkette eingestellt werden1):

// getestet mit Mega2560
const uint8_t ledPin = 22;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);  // beim Mega2560 Pin 13
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  blinken();
  heartbeat();
}

void blinken()
{
  uint32_t jetzt = millis();
  static uint32_t intervall = 0;
  static uint32_t vorhin = 0;
  static uint8_t schritt = 0;

  if (jetzt - vorhin >= intervall)
  {
    vorhin = jetzt;
    digitalWrite(ledPin, !digitalRead(ledPin));
    switch (schritt)
    {
      case 0:
        intervall = 100;
        schritt++;
        break;
      case 1:
        intervall = 200;
        schritt++;
        break;
      case 2:
        intervall = 300;
        schritt++;
        break;
      case 3:
        intervall = 400;
        schritt = 0;
        break;
      default:
        intervall = 0;
        schritt = 0;
    }
  }
}

void heartbeat()
{
  uint32_t jetzt = millis();
  const uint32_t intervall = 222;
  static uint32_t vorhin = 0;
  if (jetzt - vorhin >= intervall)
  {
    vorhin += intervall;
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  }
}

Anm.:

  1. Die Nutzung der Schrittkette ist etwas an den Haaren herbeigezogen.

Eigentlich nicht.

Zumindest, wenn man in "AWL" denkt, ist man ganz dicht an den Konzepten, die man auch in Arduino C++ denken kann.

Der alternative Weg:
z.B. viele Dinge meiner CombieLib beruhen auf der Datenfluss Sichtweise. Diese ist konzeptionell ähnlich mit den "Koppelplänen" in der SPS Programmierung

Die SPS Denke fordert dort eigentlich einen "Funktionsbaustein Schrittkette" welcher sich allerdings sehr gut in C++ nachbilden lässt.