Projekt mit Taster, Schalter, LED - allgemeine Fragen

Hallo zusammen!

Ich bin absolut neu im programmieren. C wie auch Arduino (Mega), soll aber ein kleines Projekt auf Arbeit realisieren.

Daher ein paar Fragen für die Anfang:

Kann ich das kürzer schreiben? Ich möchte eine kurze Wartezeit, wenn einer dieser Taster gedrückt wird (Analog Eingänge 0-15), die sollen entprellen. Im Netz gibt es unglaublich viel dazu, weiß jedoch nicht, wie ich das sinnvoll einbinde.

if (int i=82||83||84||85||86||87||88|89|90||91||92||93||94||95||96||97 == 1)
{
delay(20);
}

Und wie ist es möglich mehrere Ausgangspins auf High zu schalten (für nur etwa 1s), wenn ein bestimmter Eingangspin (da ist ein Schalter dran) selbst auf High schaltet durch den Schalter?
Eigentlich geht es bei diesem Eingangspin nur um Pin 3 bei der Leiste PWM.

if(DDRE = B00010 >= B11111)
{
digitalWrite(i=22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52, HIGH);
delay(1000)
}
Das ist mein erster Versuch dazu, funktioniert aber vorne und hinten nicht - und dürfte auch generell falsch sein.

Beste Grüße,
Kiatec

und dürfte auch generell falsch sein.

Ja!

Ein C++ Tutorial/Buch wird dir helfen die Sprache, welche du verwendest zu verstehen.

Was du da bauen willst, scheint mir eine "Ablaufsteuerung" werden zu sollen.

Mein Dauertipp, in so einer Sache: Baue einen endlichen Automaten!

Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:
Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay,

Blink Without Delay
Der Wachmann

Multitasking Macros
Intervall Macro

Wer - ohne vorher schwimmen zu lernen - ins kalte Wasser springt, wird normalerweise untergehen und NICHT schwimmen lernen.

Ich kann dir auch nur raten, erstmal die Grundzüge der Sprache C zu lernen, bevor Du an dein Projekt gehst. Tutorials dazu gibt es reihenweise im Internet. Wenn Du die Grundzüge beherrscht, kannst Du dich mit den von combie erwähnten 'endlichen Automaten' beschäftigen. Dann wirst Du eine Lösung für dein Projekt finden. Und wenn Du dabei konkrete Probleme hast, kannst Du gerne hier wieder fragen.

Aber deine Versuche oben zeigen, dass dir die grundlegendsten Basics fehlen. Die musst Du dir erstmal erarbeiten.

Hallo,
stelle einmal Deinen ganzen Sketch- in CodeTag´s (Editor </>) hier ein.
Gruß und Spaß
Andreas

Kiatec:
Und wie ist es möglich mehrere Ausgangspins auf High zu schalten (für nur etwa 1s), wenn ein bestimmter Eingangspin (da ist ein Schalter dran) selbst auf High schaltet durch den Schalter?

Damit Du weißt, in welche Richtung Du lernen solltest:

const byte Taster1 = 2;
const byte Relais1 = 10;
const byte Relais2 = 11;
const byte Relais3 = 12;
const byte led1 = 13;
const byte ausPins[] = {Relais1, Relais2, Relais3, led1};
const byte ausAnzahl = sizeof(ausPins);
const unsigned long ausZeit = 1000;
unsigned long ausMillis;
bool taster1akt, taster1alt;

void setup() {
  pinMode(Taster1, INPUT_PULLUP);
  for (byte j = 0; j < ausAnzahl; j++)
  {
    pinMode(ausPins[j], OUTPUT);
  }
}

void loop() {
  taster1alt = taster1akt;
  taster1akt = digitalRead(Taster1);
  if (!taster1akt && taster1alt)
  {
    ausMillis = millis();
    for (byte j = 0; j < ausAnzahl; j++)
    {
      digitalWrite(ausPins[j], HIGH);
    }
  }
  if (millis() - ausMillis >= ausZeit)
  {
    for (byte j = 0; j < ausAnzahl; j++)
    {
      digitalWrite(ausPins[j], LOW);
    }
  }
}

Das Feld ausPins kannst Du beliebig erweitern (mein UNO hat nicht so viele wie der Maga2560).

Kiatec:
Hallo zusammen!

Ich bin absolut neu im programmieren. C wie auch Arduino (Mega), soll aber ein kleines Projekt auf...
Beste Grüße,
Kiatec

Hallo Kiatec,
die Antworten werden Dir sicher nicht gefallen.
Ich habe vor 2 Jahren sporadisch angefangen
mit C und Arduino. Ebenfalls ohne Vorkenntnisse.
(wenn man davon absieht, dass ich mit 8bit Rechnern
groß geworden bin)

Deine Aufgabenstellungen ist nicht sonderlich schwer. Du wirst also keine 2 Jahre brauchen um dich einzuarbeiten. :wink:
Wenn ich Dir etwas raten darf?
Funduino bietet für kleines Geld ein Anfänger-köfferchen. Es gibt eine eigene, deutsche Website
mit Beispielen und Erklärungen für ALLE
angebotenen Teile.
Du kannst mit dem Material auch die Beispiele
der Arduino IDE durcharbeiten.

Es wird nicht lange dauern, bis du verstehst
wie es läuft. Wenn Du dich abends dran setzt
vielleicht 2 Wochen.

Ab da macht es Sinn hier Fragen zu stellen.
Fang mit einem eigenen Sketch an, in dem du einen
Beispielsketch erweiterst. Wenn es dann harkelt,
wir sind hier.

Stefan

Hallo nochmal!

Vielen Dank für die Antworten.
Das grunsätzliches lernen der Sprache erstmal Vorrang hätte, weiß ich leider auch. Nur ist mir das Projekt nun davor zugeteilt worden und habe keine Wahl als mich da bitter durchzuquälen.

Im Moment sieht es so aus, als wäre die externe Verdrahtung der Adapterplatine die ja programmiert werden soll ziemlich verdreht.

Daher nochmal eine Frage (die alten sind erstmal hinfällig, bis ich auf einem aktuellen Stand bin):

Kann ich zuerst mehrere Ports (DDRA,C,G,L,B) als Input auf HIGH schalten (am Arduino) und dann als Ausgang deklarieren?
Laut der Arduino Seite kann man es auf jeden Fall einzeln machen (" Consequently, a pin that is configured to have pullup resistors turned on when the pin is an INPUT, will have the pin configured as HIGH if the pin is then switched to an OUTPUT with pinMode(). "). In meinem Fall betrifft das die PINs 22-53.

Es ist nun unumgänglich, dass die PINs zuerst als Eingang mit HIGH gekennzeichnet werden, ehe sie Ausgänge (ebenfalls mit HIGH als Standard) deklariert werden. Andernfalls würde die externe Schaltung einen Kurzschluss verursachen.

Bisher hatte ich es so versucht:

 DDRA = B00000000;
 DDRB = B00000000;
 DDRC = B00000000;
 DDRL = B00000000;
 DDRG = DDRG | B00000000;
 DDRD = DDRD | B00000000;
 
//Ausgänge vorbereiten
 digitalWrite(DDRA, HIGH);
 digitalWrite(DDRB, HIGH);
 digitalWrite(DDRC, HIGH);
 digitalWrite(DDRL, HIGH);
 digitalWrite(DDRG, HIGH);
 digitalWrite(DDRD, HIGH);

//Ausgänge
 DDRA = B11111111;
 DDRB = B11111111;
 DDRC = B11111111;
 DDRL = B11111111;
 DDRG = DDRG | B00000111;
 DDRD = DDRD | B10000000;

Was leider nicht funktioniert.

for(int i=22;i<54;i=i+1){
  digitalWrite(i,HIGH);

Schaltet alles richtig - nur weiß ich nicht, ob ich das direkt vor der Deklaration der Ausgänge schreiben kann und es wirklich auf HIGH geschaltet wird, ehe sie als Ausgänge zugewiesen werden. Kann ich das irgendwo nachsehen oder prüfen?

Beste Grüße,
Kiatec

?

Ich verstehe es nicht. Dafür bin ich noch zu sehr Anfänger ?!

Stefan

Bestimmt nicht. Ich viel mehr. :wink:

Was verstehst Du nicht? Vielleicht habe ich es schlecht beschrieben.

DDRA  = 0x00; // schaltet alle 8 auf Eingang (kann man weg lassen, Input ist der Default)
PORTA = 0xff; // schaltet alle 8 Pullup ein (vorbereitung auf das spätere High)
DDRA  = 0xff; // schaltet alle 8 auf Ausgang und High

Und das, ohne eine aktive Low Phase zu durchlaufen

digitalWrite(DDRA, HIGH);

Das ist völliger Unsinn!
Denn digitalWrite() erwartet nicht den Inhalt des Registers sondern einen Arduino Pinbezeichner.

Genau das - und viel kürzer als meines! Vielen Dank!

Meine anfängerfreundliche Langversion (alles ungetestet):

for(byte i=22;i<54;i++){
  PinMode(i, INPUT_PULLUP);  // Eingang und Pullupwiderstand
  PinMode(i, OUTPUT);
}

Das mache ich bei LOW-aktiven Relais, sollte hier auch funktionieren.

Wenn die Pins nicht so schön zusammenliegen, definiert man diese mittels eines Feldes:

const byte pins[] = {22,24,30,31}

oder

const byte RELAY1 = 22;  // Bierpumpe
const byte RELAY2 = 24;  // Schnapsventil
const byte RELAY3 = 30;  // Chipsmotor
const byte RELAY4 = 31;  // Eisportionierer
const byte pins[] = {RELAY1 ,RELAY2 ,RELAY3 ,RELAY4}

void setup() {
 for(byte j=0; j<sizeof(pins); j++){
   PinMode(pins[j], INPUT_PULLUP);  // Eingang und Pullupwiderstand
   PinMode(pins[j], OUTPUT);
 }
}

Der Möglichkeiten gibt es viele :slight_smile: