C (Programmiersprache) – die neusten Beiträge

SoftwareSerial wie benutzen?

Hallo an die Arduino- Community,

Ich habe mich ja schon sehr viel mit dem Arduino beschäftigt, aber natürlich nicht genug und es ist wahrscheinlich auch nur ein Bruchteil des Möglichen. So genug drum gelabert, zu meiner Frage: Ich benutze die App Blynk zusammen mit dem Arduino Uno, diese muss zum funktionieren eine durchgehende Verbindung zu meinem Serial Port (COM4 in meinem aktuellen Fall) haben, damit die funktioniert. Das bedeutet natürlich, dass ich meinen Seriellen Monitor nicht offen haben kann, da der ja ebenfalls auf den Port zugreifen muss, und nur 1 gleichzeitig geht.

Ich habe aber gehört, ich kann über den SoftwareSerial - Befehl einen zweiten Seriellen Monitor haben... Weiß nur gar nicht, wie der funktioniert, frei hätte ich aktuell die Pins 7 und 8 dafür.

Wie kann ich diesen zweiten Serial erstellen und IHN AUCH ÖFFNEN?

Ich möchte da auf dem Serial2.print nutzen, geht das? (Ich will ihn quasi, wie einen ganz normalen Seriellen Monitor nutzen... Über extra Software geht nichts. Ich habe zumindest schon PuTTY probiert, da öffnet der aber den Port nicht. )

Hier mein bisheriger Code: Blynk braucht halt einen der Seriellen Ports zum funktionieren, was muss ich hier anders machen? (müsst glaube ich nicht zwingend Ahnung von der App haben)

#define BLYNK_PRINT DebugSerial
#include <SoftwareSerial.h>
SoftwareSerial DebugSerial(7, 8); // RX, TX
#include <BlynkSimpleStream.h>
char auth[] = "UnFNS1fIbvFVX8QGBWDoBKah3aWND6dn";
void setup() {   DebugSerial.begin(9600);   Serial.begin(9600);   Blynk.begin(Serial, auth);
//anderer stuff
}
void loop () {
Blynk.run();
//zum Beispiel:
if (Buttongedrückt) {
DebugSerial.println("Button gedrückt");
...stuff
}

MFG Alex - Freue mich auf eure Antworten!

Software, programmieren, Arduino, cmd, C (Programmiersprache), RX, TX, Serielle Schnittstelle

Arduino: millis() als delay() in If-Klause benutzen?

Hi! Ich suche schon lange nach einer Lösung wie ich millis() als delay() benutzen kann. Ich habe einen Bodenfeuchtesensor und ein Relais, das an eine Pumpe angeschlossen wird. Ich möchte, dass das Relais für 10 Sekunden angeht, wenn der Bodenfeuchtesensor einen Wert über 600 ausspuckt. Bisher lautet die If-Klause so:

(siehe unten)

Möchte das aber gerne mit millis() machen. Habe schon viel studiert und probiert, aber keine Lösung gefunden. Nachgelesen habe ich auch. Das Prinzip von millis habe ich verstanden, nur nicht, wie das in einem If-Satz funktioniert.

Vielen Dank für Eure Hilfe!

#include "DHT.h"
#define DHTPIN 12
#define DHTTYPE DHT22

//VENT DELAY//
long schedule_freq = 3200000L;
long schedule_duration = 300000L;


long schedule_timestamp = 0L;
long schedule_timestamp_off = 0L;


bool schedule = false;
//VENT DELAY//


//PUMP//

//PUMP//


const int heatPin = 7;
const int ventPin = 4;
const int pumpPin = 12;


int moist_value = analogRead(A0);

DHT dht(DHTPIN, DHTTYPE);




void setup() {
  dht.begin();
  pinMode(heatPin, OUTPUT);
  pinMode(ventPin, OUTPUT);
}


void loop() {
  float t = dht.readTemperature();
  float h = dht.readHumidity();


  if (t <= 16.0) {
      digitalWrite(heatPin, HIGH);
  }


  if (t >= 25.0) {
    digitalWrite(heatPin, LOW);
  }


  if(moist_value >= 600) {
    digitalWrite(pumpPin, HIGH);
    delay(10000);)
    digialWrite(pumpPin, LOW;
    
    }
    
      if (schedule_timestamp < millis()) {
      schedule_timestamp = millis() + schedule_freq;
        schedule_timestamp_off = millis() + schedule_duration;
        schedule = true;
        //Vent On
        digitalWrite(ventPin, HIGH);
      }
    
    
      if (schedule_timestamp_off < millis() && schedule ) {
      schedule = false;
      //Vent Off
      digitalWrite(ventPin, LOW);
    
    
      }
    
    
    }
Computer, Technik, programmieren, Arduino, Technologie, C (Programmiersprache), If clauses, Arduino Uno, Arduino IDE

Schrittmotor einfach drehen- Arduino?

Seid gegrüßt,

Ich möchte über einen PS2 Controller einfach einen Schrittmotor ansteuern, also sprich ich drücke eine Taste und er dreht solange in diese Richtung, wie die Taste gehalten wird. Nur mit zwei Tasten, für 2 Richtungen, vor und zurück.

Eigentlich Frage: Wie code ich das am Besten?

Also etwa so (mal so erklärend):

if(ps2x.ButtonPressed(PSB_L1)) {
for (drehe dich vorwärts)
solange vorwärts drehen, wie die Taste gehalten wird
}
if(ps2x.ButtonPressed(PSB_R1)) {
for (drehe dich rückwarts)
solange rückwarts drehen, wie Taste gedrückt wird
}

Soweit, so gut. Danke für alle Antworten!

MFG Alex

Hier mein aktueller Code dafür: (ganz unten ist der Part, wo später das mit dem Motor hin soll....)

#include <PS2X_lib.h>  
PS2X ps2x; 
//right now, the library does NOT support hot-pluggable controllers, meaning 
//you must always either restart your Arduino after you connect the controller, 
//or call config_gamepad(pins) again after connecting the controller.
int error = 0; 
byte type = 0;
byte vibrate = 0;
int magenta=2;
int gruen=3;
int blau=4;
int rot=5;
// Stepper Bibliothek hinzufügen
#include <Stepper.h>
// Anzahl der Schritte pro interner Motorumdrehung
const float STEPS_PER_REV = 32; 
// Betrag der Untersetzung
const float GEAR_RED = 64;
// Anzahl der Schritte pro Getriebeausgangrotation
const float STEPS_PER_OUT_REV = STEPS_PER_REV * GEAR_RED;
// Number of Steps Required
int StepsRequired;
// PIN BELEGUNG
// Benutze PINs 8,9,10,11 des Arduinos
// und verbinde diese mit ULN2003 Motor Driver In1, In2, In3, In4 
// Pins, die in der Sequenz 1-3-2-4 für die richtige Schrittsequenzierung eingegeben wurden
Stepper steppermotor(STEPS_PER_REV, 7, 6, 5, 4);
void setup(){
Serial.begin(9600);
error = ps2x.config_gamepad(13,11,10,12, true, true);  //GamePad(clock, command, attention, data, Pressures?, Rumble?) 
if(error == 0){
 Serial.println("Found Controller, configured successful");
 Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");
 Serial.println("holding L1 or R1 will print out the analog stick values.");
 Serial.println("Go to www.billporter.info for updates and to report bugs.");
}
type=1;
error=0;
pinMode(2,OUTPUT);
pinMode(3, OUTPUT); //gruen
pinMode(4, OUTPUT); //blau
pinMode(5, OUTPUT); //rot
}
void loop(){
 /
error=0;
type=1;
if(error == 1) 
 return; 
if(type == 2){ 
 ps2x.read_gamepad();     //read controller 
}
else {
ps2x.read_gamepad(false, vibrate); //Ab hier beginnt der eigentliche loop, davor nur weil es auch type 2- Controller gibt, hier für den richtigen
if(ps2x.ButtonPressed(PSB_L1){
  --->Hier Motor...
}
delay(50);
} 
}
Computer, Technik, PlayStation, Drehung, Arduino, Technologie, C (Programmiersprache), Schrittmotor, Servo

C++ Programmcode nicht ausführbar "willkommen"?

Guten Abend zusammen,

ich habe mir heute das, Kindle eBook C++ Programmieren für Einsteiger geholt, da mich programmieren schon seit langer Zeit sehr interessiert, ich bisher aber zeitlich nicht dazu kam, mich da einzulesen.

Nun zu der Frage: Ich habe all das, was das Buch mir gesagt hat, durchgeführt:

  1. Einen Text-Editor zum Codes schreiben heruntergeladen: Geany (Schreibe jedoch über den normalen, bereits auf Windows 10 vorhandenen Texteditor).
  2. Einen Compiler für die Erstellung der Programme heruntergeladen: MinGW.

Anschließend kam auch schon die erste Aufgabe. Ich sollte mit einem Kommandozeileninterpreter (cmd / Eingabeaufforderung) die Version des MinGW abfragen. Dies musste ich erst in den erweiterten Systemeinstellungen einstellen, indem ich die Umgebungsvariablen anpasse (in PATH den Dateipfad meines MinGW\Bin-Ordner hinzufügen). Das hat auch funktioniert und ich konnte durch die Eingabeaufforderung die Version meines Compilers abfragen.

Nun geht es los, das erste Programm schreiben: Eine einfache Ausgabe auf dem Bildschirm. Ziel ist es, eine kurze Textnachricht auszugeben.

Nun sind die Schritte wie folgt beschrieben:

  1. Texteditor öffnen
  2. Programmcode eingeben
#include <iostream>

int main()
{
  std::cout << "Willkommen zum C++ Kurs!";
}

Nun soll ich die Datei unter dem Namen willkommen.cpp abspeichern, in meinem Fall auf dem Desktop.

Danach geht es um die Ausführung des Programms: Ich muss das Programm mithilfe des Kommandozeileninterpreters (cmd) kompilieren.

  1. cmd öffnen.
  2. Verzeichnis ändern, in dem Fall auf meinen Desktop

Befehl:

g++ -o willkommen willkommen.cpp

(Ich frage mich, warum ich doppelt willkommen eingeben muss, auch wenn meine Datei nur ein willkommen hat? Ich habe es mit nur einem willkommen probiert und es wurde mir ein Fehler angezeigt!)

Wenn ich das so eingebe, kommt eine oder zwei kurze Sekunden ein Ladevorgang und es passiert weiter nichts. Eigentlich steht in dem Buch geschrieben, dass unter meiner Eingabe in der cmd ein "Willkommen im C++ Kurs " erscheinen sollte. Dies ist leider nicht der Fall.

Also an jeden, der sich mein Problem angeschaut hat: Vielen Dank!

Ich habe auf YouTube und anderen Plattformen nach einer Lösung geschaut, jedoch nichts mit der gleichen Ähnlichkeit gefunden.

Computer, Buch, Technik, IT, programmieren, Informatik, Technologie, C (Programmiersprache)

Globale Variablen durch Zeiger ersetzen?

Hallo,

bei der folgenden Programmieraufgabe würde ich gerne die globalen variablen durch Zeiger ersetzten, da man mit den globalen Variablen ja etwas vorsichtig sein sollte.

include include include

double x0; //globale variablen int ok, anzit;

double fct (int fn, double x){ // Funktion fct mit 2 Parametern

double y;

switch (fn) {                                               // switch case funktion zum Auswählen der Funktion
    case 1:     y = sin(x);                     break;
    case 2:     y = exp (x) - 5.0 * x + 1.0;    break;
    case 3:     y = x * x - 2.0;                break;
    case 4:     y = (1.0 / 7.0) + (1.0/x);      break;
    case 5:     y = 2.0 * x - 2.0;              break;
    default:    y = 0.0;                        break;
}
return y;

}

void nullstelle (int fn, double a, double b, double g) { // Prozedur Nullstelle

double fa, fb, fm, m;
                                                                // Verarbeitung der Parameter und Variablen

fa = fct (fn, a);
fb = fct (fn, b);

while ((b-a) > g) {

    m = (a+b) / 2.0;
    fm = fct (fn, m);

    if ((fa*fm) < 0) {
        b = m; fb = fm;
    }

        else {
            a = m; fa = fm;
        }
    anzit++;
}
        x0 = m;
        ok = 1;

}

int main(){ // Hauptprogramm // Fordert den Benutzer auf Befehle einzugeben int fn; double a, b, g;

printf ("1) f(x) = sin (x) \n");
printf ("2) f(x) = e^x - 5x + 1 \n");
printf ("3) f(x) = x^2 - 2 \n");
printf ("4) f(x) = (1/7) + (1/x) \n");
printf ("5) f(x) = 2x - 2 \n");


while (1) {
    printf ("\nWaehlen Sie eine Funktion aus: ");
    scanf ("%d", &fn);

    printf ("Linker Grenzwert: ");
    scanf ("%lf", &a);

    printf ("Rechter Grenzwert: ");
    scanf ("%lf", &b);

while (fct (fn, a) * fct (fn, b) > 0.0){
    printf ("\nf(a) und f(b) haben gleiches Vorzeichen, bitte andere Grenzen eingeben!");
    printf ("\nLinker Grenzwert: ");
    scanf ("%lf", &a);
    printf ("\nRechter Grenzwert: ");
    scanf ("%lf", &b);
    }

    printf ("Genauigkeit: ");
    scanf ("%lf", &g);

    nullstelle (fn, a, b, g);

    if (ok == 1)
        printf ("x0 \t = %.15f\n", x0);
        printf("f(x0) \t = %.15f\n", fct(fn, x0));
        printf("%d Iteration\n", anzit);

}

return 0;

}

programmieren, C (Programmiersprache)

Wie füge ich eine Abfrage Möglichkeit ein in C#, sodass der Nutzer eine ungerade Zahl eingibt und sich dadurch das "Rautenerstellungsprogramm" auslöst s.u.?

Hallo Zusammen,

ich habe ein ansatzweises Programm fertigstellen können es funktioniert aber nicht ganz so wie ich es haben wollte (Ich bin noch Anfänger in Programmiersprachen) unten hänge ich mal das Programm an. Ich habe dabei mehrere Probleme zum einen will ich eine Nutzerabfrage einbauen (Konsolen Applikation) wo der Nutzer eine ungerade Zahl eingeben soll wo durch jeweils eine unterschiedliche Raute ausgegeben werden soll.

Und zum Anderen will ich noch herausfinden wie ich es hinbekomme das die Angezeigete Raute einerseits innen leer ist und andererseits das Programm nicht endlos Zeilen ausspuckt die ich in meinem Programm nicht brauchen kann.

Hier nun noch das was ich versuchsweise bisher geschrieben habe (Es handelt sich dabei um die Aufarbeitung einer Klassenarbeit aus JAVA die ich nun in C# eingenhändig schreiben soll):

namespace Klassenarbeit_Aufgabe_2 { public class Program { public static void Main(string[] args) { Console.WriteLine("Bitte geben Sie eine ungerade Zahl ein: "); string Zahl = Console.ReadLine();

            int LeerzeichenG, LeerzeichenRL, BREITE = 9;
            for (int x = 1; x <= BREITE; x = x + 2)
            {
                LeerzeichenG = BREITE - x;
                LeerzeichenRL = LeerzeichenG / 2;

                for (int lz = 0; lz < LeerzeichenRL; lz++)
                {
                    Console.Write(" ");

                }

                for (int xse = 0; xse < x; xse++)
                {
                    Console.Write("*");

                }

                for (int lz = 0; lz < LeerzeichenRL; lz++)
                {
                    Console.Write(" ");

                }
                Console.Write("\n");

            }

            for (int x = 9; x <= BREITE; x = x - 2)
            {
                LeerzeichenG = BREITE - x;
                LeerzeichenRL = LeerzeichenG / 2;

                for (int lz = 0; lz < LeerzeichenRL; lz++)
                {
                    Console.Write(" ");

                }

                for (int xse = 0; xse < x; xse++)
                {
                    Console.Write("*");

                }

                for (int lz = 0; lz < LeerzeichenRL; lz++)
                {
                    Console.Write(" ");

                }

                Console.Write("\n");

            }
            Console.ReadLine();
    } 
}

}

Für jegwede Hilfe oder Anregung wäre ich schon dankbar.

Mit freundlichen Grüßen

MJH92

Computer, C (Programmiersprache), Spiele und Gaming

Probleme mit C-Programmierung: Zahlen sortieren?

Hallo, ich habe folgendes Programm geschrieben und komme einfach nicht weiter. Das Programm zählt die Buchstaben einer .txt Datei und gibt ebenso deren Häufigkeit an. Ich soll jetzt noch die Anzahl der Buchstaben beginnen mit der größten Zahl sortieren. Die Buchstaben müssen dabei auch stimmen und natürlich die Häufigkeit. Kann mir jemand dabei helfen?

So weit bin ich gekommen, eine Beispiel txt Datei wurde implementiert. Ich programmiere mit Codeblocks.


#include <stdio.h>
include

char dateiname[40]; int anweisung1;

int main(int argc, char **argv) { if (argc != 2) { printf("Der Dateiname fehlt\n"); return 0; }

FILE *fp = fopen(argv[1], "r");
if (fp == NULL)
{
    printf("Die Datei kann nicht geoeffnet werden\n");
    return 0;
}

double anzahl[26] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int gesamt = 0;


while (1) //Zähschleife
{
    int buchstaben = fgetc(fp);
    if (buchstaben < 0)
    {
        break;
    }
    if (buchstaben >= 'A' && buchstaben <= 'Z') //Zählschleife für Großbuchstaben
    {
        anzahl[buchstaben - 'A']++;
        gesamt++;
    }
    else if (buchstaben >= 'a' && buchstaben <= 'z')
    {
        anzahl[buchstaben - 'a']++; //Zähschleife für Kleinbuchstaben
        gesamt++;
    }
}


fclose(fp);

int anweisung;
printf("Dieses Programm zaehlt die die Buchstaben in einer .txt Datei\nund gibt die Haeufigkeit der Buchstaben an\n");
printf("Sie haben jetzt die Auswahl zwischen:\n");
printf("1. Die .txt Datei mit printf in der Konsole auszugeben\n");
printf("2. Eine neue .txt Datei zu speichern\n\n");
scanf("%d", &anweisung);

switch(anweisung)
{
case 1:
    printf("Die Gesamtzahl der Buchstaben lautet: %d\n",gesamt);

    int i;
    for (i = 0; i < 26; i++)
    {
        printf("%c : %0.lf", (i + 'A'), anzahl[i]);
        double prozente = anzahl[i]*100/gesamt;
        printf("\tHaeufigkeit: %.2lf%%\n",prozente);
    }
    return 0;

case 2:

    printf("\nBitte geben Sie den Dateinamen mit .txt an:\n\n");
    scanf("%s", dateiname);
    printf("\nIhre Datei heisst: %s.\n", dateiname);

    FILE* fp;
    fp = fopen(dateiname,"w");
    fprintf(fp,"Die Gesamtzahl der Buchstaben lautet: %d\n",gesamt);

    for (i = 0; i < 26; i++)
    {
        fprintf(fp,"%c : %0.1f\t  ", (i + 'A'), anzahl[i]);
        double prozente = anzahl[i]*100/gesamt;
        fprintf(fp,"Haeufigkeit: %.2lf%%\n",prozente);
    }
    return 0;
    fclose(fp);
}

}

programmieren, C (Programmiersprache), codeblocks

Meistgelesene Beiträge zum Thema C (Programmiersprache)