Skocz do zawartości

Bonkers

Użytkownicy
  • Zawartość

    35
  • Rejestracja

  • Ostatnio

Reputacja

2 Neutralna

O Bonkers

  • Ranga
    3/10

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Tychy
  • Zainteresowania
    motoryzacja, informatyka, elektronika
  • Zawód
    Student

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. Udało mi się to uruchomić. Wszystko działa prawidłowo. Przy starcie I2C trzeba było przesunąć adres urządzenia o jeden bit w lewo a następnie zsumować logicznie z bajtem odpowiadającym za czytanie lub wpisywanie. Wystarczy zamienić poniższe linijki kodu: I2C_Start(QMC5883L_ADDR+I2C_WRITE); ... I2C_Start_Wait(QMC5883L_ADDR+I2C_WRITE); ... I2C_Repeated_Start(QMC5883L_ADDR+I2C_READ); na I2C_Start(((QMC5883L_ADDR)<<1) | I2C_WRITE); ... I2C_Start_Wait(((QMC5883L_ADDR)<<1) | I2C_WRITE); ... I2C_Repeated_Start(((QMC5883L_ADDR)<<1) | I2C_READ);
  2. Sprawdzałem, wszystko na sofcie Arduino działa poprawnie, sam projekt był pierwotnie uruchomiony na Arduino, a ja chce go teraz przerobić na C pod AVR. Z resztą ta ATmega jest na płytce Arduino. Sam program testowałem na dwóch bibliotekach do I2C, na jednej z nich zrobiłem obsługę wyświetlacza przez I2C więc raczej jest dobra, a druga to z tej strony do magnetometru HMC5883L.
  3. Tak, USART działa, gdy zakomentuje się linie odpowiadające za inicjalizacje magnetometru. Z tego co widzę to w tym temacie co napisałeś pojawia się problem dopiero po odczycie... a u mnie żaden odczyt nie następuje jak narazie.
  4. Witam, Mam problem z przeniesieniem projektu z Arduino na ATmega32. Póki co narazie próbuje obrobić pobieranie danych z czujnika magnetycznego QMC5883L oraz ich wyświetlanie po przez USART. Na podstawie kodu z tej strony https://www.electronicwings.com/avr-atmega/magnetometer-hmc5883l-interfacing-with-atmega16 ,dokumentacji czujnika QMC5883L, a także biblioteki Arduino próbuje przerobić powyższy kod z obsługi HMC5883L na QMC5883L. Niestety nie udaje mi się zainicjować w programie magnetometru. Poniżej przesyłam link do dokumentacji technicznej oraz kod programu. Proszę o pomoc. Dokumentacja QMC5883L: http://wiki.epalsite.com/images/7/72/QMC5883L-Datasheet-1.0.pdf #define F_CPU 16000000UL #define FOSC 16000000 // Clock Speed #define BAUD 9600 #define MYUBRR FOSC/16/BAUD-1 #include <avr/io.h> #include <stdlib.h> #include <math.h> #include <stdio.h> #include <util/delay.h> #include <avr/interrupt.h> #include "USART_irq.h" #include "i2cmaster.h" #define QMC5883L_ADDR 0x0D /* Magnetometer QMC5883L Address */ static FILE mystdout = FDEV_SETUP_STREAM(USART0_Transmit_IO, NULL,_FDEV_SETUP_WRITE); void Magneto_init() /* Magneto initialize function */ { i2c_start(QMC5883L_ADDR+I2C_WRITE); /* Start and write SLA+W */ i2c_write(0x0B); /* Defined Set/Reset Period as Default */ i2c_write(0x01); /* Configure register */ i2c_write(0x09); i2c_write(0x1D); /* Configure register OSR = 512, Full Scale Range = 8G(Gauss), ODR = 200HZ, set continuous measurement mode */ i2c_stop(); /* Stop I2C */ } void Magneto_GetPos(int *x, int *y, int *z) { i2c_start_wait(QMC5883L_ADDR+I2C_WRITE); /* Start and wait for acknowledgment */ i2c_write(0x00); /* Write X register address */ i2c_rep_start(QMC5883L_ADDR+I2C_READ); /* Generate repeat start condition with SLA+R */ /* Read 16 bit x,y,z value (2’s complement form) */ *x = (((int)i2c_readAck()<<8) | (int)i2c_readAck()); *y = (((int)i2c_readAck()<<8) | (int)i2c_readAck()); *z = (((int)i2c_readAck()<<8) | (int)i2c_readNak()); i2c_stop(); } int main(void) { i2c_init(); /* Initialize I2C */ Magneto_init(); USART0_Init(MYUBRR); // Calculate baud rate sei(); /* Enable interrupts => enable UART interrupts */ stdout = &mystdout; int xAxis = 0 , yAxis = 0, zAxis = 0; int i = 0; while (1) { Magneto_GetPos(&xAxis, &yAxis, &zAxis); printf("x: %d | y: %d | z: %d | t -> %d\n", xAxis, yAxis, zAxis, i); i++; _delay_ms(1000); } }
  5. Dziękuje wszystkim za tak ogromną reakcje na moją pytanie . Nie spodziewałem się, że wywiąże się z tego tak ciekawa dyskusja . Przy okazji bardzo ciekawe środowisko, bardziej rozbudowane niż Arduino IDE, może trochę mniej niż AS, ale daje rade. Poza tym bez debuggera, programatora to bardziej się opłaca z niego korzystać niż z AS. Postanowiłem, że póki co nadal będę pisał programy w C++ na Arduino, równocześnie ucząc się podstaw C na AVRy pisząc jakieś proste programy, do obsługi led'ów, wyświetlaczy, przycisków itd. Nadal uważam, że pisanie w C ma więcej plusów niż C++ jeśli chodzi o mikrokontrolery i przykłady, które przytaczaliście. Może nawet zacznę pisać w ASM, bo z tego co wiem to przypomina to język STL do PLCków, z którymi też mam aktualnie do czynienia. W przyszłości jak już ogarnę C na AVR, zabiorę się za ARM, STM, bo rzeczywiście jeśli chodzi o takie hobbystyczne sprawy to AVRy wystarczają, ale jak się już chce poważne rzeczy robić to trzeba ogarnąć resztę.
  6. No właśnie zazwyczaj żeby przerobić jedną bibliotekę, trzeba przerabiać następną, następną itd... Umożliwia, też próbowałem pisać w C++, ale tu z kolei, również trzeba przerabiać niektóre biblioteki, w tym główną "Arduino.h". Jeśli dobrze rozumiem nie ma innego sposobu, niż przerabianie bibliotek? Czy może jednak istnieje jakaś strona, która posiada biblioteki w C dla konkretnych urządzeń przeznaczonych do Arduino?
  7. Witam, W ostatnim czasie zacząłem interesować się programowaniem w Atmel Studio zamiast w Arduino IDE, ponieważ Atmel Studio ma więcej opcji niż IDE. Wiem, że istnieją takie opcje programowania Arduino po przez to środowisko za pomocą dodatku vMicro lub z poziomu tworzenia nowego projektu "Create Arduino Project from sketch". Jednak mnie najbardziej interesuje pisanie programów w "zwykłym C" tak jak dla innych avr'ów. I w związku z tym moje pytanie brzmi, czy da się w szybki sposób dodać lub przerobić biblioteki z Arduino do projektu, pisanym w języku C w Atmel Studio?
  8. Problem rozwiązany . Okazało się że główną przyczyną dlaczego to nie działało nie był kod, a zasilanie arduino. Dzięki @ethanak @krzychb za pomoc.
  9. @ethanak Poprawiłem i dalej nic if (cliente.connect("www.*******.cba.pl", 80)) { //Connecting at the IP address and port we saved before if(resume_disp == 1 || resume_disp == 2) { Serial.println("connected"); cliente.print("GET /wr_data.php?"); //Connecting and Sending values to database cliente.print("temperature="); cliente.print(tempG, 1); cliente.print("&humidity="); cliente.print(humG); cliente.print("&pressure="); cliente.print(pressG); cliente.print("&temperature_out="); cliente.print(data.temperature, 1); cliente.print("&humidity_out="); cliente.print(data.humidity); cliente.print("&insolation="); cliente.print(data.insolation); cliente.print("&weather="); cliente.print(readWeatherEN(data)); cliente.println( " HTTP/1.1"); cliente.println( "Host: www.*******.cba.pl" ); cliente.println( "Connection: close" ); cliente.println(); } } Próbowałem też zrobić tak jak @krzychb radził, ale też ni widać efektu if (cliente.connect("www.*********.cba.pl", 80)) { //Connecting at the IP address and port we saved before if(resume_disp == 1 || resume_disp == 2) { pdata = "temperature="+(int)tempG; pdata += "&humidity="+humG; pdata += "&pressure="+pressG; pdata += "&temperature_out=" + (int)data.temperature; pdata += "&humidity_out=" + data.humidity; pdata += "&insolation=" + data.insolation; pdata += "&weather=" + readWeatherEN(data); Serial.println("connected"); cliente.print("POST /add.php HTTP/1.1\r\n"); cliente.print("Host: www.*********.cba.pl\r\n"); // SERVER ADDRESS HERE TOO cliente.print("Content-Type: application/x-www-form-urlencoded\r\n"); cliente.print("Content-Length: "); cliente.print(pdata.length() + (String)"\r\n" + (String)"Connection: close\r\n\r\n"); cliente.print(pdata);
  10. Póki co, zrobiłem to w ten sposób i dalej nie działa if (cliente.connect("www.********.cba.pl", 80)) { //Connecting at the IP address and port we saved before if(resume_disp == 1 || resume_disp == 2) { Serial.println("connected"); cliente.print("GET /wr_data.php?"); //Connecting and Sending values to database cliente.print("temperature="); cliente.print(tempG, 1); cliente.print("&humidity="); cliente.print(humG); cliente.print("&pressure="); cliente.print(pressG); cliente.print("&temperature_out="); cliente.print(data.temperature, 1); cliente.print("&humidity_out="); cliente.print(data.humidity); cliente.print("&insolation="); cliente.print(data.insolation); cliente.print("&weather="); cliente.print(readWeatherEN(data)); cliente.println( " HTTP/1.1\r\n"); cliente.println( "Host: www.********.cba.pl\r\n" ); cliente.println( "Connection: close\r\n" ); cliente.println("\r\n"); }
  11. Witam, Mam problem z przesyłaniem informacji do shostowanej bazy danych. Bazę danych uruchomiłem na hostingu cba.pl, wcześniej przesyłałem dane do lokalnego serwera postawionego na xamppie i nie było z tym problemu. Całą procedurę wykonałem na podstawie tego co jest napisane w tym poradniku: https://electronicshobbyists.com/logging-data-to-database-using-arduino-ethernet-shield/ . Czy w podobny sposób można wykonać zapisywanie informacji do bazy na stronie, bo nie umiem jakoś do tego dojść czy to może wogóle działać. Wszystkie pliki .php, które wrzuciłem na stronę działają prawidłowo gdy się po przez nie wpisuje dane ręcznie. Jeżeli jednak chce je wpisać za pomocą arduino, to wtedy nie działa, chociaż pokazuje że jest połączenie. Próbowałem to też wykonać za pomocą tego poradnika: https://www.instructables.com/id/PART-1-Send-Arduino-data-to-the-Web-PHP-MySQL-D3js/ , ale też z marnym skutkiem. Miał ktoś kiedyś podobny problem? Poniżej wklejam fragmenty kodów dla obu przypadków. int SendToDatabase() { unsigned long cur_time = millis(); static unsigned long last_check; if(fabs(cur_time - last_check) >= 2*MIN) { if (cliente.connect("www.********.cba.pl", 80)) { //Connecting at the IP address and port we saved before if(resume_disp == 1 || resume_disp == 2) { Serial.println("connected"); cliente.print("GET /wr_data.php?"); //Connecting and Sending values to database cliente.print("temperature="); cliente.print(tempG, 1); cliente.print("&humidity="); cliente.print(humG); cliente.print("&pressure="); cliente.print(pressG); cliente.print("&temperature_out="); cliente.print(data.temperature, 1); cliente.print("&humidity_out="); cliente.print(data.humidity); cliente.print("&insolation="); cliente.print(data.insolation); cliente.print("&weather="); cliente.println(readWeatherEN(data)); } else { Serial.println("connected"); cliente.print("GET /wr_data.php?"); //Connecting and Sending values to database cliente.print("temperature="); cliente.print(tempG, 1); cliente.print("&humidity="); cliente.print(humG); cliente.print("&pressure="); cliente.println(pressG); } last_check = cur_time; cliente.stop(); //Closing the connection resume_connection = 1; return 1; } else { // if you didn't get a connection to the server: Serial.println("disconnected"); last_check += 5*SEK; resume_connection = 0; return ERR; } } return 0; } int SendToDatabase() { unsigned long cur_time = millis(); static unsigned long last_check; if(fabs(cur_time - last_check) >= 1*MIN) { if (cliente.connect("http://*********.cba.pl", 80)) { //Connecting at the IP address and port we saved before if(resume_disp == 1 || resume_disp == 2) { pdata = "temperature="+(int)tempG; pdata += "&humidity="+humG; pdata += "&pressure="+pressG; pdata += "&temperature_out=" + (int)data.temperature; pdata += "&humidity_out=" + data.humidity; pdata += "&insolation=" + data.insolation; pdata += "&weather=" + readWeatherEN(data); Serial.println("connected"); cliente.println("POST /add.php HTTP/1.1"); cliente.println("Host: http://*********.cba.pl"); // SERVER ADDRESS HERE TOO cliente.println("Content-Type: application/x-www-form-urlencoded"); cliente.print("Content-Length: "); cliente.println(pdata.length()); cliente.print(pdata); } last_check = cur_time; cliente.stop(); //Closing the connection resume_connection = 1; return 1; } else { // if you didn't get a connection to the server: Serial.println("disconnected"); last_check += 5*SEK; resume_connection = 0; return ERR; } } return 0; }
  12. Witam, Mam pewien problem z komunikacją pomiędzy dwoma mikrokontrolerami, z powodów finansowych określonych projekcie muszę wykonać go na klonach arduino. W tym celu podłączyłem do każdego arduino moduł sieciowy nRF24L01, zgodnie ze schematami występującymi na różnych tutorialach w necie. Tak aby z Nano zrobić nadajnik, a z Uno odbiornik. Do każdego z arduino wgrałem poniższe przykładowe programy, które zamieszczam poniżej. Niestety transmisja danych w tym kierunku nie zadziałała - nano wysyłało dane, natomiast uno nie chciało ich odbierać. W drugą stronę było już lepiej, uno zadziałało i zaczęło przesyłać dane do nano, które je odbierało. Dla sprawdzenia czy dany moduł działa dobrze podłączyłem go do oryginału Arduino UNO i wtedy komunikacja w obu kierunkach działała bez zarzutu. Teraz rodzi się takie pytanie czy jest jakieś rozwiązanie aby komunikacja nano z klonem uno działała poprawnie w obu kierunkach? Czy po prostu będe musiał zakupić nowy egzemplarz? Albo w kodzie trzeba coś zmienić? Odbieranie danych: #include <SPI.h> #include "RF24.h" RF24 myRadio (7, 8); struct package { int id=0; float temperature = 0.0; char text[100] ="empty"; }; byte addresses[][6] = {"0"}; typedef struct package Package; Package data; void setup() { Serial.begin(9600); delay(1000); myRadio.begin(); myRadio.setChannel(115); myRadio.setPALevel(RF24_PA_MAX); myRadio.setDataRate( RF24_250KBPS ) ; myRadio.openReadingPipe(1, addresses[0]); myRadio.startListening(); delay(1000); } void loop() { if ( myRadio.available()) { while (myRadio.available()) { myRadio.read( &data, sizeof(data) ); } Serial.print("\nPackage:"); Serial.print(data.id); Serial.print("\n"); Serial.println(data.temperature); Serial.println(data.text); } } Wysyłanie: #include <SPI.h> #include "RF24.h" RF24 myRadio (7, 8); byte addresses[][6] = {"0"}; struct package { int id=1; float temperature = 18.3; char text[100] = "Text to be transmitted"; }; typedef struct package Package; Package data; void setup() { Serial.begin(9600); delay(1000); myRadio.begin(); myRadio.setChannel(115); myRadio.setPALevel(RF24_PA_MAX); myRadio.setDataRate( RF24_250KBPS ) ; myRadio.openWritingPipe( addresses[0]); delay(1000); } void loop() { myRadio.write(&data, sizeof(data)); Serial.print("\nPackage:"); Serial.print(data.id); Serial.print("\n"); Serial.println(data.temperature); Serial.println(data.text); data.id = data.id + 1; data.temperature = data.temperature+0.1; delay(1000); }
  13. Ok jeszcze raz wielkie dzięki, program już działa poprawnie bo wcześniej zapomniałem jeszcze ustawić flagę na true przy odczycie temperatury i teraz wszystko jest ok
  14. No niestety ten twój program nie zadziałał, ale mimo to wielkie dzięki. I mam jeszcze 2 pytania: - czy żeby zrobić więcej progów to wystarczy większą tablice zrobić i dorobić pozostałe warunki takie same jak w tym programie? - i jaki obecnie największy wyświetlacz 4x20 można połączyć z arduino (najlepiej OLED), bo szukałem i największe to były chyba z 5,7 cali, a najlepiej jakby był jeszcze większy
  15. Teraz lepiej, bo już da się zmienić progi i nie miga już, tylko że da się zrobić to tylko raz bo potem przycisk ENTEXIT nie reaguje. #include <OneWire.h> #include <DS18B20.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #define BACKLIGHT_PIN 3 //przyciski #define UP 4 #define DOWN 5 #define ENTER 6 #define ENTEXIT 10 #define LED 8 //Numer pinu do ktorego podlaczasz czujnik #define ONEWIRE_PIN 2 float temperatura = 0; float temp =0; float liczba[2] = {0,0}; //progi temperatur int prog = 0; //wartosc dla danego progu int entexit = 0; bool flaga = true; bool flaga2 = true; //ostatnie klikniecia przyciskow long last_up = 0; long last_down = 0; long last_enter = 0; long last_entexit = 0; long last_check = 0; //adres czujnika byte address[8] = {0x28, 0xFF, 0x9A, 0x26, 0x58, 0x16, 0x4, 0x42}; //Adres wyswietlacza LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); OneWire onewire(ONEWIRE_PIN); DS18B20 sensors(&onewire); void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(ENTER, INPUT_PULLUP); pinMode(UP, INPUT_PULLUP); pinMode(DOWN, INPUT_PULLUP); pinMode(ENTEXIT, INPUT_PULLUP); sensors.begin(); sensors.request(address); lcd.begin(16, 2); lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE); lcd.setBacklight(HIGH); lcd.setCursor(0, 0); //ustawienie kursora lcd.print("Temp: "); } /*void progi(float temperatura, float liczba[0], float liczba[1]) { if(temperatura > liczba[0] && temperatura < liczba[1]) { digitalWrite(LED, HIGH); delay(200); } else { digitalWrite(LED, LOW); delay(200); } }*/ void loop() { // put your main code here, to run repeatedly: temperatura = sensors.readTemperature(address); sensors.request(address); if((digitalRead(ENTEXIT)==LOW) && (millis() - last_entexit > 200)) { if(entexit==0){entexit=1;} else{entexit = 0;} last_entexit = millis(); } if((millis() - last_check > 3000)){ temperatura = sensors.readTemperature(address); sensors.request(address); last_check = millis(); flaga2 = true; } if(entexit==0 && flaga2 ==true) { lcd.clear(); lcd.setCursor(0,0); lcd.print("Temp: "); lcd.setCursor(6, 0); lcd.print(temperatura); lcd.setCursor(12, 0); lcd.print("*C"); // delay(3000); if(temperatura > liczba[0] && temperatura < liczba[1]) { digitalWrite(LED, HIGH); delay(200); } else { digitalWrite(LED, LOW); delay(200); } flaga2 = false; } if(entexit == 1){ if((digitalRead(ENTER)==LOW) && (millis() - last_enter > 200)) { flaga = true; flaga2 = true; if(prog == 0) { prog = 1; } else { prog = 0; } last_enter = millis(); } if(prog == 1) { if(flaga== true) { lcd.clear(); lcd.setCursor(0,0); lcd.print("MAX"); lcd.setCursor(10, 0); lcd.print(liczba[prog],1); flaga = false; } } if(prog ==0) { if(flaga== true) { lcd.clear(); lcd.setCursor(0,0); lcd.print("MIN"); lcd.setCursor(10, 0); lcd.print(liczba[prog],1); flaga = false; } } /*if(flaga!=false) { lcd.clear(); lcd.setCursor(0,0); lcd.setCursor(10, 0); lcd.print(liczba[prog],1); flaga=false; }*/ if(liczba[prog] < 100.0) { if((digitalRead(UP)==LOW) && (millis() - last_up > 200)) { liczba[prog]+=0.1; last_up = millis(); flaga = true; } } if( 0 <= liczba[prog]) { if((digitalRead(DOWN)==LOW) && (millis() - last_down > 200)) { liczba[prog]-=0.1; last_down = millis(); flaga = true; } } } }
×
×
  • Utwórz nowe...