Skocz do zawartości

Razor1996

Użytkownicy
  • Zawartość

    14
  • Rejestracja

  • Ostatnio

Wszystko napisane przez Razor1996

  1. Oto cały kod. #include <ESP8266WiFi.h> #include <OneWire.h> #include <DallasTemperature.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F,20,4); // set the LCD address to 0x3F for a 20 chars and 4 line display #define myPeriodic 5 //in sec | pub is 5sec #define ONE_WIRE_BUS 2 // DS18B20 on arduino pin2 corresponds to D4 on physical board #define ilosc 4 // ilość czujników - max 4 dla lcd 20x4 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature DS18B20(&oneWire); float prevTemp = 0; const char* server = "xxxxxxxxxxx"; String apiKey ="xxxxxxx"; const char* MY_SSID = "xxxxxxx"; const char* MY_PWD = "xxxxxxx"; int sent = 0; int licznik = 0; void setup() { Serial.begin(115200); connectWifi(); lcd.init(); // initialize the lcd lcd.backlight(); lcd.home(); lcd.setCursor(0, 0); // k/w lcd.print("Temp. 1: "); lcd.setCursor(0, 1); // k/w lcd.print("Temp. 2: "); lcd.setCursor(0, 2); // k/w lcd.print("Temp. 3: "); lcd.setCursor(0, 3); // k/w lcd.print("Temp. 4: "); } void loop() { float temp[ilosc]; //char buffer[10]; DS18B20.requestTemperatures(); licznik ++; for(int i=0;i<ilosc;i++){ temp[i] = DS18B20.getTempCByIndex(i); //String tempC = dtostrf(temp, 4, 1, buffer);//handled in sendTemp() //Serial.print(String(sent)+" Temperature: "); //Serial.println(temp); //if (temp != prevTemp) //{ //sendTeperatureTS(temp); //prevTemp = temp; //} lcd.setCursor(9, i); // k/w lcd.print(" "); lcd.setCursor(9, i); // k/w lcd.print(temp[i]); lcd.print(F(" C")); } if (licznik == myPeriodic) { sendTeperatureTS(temp); licznik = 0; } } void connectWifi() { Serial.print("Connecting to "+*MY_SSID); WiFi.begin(MY_SSID, MY_PWD); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println(""); Serial.println("Connected"); Serial.println(""); }//end connect void sendTeperatureTS(float temp[]) { WiFiClient client; if (client.connect(server, 9999)) { // use ip 184.106.153.149 or api.thingspeak.com Serial.println("WiFi Client connected "); String postStr = apiKey; //postStr += "&field1="; //postStr += String(temp); //postStr += "\r\n\r\n"; for(int i=0;i<ilosc;i++){ postStr += "&field"; postStr += String(i+1); postStr += "="; postStr += String(temp[i]); } client.print("POST /update HTTP/1.1\n"); client.print("Host: api.thingspeak.com\n"); client.print("Connection: close\n"); client.print("X-THINGSPEAKAPIKEY: " + apiKey + "\n"); client.print("Content-Type: application/x-www-form-urlencoded\n"); client.print("Content-Length: "); client.print(postStr.length()); client.print("\n\n"); client.print(postStr); delay(1000); }//end if sent++; client.stop(); }//end send EDIT: Już wiem gdzie leży problem! Gdy program odbierający dane po wifi nie jest włączony ta funkcja (connect): if (client.connect(server, 9999)) { // use ip 184.106.153.149 or api.thingspeak.com Serial.println("WiFi Client connected "); Czeka aż 5 sekund na odpowiedź programu, którego praca przez ten cały czas jest wstrzymana. Dlatego też chciałbym zmienić timeout tej funkcji na inną wartość. Ale nigdzie nie mogę go znaleźć. Trzeba przeszukiwać bilbioteki, ponieważ "normalnie" zmienić tylko można client.connect(ip, port) ip i port.
  2. Witam, Konstruuje termometr który wyświetla zarówno temperatury na wyświetlaczu jak i wysyła ja po wifi. Bazuje na pewnym gotowym projekcie, lecz muszę nanieść kilka zmian. Jedna z nich to wyświetlanie na LCD każdej odczytanej temperatury, a wysyłanie po wifi tylko co np. 5 - ta ilość jest zadawana w programie poprzez define. Problem wydawał mi się banalny lecz niestety sposób w jaki chciałem go rozwiązać jest nieskuteczny. Oto kod oryginalny: void loop() { float temp[ilosc]; //char buffer[10]; DS18B20.requestTemperatures(); for(int i=0;i<ilosc;i++){ temp[i] = DS18B20.getTempCByIndex(i); //String tempC = dtostrf(temp, 4, 1, buffer);//handled in sendTemp() //Serial.print(String(sent)+" Temperature: "); //Serial.println(temp); //if (temp != prevTemp) //{ //sendTeperatureTS(temp); //prevTemp = temp; //} lcd.setCursor(9, i); // k/w lcd.print(" "); lcd.setCursor(9, i); // k/w lcd.print(temp[i]); lcd.print(F(" C")); } sendTeperatureTS(temp); int count = myPeriodic; while(count--) delay(1000); } A tak wyglądają moje poprawki void loop() { float temp[ilosc]; //char buffer[10]; DS18B20.requestTemperatures(); licznik ++; for(int i=0;i<ilosc;i++){ temp[i] = DS18B20.getTempCByIndex(i); //String tempC = dtostrf(temp, 4, 1, buffer);//handled in sendTemp() //Serial.print(String(sent)+" Temperature: "); //Serial.println(temp); //if (temp != prevTemp) //{ //sendTeperatureTS(temp); //prevTemp = temp; //} lcd.setCursor(9, i); // k/w lcd.print(" "); lcd.setCursor(9, i); // k/w lcd.print(temp[i]); lcd.print(F(" C")); } if (licznik == myPeriodic) { sendTeperatureTS(temp); licznik = 0; } } Lecz niestety po poprawkach nodemcu wysyła serie temperatur pod rząd i następuje przerwa (jakby czekało na odczyty temperatur ale trwa to kilka sekund). A ja chciałbym aby po każdym odczycie został on wyświetlony na LCD. Zawsze używałem funkcji if (sensors.available()) lecz w tych bibliotekach ona chyba nie istnieje... Podsumowując brakuje mi funkcji która "wiedziałaby" że własnie odczytano temperaturę, dzięki czemu mógłbym ją wyświetlić i czekać na kolejną. Biblioteki użyte w programie to #include #include
  3. Mowa o Arduino Pro Mini - 3.3V Czyli jeśli 3,3V poradzi sobie spokojnie z logiką LCD wystarczy po prostu podpiąć wszystko normalnie z jedną zmianą zasilać LCD nie z arduino, a z osobnego zasilania 5V (masy zasilacza i arduino w tym wypadku trzeba połączyć) Czy dobrze rozumuje?
  4. Chyba już rozumiem ale dla pewności dopytam Jeżeli ten schemat pasuje również do w/w konwertera z aliexpress'u to zasilanie 3,3V podłączam z arduino. Nastepnie SCL z SCL, SDA z SDA (oczywiście od arduino po stronie 3,3V) Następnie podłączam osobne zasilanie z zasilacza 5V pod 5V i to zasilanie do VCC w LCD. Czy wymogiem jest aby arduino i LCD było zasilane z jednego zasilacza (wspólna masa?)
  5. To jest dokładnie ten konwerter o którym pisałem ale czy poradzi on sobie z zwiększeniem napięcia zasilania podświetlenia (natężenie prądu będzie na pewno o wiele większe niż na pinach logicznych)
  6. Witam, mam pytanie jak rozwiązać problem podłączenia lcd 5V I2C pod niższe napięcie niż jest dla niego wymagane. Wyczytałem w internecie, że 3,3V powinno spokojnie zasilić logikę wyświetlacza ale mogą być problemy z podświetleniem. Jak dla mnie zrobienie osobnego zasilania dla LCD nie stanowi problemu tylko jak je podłączyć pod I2C żeby nie uszkodzić arduino? Konwerter poziomów logicznych w tym wypadku raczej nie pomoże?
  7. Co prawda do przerobienia został mi jeszcze "czujnik odległości HC-SR04" Ale już chciałbym zapytać kiedy mniej więcej można się spodziewać pierwszej części kursu (z opisem potrzebnych elementów) dla średnio zaawansowanych, pytam bo mam zamiar zamówić zestaw do kursu elektroniki z Botland'u i chciałbym zamówić oba zestawy na raz, żeby zaoszczędzić na przesyłce
  8. Witam, W sumie to widzę, że w kodach poprzedników jest ten sam "błąd" ale ja jednak chciałbym dowiedzieć się jak to naprawić. A więc program działa dobrze jeżeli wpiszemy do "szeregowego monitora" jeden znak. Natomiast jeśli wpiszę np. zxcvbn to zaświeci mi się dioda (bo pierwsza litera to prawidłowe "z" i wyskoczy mi 5 razy, że wpisałem złą liczbę kolejno dla x, c, v, b, n. Wiecie jak temu zaradzić? Oto kod: #define zielona 8 #define czerwona 9 int odebraneDane = 0; //Pusty ciąg odebranych danych void setup() { Serial.begin(9600); //Uruchomienie komunikacji pinMode(zielona, OUTPUT); //Konfiguracja wyjść pinMode(czerwona, OUTPUT); digitalWrite(zielona, LOW); //Wyłączamy diody digitalWrite(czerwona, LOW); } void loop() { if(Serial.available() > 0) { //Czy Arduino odebrano dane //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane odebraneDane = Serial.read(); switch (odebraneDane) { case 'z': //Jeśli odebrano "z" digitalWrite(zielona, HIGH); //To włączamy diodę zieloną delay(1000); digitalWrite(zielona, LOW); break; case 'c': //Jeśli odebrano "c" digitalWrite(czerwona, HIGH); //To włączamy diodę czerwoną delay(1000); digitalWrite(czerwona, LOW); break; default: Serial.println("Podano zly kolor, podaj [z] dla diody zielonej"); Serial.println("[c] dla diody czerwonej"); break; } } }
  9. Teraz już wszystko powinno być ok, ale mam pytanie co do funkcji if, bo w Twoich kodach nie dajesz "{" w nowej lini tylko po nawiesie if () { i wtedy jest problem z tym aby druga klamra była w tej samej kolumnie. Inaczej mówiąc jak lepiej robić: if (ziel == false) { // jeśli zielona dioda jest wyłączona digitalWrite(zielona, HIGH); //To włączamy diodę zieloną ziel = true; // pokazujemy, że dioda jest włączona } else { // jeśli dioda jest włączona czy if (ziel == false) { // jeśli zielona dioda jest wyłączona digitalWrite(zielona, HIGH); //To włączamy diodę zieloną ziel = true; // pokazujemy, że dioda jest włączona } else { // jeśli dioda jest włączona (tylko wtedy nawiasy klamrowe nie są w jednej kolumnie) Oto kod: #define zielona 8 #define czerwona 9 String odebraneDane = ""; //Pusty ciąg odebranych danych boolean ziel = ""; boolean czer = ""; void setup() { Serial.begin(9600); //Uruchomienie komunikacji pinMode(zielona, OUTPUT); //Konfiguracja wyjść pinMode(czerwona, OUTPUT); digitalWrite(zielona, LOW); //Wyłączamy diody digitalWrite(czerwona, LOW); ziel = false; czer = false; } void loop() { odebraneDane = Serial.readStringUntil('\n'); if (odebraneDane == "zielona") { //Jeśli odebrano słowo "zielona" if (ziel == false) { // jeśli zielona dioda jest wyłączona digitalWrite(zielona, HIGH); //To włączamy diodę zieloną ziel = true; // pokazujemy, że dioda jest włączona } else { // jeśli dioda jest włączona digitalWrite(zielona, LOW); //To wyłączamy diodę zieloną ziel = false; // pokazujemy, że dioda zielona jest wyłączona } } if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona" if (czer == false) { // jeśli czerwona dioda jest wyłączona digitalWrite(czerwona, HIGH); //To włączamy diodę czerwoną czer = true; // pokazujemy, że dioda jest włączona } else { // jeśli dioda jest włączona digitalWrite(czerwona, LOW); //To wyłączamy diodę czerwoną czer = false; // pokazujemy, że dioda czerwona jest wyłączona } } }
  10. Ok, dziękuje zaraz zastosuje się do w/w wskazówek. Dodam, że błąd już znalazłem nie chciało mi się pisać dla diody czerwonej osobno linijek więc przekopiowałem dla zielonej i pozmieniałem nazwy, jednej nie zmieniłem i temu nie działało. Gotowy działający program: #define zielona 8 #define czerwona 9 String odebraneDane = ""; //Pusty ciąg odebranych danych boolean ziel = ""; boolean czer = ""; void setup() { Serial.begin(9600); //Uruchomienie komunikacji pinMode(zielona, OUTPUT); //Konfiguracja wyjść pinMode(czerwona, OUTPUT); digitalWrite(zielona, LOW); //Wyłączamy diody digitalWrite(czerwona, LOW); ziel = false; czer = false; } void loop() { odebraneDane = Serial.readStringUntil('\n'); if (odebraneDane == "zielona") { //Jeśli odebrano słowo "zielona" if (ziel == false) { // jeśli zielona dioda jest wyłączona digitalWrite(zielona, HIGH); //To włączamy diodę zieloną ziel = true; // pokazujemy, że dioda jest włączona } else { // jeśli dioda jest włączona digitalWrite(zielona, LOW); //To wyłączamy diodę zieloną ziel = false; // pokazujemy, że dioda zielona jest wyłączona } } if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona" if (czer == false) { // jeśli czerwona dioda jest wyłączona digitalWrite(czerwona, HIGH); //To włączamy diodę czerwoną czer = true; // pokazujemy, że dioda jest włączona } else { // jeśli dioda jest włączona digitalWrite(czerwona, LOW); //To wyłączamy diodę czerwoną czer = false; // pokazujemy, że dioda czerwona jest wyłączona } } } Edit: Czy teraz estetycznie jest OK oraz czy w dobry sposób rozwiązałem zadanie?
  11. Szczerze mówiąc nie znam reguł dawania wcięć, więc zrobiłem to na wyczucie Oto kod: #define zielona 8 #define czerwona 9 String odebraneDane = ""; //Pusty ciąg odebranych danych boolean ziel = ""; boolean czer = ""; void setup() { Serial.begin(9600); //Uruchomienie komunikacji pinMode(zielona, OUTPUT); //Konfiguracja wyjść pinMode(czerwona, OUTPUT); digitalWrite(zielona, LOW); //Wyłączamy diody digitalWrite(czerwona, LOW); ziel = false; czer = false; } void loop() { if(Serial.available() > 0) { //Czy Arduino odebrano dane //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane odebraneDane = Serial.readStringUntil('\n'); if (odebraneDane == "zielona") { //Jeśli odebrano słowo "zielona" if (ziel == false) { // jeśli zielona dioda jest wyłączona digitalWrite(zielona, HIGH); //To włączamy diodę zieloną ziel = true; // pokazujemy, że dioda jest włączona } else { // jeśli dioda jest włączona digitalWrite(zielona, LOW); //To wyłączamy diodę zieloną ziel = false; // pokazujemy, że dioda zielona jest wyłączona } } if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona" if (czer == false) { // jeśli czerwona dioda jest wyłączona digitalWrite(czerwona, HIGH); //To włączamy diodę czerwoną czer = true; // pokazujemy, że dioda jest włączona } else { // jeśli dioda jest włączona digitalWrite(czerwona, LOW); //To wyłączamy diodę czerwoną ziel = false; // pokazujemy, że dioda czerwona jest wyłączona } } } }
  12. To pomyśl jak to inaczej rozwiązać Np.: informacja o złym kolorze powinna być uzależniona od 3 warunku (i zmiennej pomocniczej) lub można połączyć warunki w taki sposób: if (odebraneDane == "zielona") { //Jeśli odebrano słowo "zielona" digitalWrite(zielona, HIGH); //To włączamy diodę zieloną delay(1000); digitalWrite(zielona, LOW); } else if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona" Poradziłem sobie z tym zadaniem dokładnie w taki sposób (nie ukrywam że podejrzałem jakiś z wcześniejszych komentarzy myśląc, że mój sposób również zadziała, więc później miałem już gotowy pomysł) nie zdążyłem tego oznajmić bo tak wciągnęło mnie zadanie 2.5 które mi prawie działa: jeśli włączę czerwoną diodę i następnie zieloną to wszystko jest OK, a jak włączę diodę zieloną to później mogę tylko ją włączać lub wyłączać. Oto mój kod: #define zielona 8 #define czerwona 9 String odebraneDane = ""; //Pusty ciąg odebranych danych boolean ziel = ""; boolean czer = ""; void setup() { Serial.begin(9600); //Uruchomienie komunikacji pinMode(zielona, OUTPUT); //Konfiguracja wyjść pinMode(czerwona, OUTPUT); digitalWrite(zielona, LOW); //Wyłączamy diody digitalWrite(czerwona, LOW); ziel = false; czer = false; } void loop() { if(Serial.available() > 0) { //Czy Arduino odebrano dane //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane odebraneDane = Serial.readStringUntil('\n'); if (odebraneDane == "zielona") { //Jeśli odebrano słowo "zielona" if (ziel == false) { // jeśli zielona dioda jest wyłączona digitalWrite(zielona, HIGH); //To włączamy diodę zieloną ziel = true; // pokazujemy, że dioda jest włączona } else { // jeśli dioda jest włączona digitalWrite(zielona, LOW); //To wyłączamy diodę zieloną ziel = false; // pokazujemy, że dioda zielona jest wyłączona } } if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona" if (czer == false) { // jeśli czerwona dioda jest wyłączona digitalWrite(czerwona, HIGH); //To włączamy diodę czerwoną czer = true; // pokazujemy, że dioda jest włączona } else { // jeśli dioda jest włączona digitalWrite(czerwona, LOW); //To wyłączamy diodę czerwoną ziel = false; // pokazujemy, że dioda czerwona jest wyłączona } } } }
  13. Zrobiłem tak na początku ale jest to błędne, zauważ, że jeśli wpiszesz słowo "zielona" to warunek z czerwoną diodą nie zostanie spełniony więc zadziała funkcja else i wyświetli komunikat o złym kolorze mimo, że był dobry.
  14. Witam, wydawało mi się, że w ten sposób uda mi się sprostać temu zadaniu. Niestety jednak komunikat nie chce się wyświetlać,a ja nie mogę za nic znaleźć błędu. Wklejam kod: #define zielona 8 #define czerwona 9 String odebraneDane = ""; //Pusty ciąg odebranych danych void setup() { Serial.begin(9600); //Uruchomienie komunikacji pinMode(zielona, OUTPUT); //Konfiguracja wyjść pinMode(czerwona, OUTPUT); digitalWrite(zielona, LOW); //Wyłączamy diody digitalWrite(czerwona, LOW); } void loop() { if(odebraneDane == "zielona","czerwona"){ //Jeśli odebrano słowo "zielona" lub "czerwona" if(Serial.available() > 0) { //Czy Arduino odebrało dane //Jeśli tak, to odczytaj je do znaku końca linii i zapisz w zmiennej odebraneDane odebraneDane = Serial.readStringUntil('\n'); if (odebraneDane == "zielona") { //Jeśli odebrano słowo "zielona" digitalWrite(zielona, HIGH); //To włączamy diodę zieloną delay(1000); digitalWrite(zielona, LOW); } if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona" digitalWrite(czerwona, HIGH); //To włączamy diodę czerwoną delay(1000); digitalWrite(czerwona, LOW); } } } else { // Jeśli nie odebrano słowa "zielona" lub "czerwona" Serial.println("Podano zly kolor"); //Wyświetl komunikat } }
×
×
  • Utwórz nowe...