آی پی امداد
abtahi
آریا الکترونیک mehrinfo تکشو

استفاده از برد آردوینو uno و esp8266 برای انتقال اطلاعات سنسور

ramiy

کاربر
2013-03-30
3
0
سلام
وقتتون بخیر دوستان
من برای پروژه ای نیاز دارم تا اطلاعات دوتا سنسور رو به یک سرور یا پایگاه داده بفرستم
با برد nodemcu اینکارو کردم و از پروتکل mqtt استفاده کردم
اما چون یک سنسور شمارنده دارم (هال) و داخل کدش از تابع intrupt استفاده کردم اتصال wifi دچار اختلال میشه و کلا nodemcu از این تابع پشتیبانی نمیکنه

حالا یک برد arduino uno دارم به همراه ماژول esp8266 و سوال دارم راجب راه اندازی و انتقال دیتا روی این ساختار
ممنون میشم دوستان من رو رهنمایی کنند و حتی راهکار بهتری بهم بگن
 

ramiy

کاربر
2013-03-30
3
0
ممنونم از کمکتون دوست عزیز
فقط ممکن هست یکم بیشتر توضیح بدین بهم
این فریمور رو برای آپدیت nodemcu استفاده کنم یا چی ؟
ممنونم
 

Max8050

کاربر vip
کاربر
2019-05-28
138
819
32
قبل از صدا زدن تابع اینتراپت ICACHE_RAM_ATTR رو اضافه کنید.
void ICACHE_RAM_ATTR rotaryInterrupt()
اطلاعات بیشتر:
تا حدود فرکانس 100 کیلوهرتز برای خواندن انکودر رو میتونید باهاش داشته باشید،
 
  • Like
واکنش‌ها[ی پسندها]: ramiy

ramiy

کاربر
2013-03-30
3
0
دوست عزیز من این کدی که شما فرمودین رو هم اضافه کردم اما باز هم فرآیند کانکت شدن به وای فای تو یه لوپ میافته که این تابع وقفه داره اختلال ایجاد میکنه داخلش
اما اگه اون خط رو کامنت کنم اوکی میشه
C++:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
volatile unsigned int count = 0;
unsigned long next = 1000;
unsigned int temp = 0;
//#define HALL D5
uint8_t HALL = D5;
int rpm;
//int HALL = 14;
/*unsigned long prevmillis; // To store time
  unsigned long duration; // To store time difference
  unsigned long lcdrefresh; // To store time for lcd to refresh
  int rpm; // RPM value
  boolean currentstate;
  boolean prevstate;
  int count;*/
// Update these with values suitable for your network.

const char* ssid = "iPhone";
const char* password = "Xx@123456";
const char* mqtt_server = "91.121.93.94";

WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE  (50)
char msg[MSG_BUFFER_SIZE];
int value = 0;

void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  randomSeed(micros());

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();

  // Switch on the LED if an 1 was received as first character
  if ((char)payload[0] == '1') {
    digitalWrite(BUILTIN_LED, LOW);   // Turn the LED on (Note that LOW is the voltage level
    // but actually the LED is on; this is because
    // it is active low on the ESP-01)
  } else {
    digitalWrite(BUILTIN_LED, HIGH);  // Turn the LED off by making the voltage HIGH
  }

}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("device-1/sensor-1", "MQTT Server is Connected");
      // ... and resubscribe
      client.subscribe("inTopic");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  pinMode(HALL, INPUT);
  //prevmillis = 0;
  //prevstate = LOW;
  ICACHE_RAM_ATTR attachInterrupt(digitalPinToInterrupt(HALL), magnet_detect, RISING);
}

void magnet_detect()
{
  //++count;
}

void loop() {
  /*currentstate = digitalRead(HALL); // Read IR sensor state
    if ( prevstate != currentstate) // If there is change in input
    {
    if ( currentstate == HIGH ) // If input only changes from LOW to HIGH
    {
      duration = ( micros() - prevmillis ); // Time difference between revolution in microsecond
      rpm = (60000000 / duration); // rpm = (1/ time millis)*1000*1000*60;
      prevmillis = micros(); // store time for nect revolution calculation
    }
    }
    prevstate = currentstate;
    Serial.println(rpm);*/
  /*currentstate = digitalRead(HALL);
    if ( prevstate != currentstate) {
    if ( currentstate == HIGH ) {
      count++;
    }

    }
      else {
      Serial.println("--");
    }
    Serial.println(count);*/

  if (millis() > next) {
    Serial.println(count);
    temp = count;
    //Serial.println(temp * 12);
    count -= temp;
    next += 1000;
  }
  rpm = temp * 12;
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  unsigned long now = millis();
  if (now - lastMsg > 1000) {
    lastMsg = now;
    ++value;
    snprintf (msg, MSG_BUFFER_SIZE, "%ld", rpm);
    //Serial.print("Publish message: ");
    //Serial.println(msg);
    client.publish("device-1/sensor-1", msg);
  }
}

این هم کدی که استفاده میکنم
 

meahdi

VIP+ افتخاری
کاربر
ممنونم از کمکتون دوست عزیز
فقط ممکن هست یکم بیشتر توضیح بدین بهم
این فریمور رو برای آپدیت nodemcu استفاده کنم یا چی ؟
ممنونم
اون فریمور رو باید با لودر خودش بزنید روی برد
برد به صورت اکسس پویونت بالا میاد
بعد یتنید وای فای خودتون رو معرفی کنید و رمز بدید تا وصل بشه به مودم ( یا اکسس پویونت ) و آماده به کار هست
میتونید از بخش تنظیمات هر دیوایسی رو اضافه کنید
انواع سنسور ها
انواع نمایشگر ها و .....
 

meahdi

VIP+ افتخاری
کاربر
این هم نمونه عکس هایی از منو
ببخشید اگه عکس ها زیاد هستند
1698091782655.png


1698091842358.png


1698091898740.png

1698091937934.png



1698092188759.png
 

Max8050

کاربر vip
کاربر
2019-05-28
138
819
32
void magnet_detect() { //++count; }
اون ماکرو قبل از روتین وقفه باید اضافه بشه
ینی اینشکلی میشه:

C:
void setup() {
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  pinMode(HALL, INPUT);
  //prevmillis = 0;
  //prevstate = LOW;
  attachInterrupt(digitalPinToInterrupt(HALL), magnet_detect, RISING);
}

void ICACHE_RAM_ATTR magnet_detect()
{
  count++;
}
 
بالا