www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Preklapljanje med dvema različnima programoma na eni plošči

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
programming
Član
Član



Pridružen-a: Sre 09 Jan 2013 19:58
Prispevkov: 33
Aktiv.: 0.24

PrispevekObjavljeno: Ned Dec 04, 2022 4:39 pm    Naslov sporočila:  Preklapljanje med dvema različnima programoma na eni plošči Odgovori s citatom

Zdravo,

Imam delujoč program arduino pri katerem gre za odčitavanje ADC vrednosti iz mikrofona in sicer ko ADC preseže določeno vrednost se sproži RGB LED lučka. Meritve se tekoče izvajajo ves čas od vklopa ESP8266 D1 mini plošče. Vse deluje odlično, sedaj pa sem programu želel dodati še povezavo do WIFI kjer bi na daljavo z mobilnim telefonom upravljal z RGB LED lučko, kar je sicer tudi uspelo ampak prihaja do prekinitev pri odčitavanju vrednosti ADC iz mikrofona ali do prekinitve WIFI. Torej, če programu dodam samo upravljanje prek WIFI deluje brezhibno ali če programu dodam samo mikrofon in RGB prav tako deluje, ko pa oboje združim ne deluje več pravilno.

Zanima me ali je mogoče nekako prekljapljati med dvema različnima programoma na isti plošči (ESP8266 D1 MINI)? Se pravi da se povežem z WIFI omrežjem samo ob pritisku tipke in ostanem povezan dokler se ne prekine WIFI povezava. Drugače pa mora program ves čas odčitavati vrednosti ADC, tudi takrat, ko je povezava WIFIizključena. Je to izvedljivo?

Hvala.

Koda:

#include <ESP8266WiFi.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif

#define BUTTON_PIN   D3
#define PIXEL_PIN    D1 
#define PIXEL_COUNT 7
 
const char* ssid = "********";
const char* password = "********";
 
Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

WiFiServer server(80);

const int soundpin = A0;              //mikrofon
const int vrednost = 780;             //vrednost sprožitve RGB
 
void setup() {
  Serial.begin(115200);
  delay(10);
  pinMode(soundpin, INPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  strip.begin();
  strip.show(); 

  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
 
  // Start the server
  server.begin();
  Serial.println("Server started");
 
  // Print the IP address
  Serial.println(WiFi.localIP());
}
 
void loop() {
    // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
 
  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }

  String req = client.readStringUntil('\r');
  Serial.println(req);

  int soundsens = analogRead(soundpin);
  Serial.println(soundsens);
  if (soundsens >= vrednost) {
  colorWipe(strip.Color(  0,   0, 255), 1);    // RGB Modra barva
  delay(1000);
  colorWipe(strip.Color(  0,   0,   0), 1);    // Izklopi RGB
  }

    int tipka = digitalRead(BUTTON_PIN);       
    if(tipka == LOW) { 
    colorWipe(strip.Color(255,   0,   0), 1);    // Rdeča
    delay(1000);
    colorWipe(strip.Color(  0,   0,   0), 1);    // Izklopi RGB
    delay(1000);
  }

  int val;
  if (req.indexOf("/BLUE") != -1)
  {
    colorWipe(strip.Color(  0,   0, 255), 50);
    delay(1000);
    colorWipe(strip.Color(  0,   0,   0), 1);    // Izklopi RGB
  }
  String web = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
  client.print(web);
  client.flush();
  }
 
void colorWipe(uint32_t color, int wait) {
  for(int i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, color);         
    strip.show();                         
    delay(wait);                           
  }
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
SimonS
Član
Član



Pridružen-a: Čet 01 Jul 2004 11:18
Prispevkov: 4580
Aktiv.: 20.63
Kraj: Kobarid

PrispevekObjavljeno: Ned Dec 04, 2022 6:49 pm    Naslov sporočila:   Odgovori s citatom

Mogoče bi bral ADC im prižigal LED preko prekinitev. V tem primeru ga wifi nebi smel motit
_________________
Lep dan
Simon
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Proteus
Član
Član



Pridružen-a: Sre 15 Jun 2005 10:03
Prispevkov: 1781
Aktiv.: 8.02

PrispevekObjavljeno: Pon Dec 05, 2022 11:50 am    Naslov sporočila:   Odgovori s citatom

Najprej pri večopravilnosti se ne uporablja Delay(nn).

Lahko sicer uporabiš prekinitve, kot je predlagal SimonS a niso temu namenjene.

Običajno se na mc-jih za večopravilnost uporablja FSM način programiranja:
https://www.codeproject.com/Articles/1275479/State-Machine-Design-in-C

V tvojem primeru lahko narediš tudi dve funkciji med katerima potem v loop() zanki preklapljaš glede na tvoje pogoje.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group