interessant, könntest das etwas ausführen? mich würd besonders interessiern, wie du promptest wenn es darum geht, dass mehrere module / klassen in eine architektur zusammengehören. einzelne "bitte schreib mir algo X" kann ich mir noch vorstellen, aber bei ganzen modulen hört meine kreativität auf...
Bei mir handelt es sich meistens um nur sehr kleine Projekte, wo man mit Überzeugung GPT noch dazu bringen kann sie auszuführen. Ab einer gewissen Größe muss man aber stark aufteilen anfangen.
Verwende GPT4 mit Seach und VoxScript/DEV Cummunity/Wolfram plugins.
Ich scheue mich leider sehr konkrete Beispiel zu posten. Aber nehme einfach einmal eine klasse von dir her, erkläre die Funktion und dass diese gleich bleiben muss, dann füge folgende Aufforderungen hinzu.
Try to optimize the code as much as possible and make it as efficient as possible, follow good coding guidelines like:
- comment even if it seems too much, comment everything
- use error handling
- Use good Code Refactoring
- Try to comment much as possible
- Try to write the code as efficient as possible
- Add values that need to be adjusted to the top of the code, for example, smoothing samples
- Write the code elegant and readable, comment a lot
- Name variables in context to the project
Und ja, das mehrfach Wiederholen von "comment a lot" zahlt sich aus, es wird dann wirklich alles kommentiert.
Um die effizientest Methode für gewisse Sachen zu finden, verwende ich gerne tree of tought
https://www.allabtai.com/the-tree-o...rompt-template/ .
Was auch wichtig ist, immer "This is the current code: ..." anzuhängen, weil er nach langen Konversationen verwirrt wird und eventuell code einfach droppt.
Meisten teile ich den Code zuerst auf z.b WiFi send/receive, noisy potentiometer lesen, etc., dann frage ich das er jeweils 5 Methoden auflisten soll, welche das beste Resultat nach specification liefern kann und warum diese die beste Wahl wären.
Mit den ausgewählten code/Methode, fahre ich dann nochmals mehrfach darüber, wie er weiterhin verbesser und optimiert werden kann.
Wenn ich dann alle einzelnen Funktionen maximal optimiert habe, füge ich diese zusammen, und lasse ihn dann nochmals drüberschauen, ob er Verbesserungsvorschläge hätte.
Mit manchen Projekten hatte ich damit extrem gute Ergebnisse, bei andern bin ich klaglos gescheitert, liegt aber auch daran, dass es sich bei dem gescheiterten Projekt eher um eine Nischensache und Programmiersprache handelt.
Ein 100% GPT code Beispiel, welche ein kleiner Teil von einem Projekt ist. Der Input ist extrem noisy, muss aber extrem präzise sein, wenn man wirklich am potty dreht. Aber darf auf keinen Fall werte übertragen, wenn man nichts damit macht:
// Including necessary library
#include <algorithm>
// Configuration parameters (change these as needed)
const int POT_NUM = 5; // Number of potentiometers
const int READINGS_NUM = 7; // Number of readings for median filter
const int RESOLUTION = 4095; // ADC resolution
const int POT_PINS[POT_NUM] = { 34, 35, 32, 33, 36 }; // Potentiometer pins
const int DEADBAND = 30; // Deadband for idle detection
// Variable declarations
uint16_t pots[POT_NUM][READINGS_NUM] = { 0 }; // Holds all readings for each potentiometer
uint8_t potIdx[POT_NUM] = { 0 }; // Current index for each potentiometer
uint16_t lastReportedValue[POT_NUM] = { 0 }; // Last reported value for each potentiometer
int sumOfDifferences[POT_NUM] = { 0 }; // Cumulative sum of differences for each potentiometer
bool zeroReported[POT_NUM] = { false }; // Has zero value been reported for each potentiometer
bool maxReported[POT_NUM] = { false }; // Has max value been reported for each potentiometer
void setup() {
// Begin serial communication at 115200 baud rate
Serial.begin(115200);
// Set the resolution of the ADC
analogReadResolution(12);
// Configure the pin mode for each potentiometer and read the initial values
for (int i = 0; i < POT_NUM; i++) {
pinMode(POT_PINS[i], INPUT);
lastReportedValue[i] = analogRead(POT_PINS[i]);
}
}
// Function to calculate the median filtered value for a new reading
uint16_t medianFilter(uint16_t newReading, int potNum) {
// Store the new reading in the current index
pots[potNum][potIdx[potNum]] = newReading;
// Increment the index and wrap around if necessary
potIdx[potNum] = (potIdx[potNum] + 1) % READINGS_NUM;
// Copy the readings and sort them
uint16_t sortedReadings[READINGS_NUM];
memcpy(sortedReadings, pots[potNum], READINGS_NUM * sizeof(uint16_t));
std::sort(sortedReadings, sortedReadings + READINGS_NUM);
// Return the median value
return sortedReadings[READINGS_NUM / 2];
}
// Helper function to print reading
void printReading(int i, uint16_t reading) {
Serial.print("Potentiometer ");
Serial.print(i);
Serial.print(": ");
Serial.println(reading);
}
void loop() {
for (int i = 0; i < POT_NUM; i++) {
// Read the current value of the potentiometer
uint16_t reading = analogRead(POT_PINS[i]);
// Filter the reading using a median filter
uint16_t filteredReading = medianFilter(reading, i);
// Calculate the index of the previous reading
int prevIdx = (potIdx[i] - 1 + READINGS_NUM) % READINGS_NUM;
// Calculate the difference between the current and last reported value
int currentDifference = abs(filteredReading - lastReportedValue[i]);
// Update the sum of differences
sumOfDifferences[i] += currentDifference;
sumOfDifferences[i] -= abs(pots[i][potIdx[i]] - pots[i][prevIdx]);
// Determine if the potentiometer is idle
bool isIdle = sumOfDifferences[i] < DEADBAND;
// Determine if the current value should be reported
bool shouldReport = (!isIdle || currentDifference > DEADBAND) && filteredReading != lastReportedValue[i];
// If the current reading is zero, or 4095 and it hasn't been reported yet
// or the value has significantly changed
if ((filteredReading == 0 && !zeroReported[i]) || (filteredReading == RESOLUTION && !maxReported[i]) || shouldReport) {
// Reset flags as needed
if (lastReportedValue[i] == 0) {
zeroReported[i] = false;
}
if (lastReportedValue[i] == RESOLUTION) {
maxReported[i] = false;
}
if (filteredReading == 0) {
zeroReported[i] = true;
}
if (filteredReading == RESOLUTION) {
maxReported[i] = true;
}
// Update the last reported value
lastReportedValue[i] = filteredReading;
// Reset the sum of differences
sumOfDifferences[i] = 0;
// Print the reading
printReading(i, filteredReading);
}
}
}