Mimo że ChatGPT istnieje już od kilka lat, dotychczas nie przyszło mi głowy skorzystać z niego dla tworzenia oprogramowania do Arduino. Opracując syntezator częstotliwości dla radiostacji typu Citizen Band na podstawie układu scalonego si5351 już napisałem kiedyś odpowiedni sketch, ale zgubiłem plik gdzieś na dysku twardym, na którym mam prawdziwy bałagan. Więc, zamiast tracić czas na wyszukiwanie pliku lub opracowania sketchu od podstaw postanowiłem skorzystać z AI. Zajmowało to prawie 1 minutę i byłem zaskoczony rezultatem.
Moje zadanie wyglądało następująco: potrzebuję sterowanie licznikiem na Arduino od zera do 40 za pomocą dwóch przycisków up-down wyświetlacz TM1637. AI za kilka sekund zaproponował mi ten plik:
Trochę się pomyliłem, bo ma być nie od zera, lecz od jedynki. Ale to można lekko poprawić — if (counter > 1) zamiast if (counter > 0), oraz if (counter < 1) zamiast if (counter < 0) Oprócz tego można ustawić numer kanału po włączeniu — int counter = 0; // Zmienna przechowująca wartość licznika. Po załadowaniu do Arduino licznik działał bez zarzutów.
Teraz zostaje tylko opracować dodatek do sketchu, gdzie numer kanału będzie odpowiadał za określona częstotliwość i przekazywać te dane do si5153. Też mam odpowiedni sketch, ale nie pamiętam gdzie i na którym z laptopów. Więc znów spróbuję skorzystać z AI.
Tym razem AI zmienił sposób podłączenia przycisków. Ale to nie jest aż tak istotnie, chociaż wymaga dwóch dodatkowych rezystorów. Nie wiem, na czym polega taka decyzja AI i jak na razie nie chcę na tym się skupić. Mnie zależy tylko na tym, żeby działało. I z tym nie ma problemów. Zostało to tylko podłączyć między sobą. Później chcę dodać zegar, żeby po wyłączeniu stacyjki wyświetlacz pokazywał czas (oczywiście zasilanie na syntezatorze zostaje cały czas).
Wynik — AI świetnie się nadaje do stworzenia nie bardzo skomplikowanego oprogramowania. Ewentualnie nawet może dać redę ze skomplikowanymi. Problem polega tylko na tym, żeby podać mu konkretne zadanie. Ale współpracując z programistami, robimy to samo.
Nawet AI ma więcej zalet, bo wie dużo więcej niż przeciętny programista. Np. opracując odbiornik do NavTex, miałem wyjaśnić do bardzo doświadczonego programisty zasady działania tego systemu odbioru informacji pogodowej i to trochę trwało. AI "zna" ten system od podstaw. Drugim atutem współpracy z AI jest dyspozycja. On nie musi prowadzić dziecko do szkoły, nie choruje i nie pije, nawet nie śpi. Dla tego można mu wybaczyć, jeżeli kod się okazuje na pare bajtów większy niż stworzony przez człowieka.
Nie wykluczam, że kod opracowany przez AI jest lepszy od stworzonego przez człowieka. Bo AI lepiej zna się na sposobie "myślenia" maszyny niż człowiek. Moim zdaniem AI radzi sobie lepiej z kodami maszynowymi niż z tłumaczeniami tekstów w językach obcych człowieka.
Moje zadanie wyglądało następująco: potrzebuję sterowanie licznikiem na Arduino od zera do 40 za pomocą dwóch przycisków up-down wyświetlacz TM1637. AI za kilka sekund zaproponował mi ten plik:
#include <TM1637Display.h>
#define CLK 2 // Pin zegara (Clock)
#define DIO 3 // Pin danych (Data)
TM1637Display display(CLK, DIO);
#define BUTTON_UP 4 // Pin przycisku do góry
#define BUTTON_DOWN 5 // Pin przycisku w dół
int counter = 0; // Zmienna przechowująca wartość licznika
void setup() {
pinMode(BUTTON_UP, INPUT);
pinMode(BUTTON_DOWN, INPUT);
// Inicjalizacja wyświetlacza TM1637
display.setBrightness(7); // Ustaw jasność wyświetlacza (od 0 do 7)
}
void loop() {
// Sprawdź, czy przycisk do góry został naciśnięty
if (digitalRead(BUTTON_UP) == HIGH) {
delay(50); // Debouncing (zapobieganie drganiom przycisku)
if (digitalRead(BUTTON_UP) == HIGH) {
incrementCounter();
}
}
// Sprawdź, czy przycisk w dół został naciśnięty
if (digitalRead(BUTTON_DOWN) == HIGH) {
delay(50); // Debouncing
if (digitalRead(BUTTON_DOWN) == HIGH) {
decrementCounter();
}
}
// Wyświetl aktualną wartość licznika
display.showNumberDec(counter);
// Dodaj opóźnienie, aby uniknąć częstego odświeżania
delay(100);
}
void incrementCounter() {
if (counter < 40) {
counter++;
}
}
void decrementCounter() {
if (counter > 0) {
counter--;
}
}
Trochę się pomyliłem, bo ma być nie od zera, lecz od jedynki. Ale to można lekko poprawić — if (counter > 1) zamiast if (counter > 0), oraz if (counter < 1) zamiast if (counter < 0) Oprócz tego można ustawić numer kanału po włączeniu — int counter = 0; // Zmienna przechowująca wartość licznika. Po załadowaniu do Arduino licznik działał bez zarzutów.
Teraz zostaje tylko opracować dodatek do sketchu, gdzie numer kanału będzie odpowiadał za określona częstotliwość i przekazywać te dane do si5153. Też mam odpowiedni sketch, ale nie pamiętam gdzie i na którym z laptopów. Więc znów spróbuję skorzystać z AI.
#include <TM1637Display.h>
#include "Si5351.h"
#define CLK_TM1637 2 // Pin zegara TM1637
#define DIO_TM1637 3 // Pin danych TM1637
TM1637Display display(CLK_TM1637, DIO_TM1637);
#define BUTTON_UP 4 // Pin przycisku do góry
#define BUTTON_DOWN 5 // Pin przycisku w dół
int counter = 0; // Zmienna przechowująca wartość licznika
#define SI5351_CLK_PIN 13
#define SI5351_DATA_PIN 11
#define SI5351_RESET_PIN 10
Si5351 si5351;
void setup() {
pinMode(BUTTON_UP, INPUT);
pinMode(BUTTON_DOWN, INPUT);
// Inicjalizacja wyświetlacza TM1637
display.setBrightness(7); // Ustaw jasność wyświetlacza (od 0 do 7)
// Inicjalizacja syntezatora Si5351
si5351.init(SI5351_CLK_PIN, SI5351_DATA_PIN, SI5351_RESET_PIN);
}
void loop() {
// Sprawdź, czy przycisk do góry został naciśnięty
if (digitalRead(BUTTON_UP) == HIGH) {
delay(50); // Debouncing (zapobieganie drganiom przycisku)
if (digitalRead(BUTTON_UP) == HIGH) {
incrementCounter();
}
}
// Sprawdź, czy przycisk w dół został naciśnięty
if (digitalRead(BUTTON_DOWN) == HIGH) {
delay(50); // Debouncing
if (digitalRead(BUTTON_DOWN) == HIGH) {
decrementCounter();
}
}
// Wyświetl aktualną wartość licznika
display.showNumberDec(counter);
// Ustaw częstotliwość na syntezatorze Si5351
setSi5351Frequency();
// Dodaj opóźnienie, aby uniknąć częstego odświeżania
delay(100);
}
void incrementCounter() {
if (counter < 40) {
counter++;
}
}
void decrementCounter() {
if (counter > 0) {
counter--;
}
}
void setSi5351Frequency() {
// Przykładowe przeliczenia częstotliwości w zależności od wartości licznika
// Poniżej założono, że każdy krok licznika to 10 kHz
unsigned long frequency = 27100 + (counter * 10000);
// Ustaw częstotliwość na syntezatorze Si5351
si5351.setFrequency(SI5351_CLK0, frequency);
}
Tym razem AI zmienił sposób podłączenia przycisków. Ale to nie jest aż tak istotnie, chociaż wymaga dwóch dodatkowych rezystorów. Nie wiem, na czym polega taka decyzja AI i jak na razie nie chcę na tym się skupić. Mnie zależy tylko na tym, żeby działało. I z tym nie ma problemów. Zostało to tylko podłączyć między sobą. Później chcę dodać zegar, żeby po wyłączeniu stacyjki wyświetlacz pokazywał czas (oczywiście zasilanie na syntezatorze zostaje cały czas).
Wynik — AI świetnie się nadaje do stworzenia nie bardzo skomplikowanego oprogramowania. Ewentualnie nawet może dać redę ze skomplikowanymi. Problem polega tylko na tym, żeby podać mu konkretne zadanie. Ale współpracując z programistami, robimy to samo.
Nawet AI ma więcej zalet, bo wie dużo więcej niż przeciętny programista. Np. opracując odbiornik do NavTex, miałem wyjaśnić do bardzo doświadczonego programisty zasady działania tego systemu odbioru informacji pogodowej i to trochę trwało. AI "zna" ten system od podstaw. Drugim atutem współpracy z AI jest dyspozycja. On nie musi prowadzić dziecko do szkoły, nie choruje i nie pije, nawet nie śpi. Dla tego można mu wybaczyć, jeżeli kod się okazuje na pare bajtów większy niż stworzony przez człowieka.
Nie wykluczam, że kod opracowany przez AI jest lepszy od stworzonego przez człowieka. Bo AI lepiej zna się na sposobie "myślenia" maszyny niż człowiek. Moim zdaniem AI radzi sobie lepiej z kodami maszynowymi niż z tłumaczeniami tekstów w językach obcych człowieka.
Fajne? Ranking DIY