Ich habe leider ein Problem mit dem Arduino Uno. Programmieren mache ich mit PlatformIO und das klappt auch ganz gut. Von Arduino programmieren habe ich jetzt nicht viel schimmer, weswegen mir schon ein paar Fehler unterlaufen sind. Unter anderem, dass die Inputs wie aktiv auf low oder mit dem internen PullUp Widerstand verwendet werden müssen.
Jedenfalls habe ich an dem Arduino zwei Potis, drei Schalter, einen 128x64 Display, eine Batterie Anzeige über TM1651 und 16 Leds angesteuert über zwei 74HC595.
Es funktioniert eigentlich alles ganz prima, aber jetzt an einer Stelle wurde es sehr kniffelig. Ich habe gemerkt, dass der Eingang rauscht und wollte ihn mit einem PT1 Glied glätten. Deswegen kurz eine Klasse PT1 geschrieben und den Eingang eines Potis damit geglättet. Jetzt wollte ich noch den zweiten Poti damit glätten und der Arduino verabschiedet sich. Jetzt habe ich ein wenig rumprobiert und mir ist aufgefallen, dass der Arduino sich nur verabschiedet wenn ich zwei PT1 Objekte erzeuge. Bei einem PT1 Objekt funktioniert alles Klasse. Es geht sogar soweit, dass wirklich nur das erzeugen ausreicht, dass der Arduino sich irgendwo in der setup() Funktion aufhängt. Irgendwo unter "Battery_display.soc(50);" Ich hab keinen Schimmer wieso und hoffe hier auf Hilfe. Mir geht es auch wirklich darum zu diesem Thema Hilfe zu bekommen, um das Verhalten nachvollziehen zu können.
die main.cpp:
#include <Arduino.h>
#include "LedLightStateMachine.h"
#include "Battery.h"
#include "Disp.h"
#include "PT1.h"
#include "TM1651.h"
const int PIN_SHIFT = 3; // connected to SHCP
const int PIN_STORE = 4; // connected to STCP
const int PIN_DATA = 5; // connected to DS
const int LED_LIGHTS_SWITCH = 2; // on off led lights
const int LED_LIGHTS_SWITCH1 = 6; // on off led lights
const int LED_LIGHTS_SWITCH2 = 7; // on off led lights
const int LED_LIGHTS_DELAY = A0; // on off led lights
unsigned long Led_interval = 10;
unsigned long Led_last_change = 0;
const int PIN_BATTERY_CLK = 9;
const int PIN_BATTERY_DIO = 8;
const int PIN_BATTERY_STATE = A1;
LedLightStateMachine Leds(PIN_SHIFT,PIN_STORE,PIN_DATA);
Battery Battery_display(PIN_BATTERY_CLK,PIN_BATTERY_DIO);
//PT1 Pt1_Battery(1.0);
PT1 Pt1_Led_speed(50.0);
#include <SPI.h>
#include <Wire.h>
Disp Display(-1, &Wire);
void setup()
{
pinMode(PIN_STORE, OUTPUT);
pinMode(PIN_SHIFT, OUTPUT);
pinMode(PIN_DATA, OUTPUT);
pinMode(LED_LIGHTS_SWITCH, INPUT_PULLUP);
pinMode(LED_LIGHTS_SWITCH1, INPUT_PULLUP);
pinMode(LED_LIGHTS_SWITCH2, INPUT_PULLUP);
pinMode(LED_LIGHTS_DELAY, INPUT);
pinMode(PIN_BATTERY_CLK, OUTPUT);
pinMode(PIN_BATTERY_DIO, OUTPUT);
pinMode(PIN_BATTERY_STATE, INPUT);
Battery_display.on();
Battery_display.soc(50);
Led_last_change = millis();
Leds.set_mode(RUNNING);
Leds.start();
Display.init();
delay(500);
//Serial.begin(9600);
}
void loop ()
{
//Serial.println("start into loop");
// LED STATUS
Display.update_led_status(digitalRead(LED_LIGHTS_SWITCH));
Display.update_led_mode(digitalRead(LED_LIGHTS_SWITCH1), digitalRead(LED_LIGHTS_SWITCH2));
int Led_interval_read = analogRead(LED_LIGHTS_DELAY);
int Led_interval_read_PT1 = Pt1_Led_speed.get(Led_interval_read); //Led_interval_read;
int Led_interval_temp = (map(Led_interval_read_PT1,0,1023,0,1000) * map(Led_interval_read_PT1,0,1023,0,1000))/(1000); // nihct lineare Kurve
Led_interval = min(30 + Led_interval_temp,999);
Display.update_led_speed(Led_interval);
if (millis() - Led_last_change > Led_interval){
Leds.update();
Led_last_change = millis();
}
// BATTERIE STATUS
int level = analogRead(PIN_BATTERY_STATE);
int level2 = level; //Pt1_Battery.get(level);
Battery_display.soc(map(level2,0,1023,100,0));
Display.update_battery_level(map(level2,0,1023,100,0));
//Display.on();
}
Die PT1.h
// PT1.h
#ifndef PT1_H
#define PT1_H
class PT1{
public:
PT1(double T1);
int get(int u);
private:
double tau;
int y;
unsigned long delta_t;
};
#endif
Die PT1.cpp
#include "PT1.h"
#include <Arduino.h>
PT1::PT1(double T1) : tau(T1)
{
delta_t = millis();
y = 0;
}
int PT1::get(int u)
{
if (millis() - delta_t < 10)
return y;
double delta = double(millis() - delta_t);
double val = double(y) + double(u - y) * delta/(tau + delta);
y = int(val);
delta_t = millis();
return y;
}
Würde ich jetzt //PT1 Pt1_Battery(1.0);
in der main.cpp auskommentieren, dann schmiert das Programm ab. Nur das auskommentieren reicht schon.
Vielen Dank für eure Hilfe