Wie kann ich einen Takt von 50kHz mit dem Arduino Mega2560 erzeugen?

Hallo zusammen,

Wie oben schon beschrieben die Frage, wie ich einen Takt von 50kHz mit dem Arduino Mega2560 erzeugen kann.

Das ist mein derzeitiger Sketch:

const int outputPin = 5;  // digitale Ausgangspin
unsigned long startTime;   // Variable zur Speicherung des Startzeitpunkts


void setup() {
  pinMode(outputPin, OUTPUT);  // Setzen des Pin als Ausgang
  Serial.begin(9600);  // Starten der serielle Kommunikation mit 9600 Baud
}


void loop() {
  // Einschaltphase messen
  startTime = micros();  // Aktuelle Zeit speichern
  digitalWrite(outputPin, HIGH);  // Pin auf HIGH
  delayMicroseconds(10);  // Warten für die halbe Periode (T_high)
  unsigned long onTime = micros() - startTime;  // Berechnen Sie die Einschaltzeit in Mikrosekunden


  // Ausschaltphase messen
  startTime = micros();  // Aktuelle Zeit speichern
  digitalWrite(outputPin, LOW);  // Pin auf LOW 
  delayMicroseconds(10);  // Warten für die andere halbe Periode (T_low)
  unsigned long offTime = micros() - startTime;  // Berechnen der Ausschaltzeit in Mikrosekunden


  // Ausgabe der gemessenen Zeiten
  Serial.print("Einschaltzeit: ");
  Serial.print(onTime);
  Serial.print(" µs  ----  ");
  Serial.print("Ausschaltzeit: ");
  Serial.print(offTime);
  Serial.println(" µs");


  delay(1000);  // Eine Sekunde warten, bevor der nächste Zyklus beginnt
}


// Soll Periodendauer = 20µs -> f = 50kHz

Leider erhalte ich mit diesem Code folgende Ausgabe:

Einschaltzeit: 20 µs  ----  Ausschaltzeit: 16 µs
Einschaltzeit: 16 µs  ----  Ausschaltzeit: 20 µs
Einschaltzeit: 16 µs  ----  Ausschaltzeit: 20 µs
Einschaltzeit: 16 µs  ----  Ausschaltzeit: 20 µs
Einschaltzeit: 20 µs  ----  Ausschaltzeit: 16 µs
Einschaltzeit: 16 µs  ----  Ausschaltzeit: 20 µs
Einschaltzeit: 16 µs  ----  Ausschaltzeit: 20 µs
Einschaltzeit: 16 µs  ----  Ausschaltzeit: 20 µs
Einschaltzeit: 20 µs  ----  Ausschaltzeit: 20 µs
Einschaltzeit: 16 µs  ----  Ausschaltzeit: 16 µs
... usw.

Mir ist klar, das der Controller durch die Funktion Serial.print() und auch die delayMicroseconds() zeit verbraucht.

Gibt es aber eine möglichkeit möglichst genau einen Takt von 50kHz mit dem Arduino zu erzeugen?

Vielen Dank!

Computer, programmieren, Elektrik, Arduino, Physik, Sketch, arduino mega
Arduino und ESP8266 Fehler?

Hi, ich habe den Wifichip an den Arduino angeschlossen, wie hier:

Ich habe die Bibliotheken importiert und als Board auch bei Tools > Board > ESP8266 > Arduino gewählt. Wenn ich aber diesen Code hochlade :

#include <Adafruit_NeoPixel.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>


#define NUM_STRIPS 5
#define LED_PER_STRIP 60


const char* ssid = "#######";
const char* password = "########";


Adafruit_NeoPixel strips[NUM_STRIPS];
ESP8266WebServer server(80);


void setup() {
  Serial.begin(115200);


  // WLAN-Verbindung herstellen
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Verbindung zum WLAN herstellen...");
  }
  Serial.println("Verbunden mit WLAN");


  // Lichtstreifen initialisieren
  int stripPins[NUM_STRIPS] = {2, 3, 4, 5, 6}; // An Ihre Verkabelung anpassen



  for (int i = 0; i < NUM_STRIPS; i++) {
    strips[i] = Adafruit_NeoPixel(LED_PER_STRIP, stripPins[i]);
    strips[i].begin();
    strips[i].show();
  }


  // Webserver-Routen festlegen
  server.on("/", HTTP_GET, handleRoot);
  server.on("/led/on", HTTP_GET, handleLedOn);
  server.on("/led/off", HTTP_GET, handleLedOff);
  server.on("/led/color", HTTP_GET, handleLedColor);
  server.on("/led/brightness", HTTP_GET, handleLedBrightness);


  server.begin();
  Serial.println("Webserver gestartet");
}


void loop() {
  server.handleClient();
}


void handleRoot() {
  server.send(200, "text/html", "Willkommen bei der Lichtstreifen-Steuerung");
}


void handleLedOn() {
  int stripIndex = server.arg("strip").toInt();
  if (stripIndex >= 0 && stripIndex < NUM_STRIPS) {
    strips[stripIndex].fill(strips[stripIndex].Color(255, 255, 255));
    strips[stripIndex].show();
    server.send(200, "text/plain", "Lichtstreifen eingeschaltet");
  } else {
    server.send(400, "text/plain", "Ungültiger Streifenindex");
  }
}


void handleLedOff() {
  int stripIndex = server.arg("strip").toInt();
  if (stripIndex >= 0 && stripIndex < NUM_STRIPS) {
    strips[stripIndex].clear();
    strips[stripIndex].show();
    server.send(200, "text/plain", "Lichtstreifen ausgeschaltet");
  } else {
    server.send(400, "text/plain", "Ungültiger Streifenindex");
  }
}


void handleLedColor() {
  int stripIndex = server.arg("strip").toInt();
  int r = server.arg("R").toInt();
  int g = server.arg("G").toInt();
  int b = server.arg("B").toInt();


  if (stripIndex >= 0 && stripIndex < NUM_STRIPS) {
    strips[stripIndex].fill(strips[stripIndex].Color(r, g, b));
    strips[stripIndex].show();
    server.send(200, "text/plain", "Lichtfarbe aktualisiert");
  } else {
    server.send(400, "text/plain", "Ungültiger Streifenindex");
  }
}


void handleLedBrightness() {
  int stripIndex = server.arg("strip").toInt();
  int brightness = server.arg("brightness").toInt();


  if (stripIndex >= 0 && stripIndex < NUM_STRIPS) {
    strips[stripIndex].setBrightness(brightness);
    strips[stripIndex].show();
    server.send(200, "text/plain", "Helligkeit aktualisiert");
  } else {
    server.send(400, "text/plain", "Ungültiger Streifenindex");
  }
  }

Kommt immer diese Fehlermeldung:

. Variables and constants in RAM (global, static), used 29040 / 80192 bytes (36%)
║   SEGMENT  BYTES    DESCRIPTION
╠══ DATA     1504     initialized variables
╠══ RODATA   1320     constants       
╚══ BSS      26216    zeroed variables
. Instruction RAM (IRAM_ATTR, ICACHE_RAM_ATTR), used 60527 / 65536 bytes (92%)
║   SEGMENT  BYTES    DESCRIPTION
╠══ ICACHE   32768    reserved space for flash instruction cache
╚══ IRAM     27759    code in IRAM    
. Code in flash (default, ICACHE_FLASH_ATTR), used 271296 / 1048576 bytes (25%)
║   SEGMENT  BYTES    DESCRIPTION
╚══ IROM     271296   code in flash   
esptool.py v3.0
Serial port COM3
Connecting........_____....._____....._____....._____....._____....._____....._____


A fatal esptool.py error occurred: Failed to connect to ESP8266: Timed out waiting for packet header

Ich habe es auch schon versucht mit den Anschluss Flash in GND beim Arduino, hilf aber nicht

Weiß jemand was ich tun kann?

Vg Tmm

Bild zum Beitrag
Fehler, programmieren, Arduino, Script, Platine, ESP8266, Arduino IDE
Arduino Thermistor --- analog PIN zu Temperatur?

Hallo,

Ich arbeite momentan daran mit dem Arduino einen Thermometer zu bauen. Jedoch bekomme ich es nicht her, die richtigen Werte herauszubringen. Ich verwende einen Spannungsteiler. Auf der einen Seite ein Thermistor - ist verbunden mit A0 und 3.3V und dann ein 1000 Ohm Widerstand mit Verbindungen zu A0 und GND. Ich habe einen Arduino UNO R3 und ein MF52D3950 Thermistor. Was stimmt mit meinem Code nicht? Der Widerstand des Thermistors (im Code R2) sollte ca. 9200 Ohm betragen, ist aber immer zwischen 118 und 120. An was liegt das? Ich bin da schon 5 Stunden dran. Also BITTE helft mir.

Vielen Dank im Voraus!

LG

//www.elegoo.com
//2016.12.9
#include <math.h>
#include <LiquidCrystal.h>
//        BS E D4 D5 D6 D7
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
void setup() {
 Serial.begin(9600);
}
// This is OK
int analogPin= 0;
int raw= 0;
int Vin= 3.3; //volts input
float Vout= 0; // unknown voltage, we have to measure
float R2= 0; // Unknown resistance, we have to measure
float T1 = 26 + 273.15; //reference temperature
float R1 = 9040; //reference resistance
float T2 = 0; //searched temperature
float B = 3950; //B value resistor
float R_REF = 1000; //reference resistor Spannungsteiler Wert
void loop() {
 raw = analogRead(analogPin); //liest BIT-Wert für Spannung aus, welcher zum feststellen der Temperatur nötig ist
 Vout= (raw * 5)/(1024.0);
 R2 = R_REF / ((Vin / Vout) - 1);
 T2 = (B*T1*(-1))/(T1*log(R1/R2)-B)-273.15; //berechnet Temperatur
 
 Serial.print("raw:");
 Serial.println(raw);
 Serial.print("Vout:");
 Serial.println(Vout);
 Serial.print("R2:");
 Serial.println(R2);
 Serial.print("T2:");
 Serial.println(T2);
}
Elektrik, Spannung, Arduino, Elektrizität, LED, Physik, Schaltung, Widerstand, Arduino IDE
Arduino - Musik abspielen und gleichzeitig LEDs steuern?

In meinem Projekt möchte ich mit einem Elegoo Uno R3 einen mini DVPlayer von AZDelivery (MP3-Player auf kleiner Platine) bedienen und einen Song abspielen.

Gleichzeitig sollen zwei LEDs nach einem Muster blinken.

Ist soviel Multitasking mit irgendeinem Workaround möglich?

Hier der Code, wie müsste ich das mit den LEDs einpflegen?

/***************************************************


DFPlayer - A Mini MP3 Player For Arduino
 <https://www.dfrobot.com/product-1121.html>


#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"


SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);


void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
  
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
  
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));

    while(true){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));
  
  myDFPlayer.volume(30); // Set volume 0-30
  myDFPlayer.play(1);  //Play first mp3
}


void loop()
{
  static unsigned long timer = millis();
  
  if (millis() - timer > 3000) {
    timer = millis();
 //   myDFPlayer.next();  //Play next mp3 eve 
  }
  
  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); 
  }
}


void printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
}


Arduino, Arduino Uno, Elegoo
ESP8266 mit OLED Display?

Ich habe ein ESP8266 Developer Board, und möchte damit ein OLED-Display steuern (.94", 128x64px).

Ich finde nur Tutorials für Displays mit einem I2C-Protokoll, da hat das Display die Pins GND, VCC, SCL und SDA. Ich habe die Pins GND, VDD, SCK und SDA.

Laut meiner Recherche ist das ein SPI-Protokoll. Wenn ich dafür nach Tutorials suche, finde ich nur welche für Displays mit 6 Pins.

Mein Code (von einem I2C Tutorial) benutzt die Adafruit SDD1306 Library, keine Ahnung ob die nur mit I2C oder auch mit ISP funktioniert.

Wenn ich mit einem I2C Scanner die Screen Address suche, findet es das Display nicht.

Meine Schaltung:

OLED GND --> Chip GND

OLED VDD --> Chip 3V3

OLED SCK --> Digital IO 1

OLED SDA --> Digital IO 2

Kann ich einfach die ISP Adresse in den Code einfügen, und wenn ja wie finde ich diese? Oder brauch ich ganz anderen Code / Schaltung?

Code:

 #include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels


// Declaration for SSD1306 display connected using I2C
#define OLED_RESET     -1 // Reset pin
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


void setup() {
  Serial.begin(9600);
  display.clearDisplay(); //Clear
  
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,28);
  display.println("Hello world!");
  display.display();
  delay(2000);
}


void loop() {
  delay(1000);
}

Display (Ich weiß dass die Schutzfolie noch drauf ist):

Bild zum Beitrag
Display, Technik, programmieren, Arduino, ISP, ESP8266

Meistgelesene Beiträge zum Thema Arduino