• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Pomoc w znalezieniu błędu w kodzie
#11
Przecież w przykładzie Blink jest wpisana taka linijka, w sekcji setup{} . Dopisz tak samo, w setup na samym początku. Nie ma jednak gwarancji, że biblioteka/funkcja nie robi tego gdzieś sobie wewnątrz swojego kodu, w dodatku ustawiając jako wejście. Tutaj chyba nie masz biblioteki, jak już masz pewność, który to pin to wpisz to na początku setup.


Co do zasady takie ustawienie robi się raz (chyba że później ktoś odwraca funkcję pinu) i przed pierwszym użyciem funkcji digitalWrite(naTymPinie).

Istotne jest by ustawiać pin jako wyjście dopiero wtedy, gdy wiesz co do niego podłączasz. Dlatego wszystkie są ustawione jako wejścia po resecie. Jak ustawisz pin podłączony do GND jako wyjście i wpiszesz tu 1 to zrobisz zwarcie VCC-GND, które skończy się zapewne uszkodzeniem. Tak samo wpisując 0 do pinu podłączonego do VCC. To się może zdarzyć np. jak masz przycisk podpięty do jakiegoś pinu źle opisanego.

Bawiłem się kiedyś czujnikiem Sharp i mam skądś taki kod (pasuje do UNO, NANO, itp, używa wewnętrznego Vref 1.1V, dane wysyła na OLED I2C i UART, działa):
Kod:
/*
Standalone Sketch to use with a Arduino UNO and a
Sharp Optical Dust Sensor GP2Y1010AU0F
*/
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define deltaTime   40
#define sleepTime   9680
#define samplingTime   280
#define OLED_RESET 25 //nie wiem po co reset przy i2c

const int smockPIN = A0; //wyjscie analogowe czujnika dymu
const int smockLed = 7;   //Zasilanie led czujnika dymu
Adafruit_SSD1306 display(OLED_RESET);


uint32_t   smockADC ;
uint32_t   smockV  ;
uint32_t smockResult ;

void setup(){
 analogReference(INTERNAL); //nalezy zrobić dzielnik rezystorowy, np. 10k do GND i 42k do VCC 3344mV=553 adc
 Serial.begin(115200);
 pinMode(smockLed,OUTPUT);
 display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
 display.clearDisplay();
 display.setTextSize(1);
 display.setTextColor(WHITE);
 display.setCursor(0,0);
 display.println(F("Hello, world!"));
 display.setTextSize(2);
 display.println(3.141592,5);
   display.display();
     delay(2000);
}

void loop(){
 
 digitalWrite(smockLed,LOW); // power on the LED
 delayMicroseconds(samplingTime);
 smockADC =0;
for(int i=0;i<4;i++)
{
 smockADC += analogRead(smockPIN); // read the dust value
 
}
smockADC=smockADC/4;
 delayMicroseconds(deltaTime);
 digitalWrite(smockLed,HIGH); // turn the LED off
 delayMicroseconds(sleepTime);

 // 0 - 5V mapped to 0 - 1023 integer values
 // recover voltage
 smockV = smockADC * 3344 / 553;

 // linear eqaution taken from http://www.howmuchsnow.com/arduino/airquality/

 smockResult = (17 * smockV)/100; //-100

 Serial.print("Pomiar ADC (0-4095): ");
 Serial.print(smockADC);

 Serial.print(" - Voltage: ");
 Serial.print(smockV);

 Serial.print(" - Dust Density: ");
 Serial.println(smockResult); // unit: ug/m3

display.clearDisplay();
 display.drawRect(0, 0, display.width(), display.height(), WHITE);
 display.setTextSize(1);
 display.setTextColor(WHITE);
 display.setCursor(3,1);
 display.println("Miernik dymu (ug/m3)");
 display.setTextSize(2);
// display.setTextColor(BLACK, WHITE); // 'inverted' text
 display.print(" ");
 display.print(smockResult);
 display.setTextSize(1);
display.println(" ug/m3");
/*  display.setTextColor(WHITE);
display.setTextSize(1);
display.print(" ");
display.print(analogRead(sensorPin));
display.print("J - ");
display.print( sensorValue/100);
display.print(".");
display.print( sensorValue%100);
display.println(" V");
//display.println("J - ");
*/
 display.display();


 delay(1000);
}
Pewnie przerobiny jest stąd: http://arduinodev.woofex.net/2012/12/01/...st-sensor/ .
Zanim zaczniesz to gdziekolwiek wysyłać po WIFI powinieneś mieć pewność, że sam czujnik działa prawidłowo, najprościej stosując odczyt po UART. Dopiero potem dokłada się kolejne cegiełki programu.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#12
(02-09-2018, 12:16)kaczakat napisał(a): Jak ustawisz pin podłączony do GND jako wyjście i wpiszesz tu 1 to zrobisz zwarcie VCC-GND, które skończy się zapewne uszkodzeniem. Tak samo wpisując 0 do pinu podłączonego do VCC. 
Teoria mówi a praktyka potwierdza, że nie uszkodzi się. C-MOS to nie TTL, który faktycznie gdy wystawił 0 a wyjście było podłączone do Vcc od razu uszkadzał się o ile zasilanie miało wystarczającą wydajność prądową.
W C-MOS tego rodzaju zwarcia to bardziej złożone zjawisko. Zainteresowani z pewnością znajdą materiały na ten temat, sam już kilka razy opisywałem co się dziej przy zwarciach i kiedy może to uszkodzić układ.
Bez zbędnej teorii, zwarcie na pojedynczych wyprowadzeniach uC nie uszkodzi go i nie chodzi tu o chwilowe zwarcia a nawet od długotrwałe rzędu dni a pewnie i tygodni czy miesięcy.
 
Odpowiedź
#13
dopisałem pinMode(5,OUTPUT);  zaraz pod
void setup() { i nic to nie zmieniło
 
Odpowiedź
#14
Czy led włączany jest na wystarczająco długi czas aby zobaczyć jego świecenie?
Sprawdź oscyloskopem czy sa tam impulsy i jak długie.
 
Odpowiedź
#15
Och, zmieniło na pewno. Tylko tego nie widzisz. Na czas testu odepnij sterowanie ledem czujnika, ten kabelek. Podłącz w to miejsce jakiś led z rezystorem 200-500om. Pamiętaj, że led ma się zaświecić po podaniu stanu niskiego, czyli drugi koniec led w odpowiedniej orientacji podłącz od VCC. Zmień w kodzie int samplingTime = 280000; To zaświeci Led na 1/4s co z łatwością zobaczysz oczkami. Rozumiem, że tak poza tym odczyt anologa działa Ci prawidłowo? Przykładowo podłączyłeś jakiś potencjometr do 1V i GND, wyjście do A0 i ładnie wszystko działa?
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#16
Faktycznie zle sprawdziłem, po dodaniu pinMode(5,OUTPUT) pojawiają sie impulsy na wyjściu D1. Ale dalej mam problem. Impuls się pojawia co ok 10 s i jak z rozumiem odczyt jest tez co 10s. Na telefonie dalej nie widać zmian. Pokazuje mi on wartość -95 - tyle samo jak fizycznie odepnę czujnik od esp. Czasami na moment sie coś tam zmieni, ale nawet ciężko to zaobserwować. Wydaje mi sie ze gdyby te impulsy i odczyt był cały czas, a nie co 10 s było by ok, tak jak jet na płytce uno z Twoim kodem ktory zamieściłeś(za ktory tez b dziaduje). Podobnie jest tez w kodzie ktory umieściłem na początku, impulsy i odczyt jest cały czas, z jakaś minimalna niezauważalną przerwą.
Co by trzeba zrobić żeby to zmienić?
 
Odpowiedź
#17
Podziel sobie ten projekt na etapy:
1. Sprawdź jak działa ADC w ESP, on może mierzyć wewnętrzne VCC lub coś podłączonego do pinu A0. Deklaruje się to na początku szkicu, jak nie ma deklaracji to domyślnie jest pomiar z A0. Nie wiem jakiej płytki używasz, niektóre mają od razu dodane dzielniki rezystorowe bo do samego chipu ESP nie powinno się podłączać napięcia powyżej ~1V. Jak masz sygnał 0-5V to sam powinieneś zrobić sobie taki dzielnik (nawet jeśli jest, bo wbudowane mają zakres do 3.3V). W UNO można jako napięcie odniesienia używać VCC (domyślnie) ale ono zwykle nie jest stabilne, dlatego w swoim przykładzie używam wewnętrznego 1.1V + dzielnik. To wewnętrzne jest stabilne, ale w każdym chipie delikatnie inne, także trzeba sobie zobaczyć jakie są odczyty i zrobić kalibracje. Dodatkowo w ESP jest to wifi szarpiące prąd. Na czas pomiaru najlepiej wyłączyć modem WIFI. Ogólnie ADC jest tu bardziej kłopotliwe - dlatego jest p.2
2. Sprawdź jakie wartości generuje czujnik podłączając go do zwykłego Arduino (NANO, UNO) i używając przykładów, które Ci podałem. Pod linkiem masz sam odczyt na monitor Arduino, kilka linijek gdzie trudno zrobić błąd. Musisz mieć jakiś generator dymu/par, ja testowałem E-papierosem, może być np. jakieś kadzidełko. Bez tego zawsze wskazania są zero, chyba że testujesz w młynie lub mieszkasz pod elektrociepłownią, zimą na osiedlu domków jednorodzinnych bez gazu.
Dopiero jak będziesz pewny obu połówek to złącz to w całość na ESP.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#18
kaczakat twoje posty sa strzałami w dziesiątkę.
Zaczęło mi to w końcu "działać".
Brakowało tylko tej lini  pinMode(5,OUTPUT) i odczyty sie pojawiły na telefonie. Wcześniej pisałem ze to nie działa ale chyba kabelek od czujnika wisiał na izolacji bo od tych ciągłych testów sie urwał. W każdym badz razie teraz działa. Inna sprawa ze wyniki sa całkowicie z czapy, na jednym i drugim czujniku mam rozrzut rzędu 200 ug, a pomimo tego ze czujnik jest w zamkniętym pokoju to raz pokazuje 10 raz 100 raz - 80. Także albo te czujnika są nic nie warte, albo ten kod jest do kitu. Fakt ze nie korzysta z napięcia ref, ale nie myślałem ze rozrzut będzie tak duzy. Często tez pokazuje się wynik taki jak z odpięta dioda w czujników, wiec coś tam nie działa do końca

na ta chwile używam płytki wemos d1, gołego esp12 tez dziś problemow uruchomić, ale programator w pewnym momencie odmówił posłuszeństwa i juz komp go nie identyfikuje wiec esp12 musi ustąpić miejsca wemosowi albo nodemcu

A czy idzie jakoś przerobić ten kod, ktory mam żeby czujnik korzystał z napięcia referencyjnego?
 
Odpowiedź
#19
Korzysta.
Mówiąc o wewnętrznym napięciu odniesienia 1.1V vs VCC miałem na myśli UNO/NANO/PRO MINI. ESP ma raczej tylko wewnętrzne, ale niektóre płytki ESP mają od razu dodane takie dzielniki, że zachowuje się jak VCC. Tzn, ESP jest zasilane 3.3V no i przy takim napięciu podanym na A0 odczyt jest dopiero w okolicach 1000. Przykładowo daj napięcie 1V na PIN ADC płytki NODE MCU. Na pinie chipa 12E jest już 0.3V (pierwszy na rogu jest RST, następny to A0, inaczej niż na pinach płytki NODE). Także musi być dzielnik rezystorowy. Odczyt przy tym mam 325/1023. Co ciekawe nie ma 0, najniższy odczyt mam 1 po złączeniu z GND. Także jest to wewnętrzne źródło odniesienia około 1V. Sprawdzisz to podając napięcie na A0 samego chipa ESP12E i robiąc odczyt, bez dzielników 1V powinien przy odczycie dawać coś w okolicach MAX, czyli 1023. Jak jest znacznie mniej to jest wbudowany dzielnik. Generalnie dużo czytałem, że ESP ma  słaby ADC. Wg mnie przede wszystkim należy wyłączyć modem na czas pomiaru. A najlepiej wyłączyć wszystko jak w trybie tłumienia szumów ADC na AVR. Niestety ja tak głęboko w to nie grzebałem. Możesz poprawić stabilność wyłączając modem, robiąc odczyt np. 8 razy i wyciągać średnią. A najlepiej 9  i wywalić  pierwszy. Ale generalnie wszystkie moje próby doprowadziły mnie do wniosku, że ADC jest lepsze w Atmedze (używając wewnętrznego Vref). A jak go użyć w Atmedze to załączyłem przykład. W ESP w sumie używam go tylko do pomiaru napięcia zasilania by ewentualnie podjąć decyzję o uśpieniu ESP na amen gdy bateria jest bliska padnięcia.
Jeśli potrzebujesz robić coś dokładniejszego na ESP to lepiej zaopatrzyć się w jakiś zewnętrzny ADC np. na I2C. Gdzieś czytałem, że w nowej wersji IDE jest lepiej, w sumie dzisiaj sobie podłączyłem, bez uruchamiania WIFI i odczyty z precyzyjnego potencjometru są stabilne, 326+/-1. Potem to samo zrobiłem z odczytem przez WWW na serwerze wbudowanym w ESP, co 1s i dalej odczyty są w miarę ok, 324+/-2. Może dołożyli gdzieś wewnątrz funkcji to usypianie. Niestety wyłączenie i włączenie modemu funkcjami, które ja znam i używam przy usypianiu całego ESP, to ponowne łączenie z WIFI, a to trwa parę sekund, resetują się połączenia.
Jak chcesz porównać wskazania to wgraj sobie ten załączony szkic do UNO i porównaj. Ja mam takie pomiary:
Kod:
Pomiar ADC (0-4095): 53 - Voltage: 320 - Dust Density: 54
Pomiar ADC (0-4095): 69 - Voltage: 417 - Dust Density: 70
Pomiar ADC (0-4095): 47 - Voltage: 284 - Dust Density: 48
Pomiar ADC (0-4095): 59 - Voltage: 356 - Dust Density: 60
Pomiar ADC (0-4095): 62 - Voltage: 374 - Dust Density: 63
Pomiar ADC (0-4095): 65 - Voltage: 393 - Dust Density: 66
Pomiar ADC (0-4095): 61 - Voltage: 368 - Dust Density: 62
Pomiar ADC (0-4095): 66 - Voltage: 399 - Dust Density: 67
Pomiar ADC (0-4095): 74 - Voltage: 447 - Dust Density: 75
Pomiar ADC (0-4095): 56 - Voltage: 338 - Dust Density: 57
Pomiar ADC (0-4095): 67 - Voltage: 405 - Dust Density: 68
Pomiar ADC (0-4095): 67 - Voltage: 405 - Dust Density: 68
Pomiar ADC (0-4095): 55 - Voltage: 332 - Dust Density: 56
Pomiar ADC (0-4095): 61 - Voltage: 368 - Dust Density: 62
Pomiar ADC (0-4095): 54 - Voltage: 326 - Dust Density: 55
Pomiar ADC (0-4095): 51 - Voltage: 308 - Dust Density: 52
Pomiar ADC (0-4095): 22 - Voltage: 133 - Dust Density: 22
Pomiar ADC (0-4095): 62 - Voltage: 374 - Dust Density: 63
Pomiar ADC (0-4095): 47 - Voltage: 284 - Dust Density: 48
Pomiar ADC (0-4095): 65 - Voltage: 393 - Dust Density: 66
Pomiar ADC (0-4095): 69 - Voltage: 417 - Dust Density: 70
Pomiar ADC (0-4095): 44 - Voltage: 266 - Dust Density: 45
Pomiar ADC (0-4095): 57 - Voltage: 344 - Dust Density: 58
Pomiar ADC (0-4095): 34 - Voltage: 205 - Dust Density: 34
Pomiar ADC (0-4095): 58 - Voltage: 350 - Dust Density: 59
Pomiar ADC (0-4095): 62 - Voltage: 374 - Dust Density: 63
Pomiar ADC (0-4095): 54 - Voltage: 326 - Dust Density: 55
Pomiar ADC (0-4095): 85 - Voltage: 513 - Dust Density: 87
Pomiar ADC (0-4095): 40 - Voltage: 241 - Dust Density: 40
Dmuchnięcie chmurą:
Pomiar ADC (0-4095): 523 - Voltage: 3162 - Dust Density: 537
Pomiar ADC (0-4095): 524 - Voltage: 3168 - Dust Density: 538
Pomiar ADC (0-4095): 437 - Voltage: 2642 - Dust Density: 449
Pomiar ADC (0-4095): 525 - Voltage: 3174 - Dust Density: 539
Pomiar ADC (0-4095): 492 - Voltage: 2975 - Dust Density: 505
Pomiar ADC (0-4095): 469 - Voltage: 2836 - Dust Density: 482
Pomiar ADC (0-4095): 472 - Voltage: 2854 - Dust Density: 485
Pomiar ADC (0-4095): 521 - Voltage: 3150 - Dust Density: 535
Pomiar ADC (0-4095): 447 - Voltage: 2703 - Dust Density: 459
Pomiar ADC (0-4095): 381 - Voltage: 2303 - Dust Density: 391
Pomiar ADC (0-4095): 457 - Voltage: 2763 - Dust Density: 469
Pomiar ADC (0-4095): 495 - Voltage: 2993 - Dust Density: 508
Pomiar ADC (0-4095): 356 - Voltage: 2152 - Dust Density: 365
Pomiar ADC (0-4095): 230 - Voltage: 1390 - Dust Density: 236
Pomiar ADC (0-4095): 147 - Voltage: 888 - Dust Density: 150
Pomiar ADC (0-4095): 340 - Voltage: 2055 - Dust Density: 349
Pomiar ADC (0-4095): 311 - Voltage: 1880 - Dust Density: 319
Pomiar ADC (0-4095): 64 - Voltage: 387 - Dust Density: 65
Pomiar ADC (0-4095): 387 - Voltage: 2340 - Dust Density: 397
Pomiar ADC (0-4095): 163 - Voltage: 985 - Dust Density: 167
Pomiar ADC (0-4095): 222 - Voltage: 1342 - Dust Density: 228
Pomiar ADC (0-4095): 123 - Voltage: 743 - Dust Density: 126
Pomiar ADC (0-4095): 98 - Voltage: 592 - Dust Density: 100
Pomiar ADC (0-4095): 61 - Voltage: 368 - Dust Density: 62
Pomiar ADC (0-4095): 66 - Voltage: 399 - Dust Density: 67
Pomiar ADC (0-4095): 65 - Voltage: 393 - Dust Density: 66
Pomiar ADC (0-4095): 257 - Voltage: 1554 - Dust Density: 264
Pomiar ADC (0-4095): 195 - Voltage: 1179 - Dust Density: 200
Pomiar ADC (0-4095): 44 - Voltage: 266 - Dust Density: 45
Pomiar ADC (0-4095): 69 - Voltage: 417 - Dust Density: 70
Pomiar ADC (0-4095): 63 - Voltage: 380 - Dust Density: 64
Pomiar ADC (0-4095): 64 - Voltage: 387 - Dust Density: 65
Pomiar ADC (0-4095): 126 - Voltage: 761 - Dust Density: 129
Pomiar ADC (0-4095): 83 - Voltage: 501 - Dust Density: 85
Pomiar ADC (0-4095): 183 - Voltage: 1106 - Dust Density: 188
Pomiar ADC (0-4095): 84 - Voltage: 507 - Dust Density: 86
Pomiar ADC (0-4095): 62 - Voltage: 374 - Dust Density: 63
Pomiar ADC (0-4095): 66 - Voltage: 399 - Dust Density: 67
Pomiar ADC (0-4095): 59 - Voltage: 356 - Dust Density: 60
Pomiar ADC (0-4095): 67 - Voltage: 405 - Dust Density: 68
Pomiar ADC (0-4095): 24 - Voltage: 145 - Dust Density: 24
Jak chcesz monitorować coś w ug/m3 to nie jest super wiarygodny czujnik, może i dałoby się go skalibrować, a bez kalibracji skąd będziesz widział co mierzysz? Zerknij sobie w podanym linku na krzywą kalibracyjną. Trochę gruba ta kreska na malutkim obrazku. Jak chcesz go położyć w kuchni i monitorować czy parówki nie uciekają z garnka to na pewno się przyda. Wystarczy ustawić alarm w okolice 200-300. W wydruku powyżej widać wyraźnie dmuchnięcie chmurą w okolice czujnika. Wyniki w okolicach 60, ale raz na kilkadziesiąt wpadnie i taki poniżej 10. Czy powinno tak skakać? Wg mnie tak. W powietrzu cały czas coś lata, widać to czasami w promieniach słonecznych przebijających się przez mrok. To czy laser w coś trafi to matematyczne prawdopodobieństwo. Powinno się pewnie wyciągać średnią z kilkudziesięciu pomiarów, ale wtedy nie zauważy takie skoku jak to widoczne dmuchnięcie.
Ja sobie tak dobrałem przeliczanie, by nie było wyników poniżej 0.
Kiedyś bawiłem się laserowymi licznikami cząstek do pomiarów skuteczności filtrów HEPA i były kalibrowane raz czy dwa do roku, koszt z wysyłką gdzieś w Europie 1000$. I to było gdzieś z 10-20% kosztów samego licznika. Także nie wymagam od czegoś za 5$ pomiarów jak z profesjonalnej stacji monitorującej jakość powietrza. Jak chcesz potwierdzić czy wyniki spadną w okolice 0 to możesz poszukać znajomej aptekarki, mają tam zazwyczaj na zapleczu w recepturze  loże laminarne z filtrami HEPA H14. Tam powietrze powinno być niemal idealnie czyste.
Położyłem go teraz w okolice otwartego okna, tereny z czystym powietrzem, przynajmniej o tej porze roku i pomiary oscylują wokół 50, ale skaczą mocno.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#20
Sporo sie dowiedziałem od Ciebie na temat czujnika szarpa, dzięki.
Robiłem układ na UNO z Twoim kodem, wyniki były całkiem inne, ale tez duzo stabilniejsze niz na esp.
Faktycznie gdyby układ wyciągał średnia z kliku pomiarów i zwracał mi taki wynik było by super, ale to jest poza moimi możliwościami i nie mam pojecie jak to zrobić
Puki co, muszę to co mam zmienić zeby nie miec wartosci ujemnych, bo co chwile mam wynik - 50, za moment 2 czy 80

Dziś w nocy działał czujnik w zamkniętym pokoju

Wynik prezentuje sie tak jak na załączonej grafice, od godzi 7.30 było otwarte okno i klucie ścian w pomieszczeniu obok. Widać ze zapylenie sie podniosło. Wychodzi na to ze cos tam działa. 


Załączone pliki Miniatury
   
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości