Помогите соединить два скетча

arkantok
Offline
Зарегистрирован: 22.01.2022

Есть два кода, один для сервопривода, другой для амперметра, каждый выводит данные в ексель, никак не могу написать код, просто ничего не работает 

Вот код для сервопривода 

#include <Servo.h> // подключение библиотеки Servo
Servo servo1;// 
Servo servo2;// газ
const int pinServo1=10; // Пин для подключения сервопривода
const int pinServo2=11; // Пин для подключения сервопривода
const int POT1=0; // Аналоговый вход 0 для подключения потенциометра
const int POT2=1; // Аналоговый вход 1 для подключения потенциометра

int row_excel = 0; // количество строк
int valpot1 = 0; // переменная для хранения значения потенциометра
int valpot2 = 0; // переменная для хранения значения потенциометра
int angleServo1 = 0; // переменная для хранения угла поворота сервы
int angleServo2 = 0; // переменная для хранения угла поворота сервы
void setup()
{
  Serial.begin(9600);  // инициализируем последовательный порт, скорость 9600
  Serial.println("CLEARDATA"); // очистка листа excel
  Serial.println("LABEL,Time,angleServo1, angleServo2, row_excel,  ,  ,  "); // заголовки столбцов
// подключить переменную servo к выводу pinServo
servo1.attach(pinServo1);
servo2.attach(pinServo2);

}
void loop()
{ 

valpot1 = analogRead(POT1); // чтение данных потенциометра
valpot2 = analogRead(POT2); // чтение данных потенциометра
// масштабируем значение к интервалу 0-180
angleServo1=map(valpot1,0,1023,0,180);
angleServo2=map(valpot2,0,1023,0,180);
// поворот сервопривода на полученный угол
servo1.write(angleServo1);
servo2.write(angleServo2);
  row_excel++; // номер строки + 1
  Serial.print("DATA,TIME,"); // запись в excel текущей даты и времени
  Serial.print(angleServo1);
  Serial.print(",");
  Serial.print(angleServo2);
  Serial.print(",");
  Serial.println(row_excel);


    
delay (500);

}

Вот для амперметра 

#include <PZEM004Tv30.h>

PZEM004Tv30 pzem(8,9); // Software Serial pin 8 (RX) & 9 (TX)

int row_excel = 0; // количество строк
void setup() {
   Serial.begin(9600);
   Serial.println("CLEARDATA"); // очистка листа excel
  Serial.println("LABEL,Time,Voltage, Current, Power, Energy, Frequency, PF "); // заголовки столбцов
}

void loop() {
   float voltage = pzem.voltage();
   if(voltage != NAN){
       Serial.print("Voltage: ");
       Serial.print(voltage);
       Serial.println("V");
   } else {
       Serial.println("Error reading voltage");
   }

   float current = pzem.current();
   if(current != NAN){
       Serial.print("Current: ");
       Serial.print(current);
       Serial.println("A");
   } else {
       Serial.println("Error reading current");
   }

   float power = pzem.power();
   if(current != NAN){
       Serial.print("Power: ");
       Serial.print(power);
       Serial.println("W");
   } else {
       Serial.println("Error reading power");
   }

   float energy = pzem.energy();
   if(current != NAN){
       Serial.print("Energy: ");
       Serial.print(energy,3);
       Serial.println("kWh");
   } else {
       Serial.println("Error reading energy");
   }

   float frequency = pzem.frequency();
   if(current != NAN){
       Serial.print("Frequency: ");
       Serial.print(frequency, 1);
       Serial.println("Hz");
   } else {
       Serial.println("Error reading frequency");
   }

   float pf = pzem.pf();
   if(current != NAN){
       Serial.print("PF: ");
       Serial.println(pf);
   } else {
       Serial.println("Error reading power factor");
   }

   Serial.println();
    row_excel++; // номер строки + 1
    Serial.print("DATA,TIME,"); // запись в excel текущей даты и времени
   
       Serial.print(voltage);
   Serial.print(",");
      
       Serial.print(current);
       Serial.print(",");
    
       Serial.print(power);
  Serial.print(",");
    
       Serial.print(energy,3);
  Serial.print(",");
       
       Serial.print(frequency, 1);
       Serial.print(",");
     
       Serial.println(pf);
        Serial.print(",");
         Serial.println(row_excel);
    
   delay(1000);
}

Подскажите способы как их соединить, я пробовал и просто все в один код написать и использовать два потока ничего не выходит

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А что должно получиться-то?

Так-то их нетрудно соединить - командой cat.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Я бы поставил вопрос иначе:

-Чего ты желаешь, на самом деле, научиться соединять такие коды или соединить эти два кода?

arkantok
Offline
Зарегистрирован: 22.01.2022

Должен получиться скетч на одной ардуинке через который можно управлять сервоприводом и получать данные от датчика pzem004t 

 

arkantok
Offline
Зарегистрирован: 22.01.2022

Хочу научиться ведь мне нужно будет дальше соединять скетчи

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

arkantok пишет:

мне нужно будет дальше соединять скетчи

Сомнительный тезис.

Мне вот за многие годы ни разу не понадобилось.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

arkantok пишет:

Хочу научиться ведь мне нужно будет дальше соединять скетчи

Подскажите способы как их соединить, я пробовал и просто все в один код написать и использовать два потока ничего не выходит

Все это программирование автоматов. Но на этот аспект новички забивают болт. Как помочь человеку если он на это забивает болт.

arkantok
Offline
Зарегистрирован: 22.01.2022

А я знаю что мне понадобиться, так что помощь будет?

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

arkantok пишет:

так что помощь будет?

Конечно, нет. Вы не просили ни о какой помощи. Чтобы была помощь, нужно прочитать правила форума - в первой теме раздела Песочница - и правильно задать вопрос.

У Вас же нет никакой просьбы о помощи. Где Ваш объединённый скетч? Какие именно с ним проблемы? Вы не привели скетча и не задали никаких вопросов.

Вы хотите, чтобы кто-то просто сделал всю работу за Вас? Ну, тогда это не помощь Это заказ. В платном разделе за денюшку.

arkantok
Offline
Зарегистрирован: 22.01.2022

вот пробовал соединить через два потока, серво не работает, амперметр тоже

#include <PZEM004Tv30.h>
#include <Servo.h> // подключение библиотеки Servo
#include <Thread.h>  // подключение библиотеки ArduinoThread
PZEM004Tv30 pzem(8,9); // Software Serial pin 11 (RX) & 12 (TX)
Servo servo1;// повітря 
Servo servo2;// газ

Thread sThread = Thread(); // создаём поток управления светодиодом
Thread aThread = Thread(); // создаём поток управления сиреной

const int pinServo1=10; // Пин для подключения сервопривода
const int pinServo2=11; // Пин для подключения сервопривода
const int POT1=0; // Аналоговый вход A0 для подключения потенциометра
const int POT2=1; // Аналоговый вход A0 для подключения потенциометра

int row_excel = 0; // количество строк
int valpot1 = 0; // переменная для хранения значения потенциометра
int valpot2 = 0; // переменная для хранения значения потенциометра
int angleServo1 = 0; // переменная для хранения угла поворота сервы
int angleServo2 = 0; // переменная для хранения угла поворота сервы



void setup() {
  
    sThread.onRun(s);  // назначаем потоку задачу
   sThread.setInterval(1000); // задаём интервал срабатывания, мсек
    
    aThread.onRun(a);     // назначаем потоку задачу
    aThread.setInterval(20); // задаём интервал срабатывания, мсек
  servo1.attach(pinServo1);
servo2.attach(pinServo2);
   Serial.begin(9600);
   Serial.println("CLEARDATA"); // очистка листа excel
  Serial.println("LABEL,Time,Voltage, Current, Power, Energy, Frequency, PF, agle1, angle2 "); // заголовки столбцов
 
// подключить переменную servo к выводу pinServo

}

void loop() {
   if (sThread.shouldRun())
        sThread.run(); // запускаем поток
    
    // Проверим, пришло ли время сменить тональность сирены:
    if (aThread.shouldRun())
        aThread.run(); // запускаем поток
}
void s() { 
     float voltage = pzem.voltage();
   float current = pzem.current();
      float power = pzem.power();
    float energy = pzem.energy();
    float frequency = pzem.frequency();
    float pf = pzem.pf();
       row_excel++; // номер строки + 1
    Serial.print("DATA,TIME,"); // запись в excel текущей даты и времен
       Serial.print(voltage);
   Serial.print(",");
       Serial.print(current);
       Serial.print(",");
       Serial.print(power);
  Serial.print(",");
       Serial.print(energy,3);
  Serial.print(",");
  Serial.print(frequency, 1);
       Serial.print(",");
       Serial.println(pf);
}
void a() { 
      valpot1 = analogRead(POT1); // чтение данных потенциометра
valpot2 = analogRead(POT2); // чтение данных потенциометра
// масштабируем значение к интервалу 0-180
angleServo1=map(valpot1,0,1023,0,180);
angleServo2=map(valpot2,0,1023,0,180);
// поворот сервопривода на полученный угол
servo1.write(angleServo1);
servo2.write(angleServo2);
    row_excel++; // номер строки + 1
    Serial.print("DATA,TIME,"); // запись в excel текущей даты и времен
        Serial.print(angleServo1);
  Serial.print(",");
  Serial.print(angleServo2);
  Serial.print(",");
  Serial.println(row_excel);  
}

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Можно и помочь, пациент вроде не безнадежен, нет?

------------------

Не забивай себе голову дурацкими библиотеками пока. У тебя две задачи, одна из них постоянно читает нечто (потенциометр), а другая просто раз в сек печатает, так? Вторую оформи так, как моргают диодиком в "блинк без делей". На фоне работы первой.

Если напишешь, что не понял... будет жаль ;)))))

arkantok
Offline
Зарегистрирован: 22.01.2022

Спасибо за ответ, сейчас иду пробовать

lilik
Offline
Зарегистрирован: 19.10.2017

Ух ты! Есть библиотеки для разделения потоков!

 В исходных скетчах вроде всё просто для объединения и без. Может не работает из-за несовместимости библиотек?

Вот этот пример не поможет?

http://arduino.ru/forum/programmirovanie/obedinenie-dvukh-sketch-kodov#c...

arkantok
Offline
Зарегистрирован: 22.01.2022

Кажется что код рабочий, амперметр читает раз в две секунды, но данных просто нет, а сервопривод крутится до упора и не работает (по отдельности все работает)

#include <PZEM004Tv30.h>
#include <Servo.h> // подключение библиотеки Servo
PZEM004Tv30 pzem(8,9); // Software Serial pin 11 (RX) & 12 (TX)
Servo servo1;// повітря 
Servo servo2;// газ
const int pinServo1=10; // Пин для подключения сервопривода
const int pinServo2=11; // Пин для подключения сервопривода
const int POT1=0; // Аналоговый вход A0 для подключения потенциометра
const int POT2=1; // Аналоговый вход A0 для подключения потенциометра

int row_excel = 0; // количество строк
int valpot1 = 0; // переменная для хранения значения потенциометра
int valpot2 = 0; // переменная для хранения значения потенциометра
int angleServo1 = 0; // переменная для хранения угла поворота сервы
int angleServo2 = 0; // переменная для хранения угла поворота сервы

long previousMillis = 0;       
 
long interval = 2000;           
void setup() {
  
  servo1.attach(pinServo1);
servo2.attach(pinServo2);
   Serial.begin(9600);
   Serial.println("CLEARDATA"); // очистка листа excel
  Serial.println("LABEL,Time,Voltage, Current, Power, Energy, Frequency, PF, agle1, angle2 "); // заголовки столбцов
 
// подключить переменную servo к выводу pinServo

}

void loop() {

valpot1 = analogRead(POT1); // чтение данных потенциометра
valpot2 = analogRead(POT2); // чтение данных потенциометра
// масштабируем значение к интервалу 0-180
angleServo1=map(valpot1,0,1023,0,180);
angleServo2=map(valpot2,0,1023,0,180);
// поворот сервопривода на полученный угол
servo1.write(angleServo1);
servo2.write(angleServo2);
 unsigned long currentMillis = millis();
  
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis; 
   float voltage = pzem.voltage();
   float current = pzem.current();
   float power = pzem.power();
   float energy = pzem.energy();
   float frequency = pzem.frequency();
   float pf = pzem.pf();
   
   Serial.println();
    row_excel++; // номер строки + 1
    Serial.print("DATA,TIME,"); // запись в excel текущей даты и времени
   
       Serial.print(voltage);
   Serial.print(",");
      
       Serial.print(current);
       Serial.print(",");
    
       Serial.print(power);
  Serial.print(",");
    
       Serial.print(energy,3);
  Serial.print(",");
       
       Serial.print(frequency, 1);
       Serial.print(",");
     
       Serial.println(pf);
        Serial.print(",");
          Serial.print(angleServo1);
  Serial.print(",");
  Serial.print(angleServo2);
  Serial.print(",");
         Serial.println(row_excel);   }


}

 

arkantok
Offline
Зарегистрирован: 22.01.2022

lilik пишет:

Вот этот пример не поможет?

 

Спасибо, сейчас попробую

arkantok
Offline
Зарегистрирован: 22.01.2022

lilik пишет:

Вот этот пример не поможет?

Честно я там ничего не понял, спасибо за помощь, но для меня там слишком тяжело

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

arkantok пишет:
Честно я там ничего не понял, спасибо за помощь, но для меня там слишком тяжело

Вот в этом Ваша проблема. Вы хотите написать (или за Вас написать код) в котором Вы ничего не поймете. 

// avtomat
const int ledPin =  LED_BUILTIN;
const long interval = 1000;
//
int state = LOW;
unsigned long past = 0;
void stand(int s) {
  past = millis();
  state = s;
  switch (state) {
    case LOW:
      digitalWrite(ledPin, LOW);
      break;
    case HIGH:
      digitalWrite(ledPin, HIGH);
      break;
  }
}
void run() {
  switch (state) {
    case LOW:
      if (millis() - past >= interval)stand(HIGH);
      break;
    case HIGH:
      if (millis() - past >= interval)stand(LOW);
      break;
  }
}
//-------------------
void setup() {
  pinMode(ledPin, OUTPUT);
  stand(LOW);
}
void loop() {
  run();
}

Так что забросьте непосильное Вам дело.

lilik
Offline
Зарегистрирован: 19.10.2017

arkantok пишет:

Кажется что код рабочий, амперметр читает раз в две секунды, но данных просто нет, а сервопривод крутится до упора и не работает (по отдельности все работает)

А библиотеки совместимы?

Выбросьте часть кода в лууп про амперметр - сервы будут правильно крутиться?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

попробуй перенести сервы на 6 и 7 пины
 

const int pinServo1=6; // Пин для подключения сервопривода
const int pinServo2=7; // Пин для подключения сервопривода

Не поможет, тогда еще можно закинуть локально библиотеку SoftwareSerial.h и поправить чуток

Да! Есть некоторое количество ошибок, я поправил их, как мог, попробуй, не взлетит надо будет думать
 

#include <PZEM004Tv30.h>
#include <SoftwareSerial.h>
uint8_t PZEM_RX_PIN = 8;
uint8_t PZEM_TX_PIN = 9;
SoftwareSerial pzemSWSerial(PZEM_RX_PIN, PZEM_TX_PIN);
PZEM004Tv30 pzem(pzemSWSerial); // Software Serial pin 8 (RX) & 9 (TX)

#include <Servo.h> // подключение библиотеки Servo
uint8_t pinServo1 = 6; // Пин для подключения сервопривода
uint8_t pinServo2 = 7; // Пин для подключения сервопривода
Servo servo1;// повітря
Servo servo2;// газ

const int POT1 = 0; // Аналоговый вход A0 для подключения потенциометра
const int POT2 = 1; // Аналоговый вход A0 для подключения потенциометра

int row_excel = 0; // количество строк
int valpot1 = 0; // переменная для хранения значения потенциометра
int valpot2 = 0; // переменная для хранения значения потенциометра
int angleServo1 = 0; // переменная для хранения угла поворота сервы
int angleServo2 = 0; // переменная для хранения угла поворота сервы

volatile uint32_t previousMillis = 0;
uint32_t interval = 2000;


void setup() {

  servo1.attach(pinServo1);
  servo2.attach(pinServo2);
  Serial.begin(9600);
  Serial.println("CLEARDATA"); // очистка листа excel
  Serial.println("LABEL,Time,Voltage, Current, Power, Energy, Frequency, PF, agle1, angle2 "); // заголовки столбцов

  // подключить переменную servo к выводу pinServo

}

void loop() {

  valpot1 = analogRead(POT1); // чтение данных потенциометра
  valpot2 = analogRead(POT2); // чтение данных потенциометра
  // масштабируем значение к интервалу 0-180
  angleServo1 = map(valpot1, 0, 1023, 0, 180);
  angleServo2 = map(valpot2, 0, 1023, 0, 180);
  // поворот сервопривода на полученный угол
  servo1.write(angleServo1);
  servo2.write(angleServo2);
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    float voltage = pzem.voltage();
    float current = pzem.current();
    float power = pzem.power();
    float energy = pzem.energy();
    float frequency = pzem.frequency();
    float pf = pzem.pf();

    Serial.println();
    row_excel++; // номер строки + 1
    Serial.print("DATA,TIME,"); // запись в excel текущей даты и времени

    Serial.print(voltage);
    Serial.print(",");

    Serial.print(current);
    Serial.print(",");

    Serial.print(power);
    Serial.print(",");

    Serial.print(energy, 3);
    Serial.print(",");

    Serial.print(frequency, 1);
    Serial.print(",");

    Serial.println(pf);
    Serial.print(",");
    Serial.print(angleServo1);
    Serial.print(",");
    Serial.print(angleServo2);
    Serial.print(",");
    Serial.println(row_excel);
  }
}

 

arkantok
Offline
Зарегистрирован: 22.01.2022

ua6em пишет:

попробуй перенести сервы на 6 и 7 пины
 

А зачем? на 6 и 7 пине что должно поменяться? ?

arkantok
Offline
Зарегистрирован: 22.01.2022

ua6em пишет:

попробуй перенести сервы на 6 и 7 пины
 

const int pinServo1=6; // Пин для подключения сервопривода
const int pinServo2=7; // Пин для подключения сервопривода

Не поможет, тогда еще можно закинуть локально библиотеку SoftwareSerial.h и поправить чуток

Да! Есть некоторое количество ошибок, я поправил их, как мог, попробуй, не взлетит надо будет думать
 

#include <PZEM004Tv30.h>
#include <SoftwareSerial.h>
uint8_t PZEM_RX_PIN = 8;
uint8_t PZEM_TX_PIN = 9;
SoftwareSerial pzemSWSerial(PZEM_RX_PIN, PZEM_TX_PIN);
PZEM004Tv30 pzem(pzemSWSerial); // Software Serial pin 8 (RX) & 9 (TX)

#include <Servo.h> // подключение библиотеки Servo
uint8_t pinServo1 = 6; // Пин для подключения сервопривода
uint8_t pinServo2 = 7; // Пин для подключения сервопривода
Servo servo1;// повітря
Servo servo2;// газ

const int POT1 = 0; // Аналоговый вход A0 для подключения потенциометра
const int POT2 = 1; // Аналоговый вход A0 для подключения потенциометра

int row_excel = 0; // количество строк
int valpot1 = 0; // переменная для хранения значения потенциометра
int valpot2 = 0; // переменная для хранения значения потенциометра
int angleServo1 = 0; // переменная для хранения угла поворота сервы
int angleServo2 = 0; // переменная для хранения угла поворота сервы

volatile uint32_t previousMillis = 0;
uint32_t interval = 2000;


void setup() {

  servo1.attach(pinServo1);
  servo2.attach(pinServo2);
  Serial.begin(9600);
  Serial.println("CLEARDATA"); // очистка листа excel
  Serial.println("LABEL,Time,Voltage, Current, Power, Energy, Frequency, PF, agle1, angle2 "); // заголовки столбцов

  // подключить переменную servo к выводу pinServo

}

void loop() {

  valpot1 = analogRead(POT1); // чтение данных потенциометра
  valpot2 = analogRead(POT2); // чтение данных потенциометра
  // масштабируем значение к интервалу 0-180
  angleServo1 = map(valpot1, 0, 1023, 0, 180);
  angleServo2 = map(valpot2, 0, 1023, 0, 180);
  // поворот сервопривода на полученный угол
  servo1.write(angleServo1);
  servo2.write(angleServo2);
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    float voltage = pzem.voltage();
    float current = pzem.current();
    float power = pzem.power();
    float energy = pzem.energy();
    float frequency = pzem.frequency();
    float pf = pzem.pf();

    Serial.println();
    row_excel++; // номер строки + 1
    Serial.print("DATA,TIME,"); // запись в excel текущей даты и времени

    Serial.print(voltage);
    Serial.print(",");

    Serial.print(current);
    Serial.print(",");

    Serial.print(power);
    Serial.print(",");

    Serial.print(energy, 3);
    Serial.print(",");

    Serial.print(frequency, 1);
    Serial.print(",");

    Serial.println(pf);
    Serial.print(",");
    Serial.print(angleServo1);
    Serial.print(",");
    Serial.print(angleServo2);
    Serial.print(",");
    Serial.println(row_excel);
  }
}

 

спасибо за код, иду подключать

 

arkantok
Offline
Зарегистрирован: 22.01.2022

ua6em пишет:

попробуй перенести сервы на 6 и 7 пины
 

const int pinServo1=6; // Пин для подключения сервопривода
const int pinServo2=7; // Пин для подключения сервопривода

Не поможет, тогда еще можно закинуть локально библиотеку SoftwareSerial.h и поправить чуток

Да! Есть некоторое количество ошибок, я поправил их, как мог, попробуй, не взлетит надо будет думать
 

#include <PZEM004Tv30.h>
#include <SoftwareSerial.h>
uint8_t PZEM_RX_PIN = 8;
uint8_t PZEM_TX_PIN = 9;
SoftwareSerial pzemSWSerial(PZEM_RX_PIN, PZEM_TX_PIN);
PZEM004Tv30 pzem(pzemSWSerial); // Software Serial pin 8 (RX) & 9 (TX)

#include <Servo.h> // подключение библиотеки Servo
uint8_t pinServo1 = 6; // Пин для подключения сервопривода
uint8_t pinServo2 = 7; // Пин для подключения сервопривода
Servo servo1;// повітря
Servo servo2;// газ

const int POT1 = 0; // Аналоговый вход A0 для подключения потенциометра
const int POT2 = 1; // Аналоговый вход A0 для подключения потенциометра

int row_excel = 0; // количество строк
int valpot1 = 0; // переменная для хранения значения потенциометра
int valpot2 = 0; // переменная для хранения значения потенциометра
int angleServo1 = 0; // переменная для хранения угла поворота сервы
int angleServo2 = 0; // переменная для хранения угла поворота сервы

volatile uint32_t previousMillis = 0;
uint32_t interval = 2000;


void setup() {

  servo1.attach(pinServo1);
  servo2.attach(pinServo2);
  Serial.begin(9600);
  Serial.println("CLEARDATA"); // очистка листа excel
  Serial.println("LABEL,Time,Voltage, Current, Power, Energy, Frequency, PF, agle1, angle2 "); // заголовки столбцов

  // подключить переменную servo к выводу pinServo

}

void loop() {

  valpot1 = analogRead(POT1); // чтение данных потенциометра
  valpot2 = analogRead(POT2); // чтение данных потенциометра
  // масштабируем значение к интервалу 0-180
  angleServo1 = map(valpot1, 0, 1023, 0, 180);
  angleServo2 = map(valpot2, 0, 1023, 0, 180);
  // поворот сервопривода на полученный угол
  servo1.write(angleServo1);
  servo2.write(angleServo2);
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    float voltage = pzem.voltage();
    float current = pzem.current();
    float power = pzem.power();
    float energy = pzem.energy();
    float frequency = pzem.frequency();
    float pf = pzem.pf();

    Serial.println();
    row_excel++; // номер строки + 1
    Serial.print("DATA,TIME,"); // запись в excel текущей даты и времени

    Serial.print(voltage);
    Serial.print(",");

    Serial.print(current);
    Serial.print(",");

    Serial.print(power);
    Serial.print(",");

    Serial.print(energy, 3);
    Serial.print(",");

    Serial.print(frequency, 1);
    Serial.print(",");

    Serial.println(pf);
    Serial.print(",");
    Serial.print(angleServo1);
    Serial.print(",");
    Serial.print(angleServo2);
    Serial.print(",");
    Serial.println(row_excel);
  }
}

 

Большое спасибо за код, амперметр начал работать, но сервопривод не могу переставить так как паяльник умер.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Вот так будет еще правильней вроде:
 

#include <PZEM004Tv30.h>
#include <SoftwareSerial.h>
uint8_t PZEM_RX_PIN = 8;
uint8_t PZEM_TX_PIN = 9;
SoftwareSerial pzemSWSerial(PZEM_RX_PIN, PZEM_TX_PIN);
PZEM004Tv30 pzem(pzemSWSerial); // Software Serial pin 8 (RX) & 9 (TX)

#include <Servo.h> // подключение библиотеки Servo
uint8_t pinServo1 = 6; // Пин для подключения сервопривода
uint8_t pinServo2 = 7; // Пин для подключения сервопривода
Servo servo1;// повітря
Servo servo2;// газ

const int POT1 = 0; // Аналоговый вход A0 для подключения потенциометра
const int POT2 = 1; // Аналоговый вход A1 для подключения потенциометра

int row_excel = 0; // количество строк
volatile int valpot1 = 0; // переменная для хранения значения потенциометра
volatile int valpot2 = 0; // переменная для хранения значения потенциометра
volatile int angleServo1 = 0; // переменная для хранения угла поворота сервы
volatile int angleServo2 = 0; // переменная для хранения угла поворота сервы

volatile uint32_t previousMillis = 0;
uint32_t interval = 2000;


void setup() {

  servo1.attach(pinServo1);
  servo2.attach(pinServo2);
  
  Serial.begin(115200);
  Serial.println("CLEARDATA"); // очистка листа excel
  Serial.println("LABEL,Time,Voltage, Current, Power, Energy, Frequency, PF, agle1, angle2 "); // заголовки столбцов

  // подключить переменную servo к выводу pinServo

}

void loop() {

  valpot1 = analogRead(POT1); // чтение данных потенциометра
  valpot2 = analogRead(POT2); // чтение данных потенциометра
  // масштабируем значение к интервалу 0-180
  angleServo1 = map(valpot1, 0, 1023, 0, 180);
  angleServo2 = map(valpot2, 0, 1023, 0, 180);
  // поворот сервопривода на полученный угол
  servo1.write(angleServo1);
  servo2.write(angleServo2);

  if (millis() - previousMillis > interval) {
    previousMillis = millis();
    float voltage = pzem.voltage();
    float current = pzem.current();
    float power = pzem.power();
    float energy = pzem.energy();
    float frequency = pzem.frequency();
    float pf = pzem.pf();

    Serial.println();
    row_excel++; // номер строки + 1
    Serial.print("DATA,TIME,"); // запись в excel текущей даты и времени

    Serial.print(voltage);
    Serial.print(",");

    Serial.print(current);
    Serial.print(",");

    Serial.print(power);
    Serial.print(",");

    Serial.print(energy, 3);
    Serial.print(",");

    Serial.print(frequency, 1);
    Serial.print(",");

    Serial.println(pf);
    Serial.print(",");
    Serial.print(angleServo1);
    Serial.print(",");
    Serial.print(angleServo2);
    Serial.print(",");
    Serial.println(row_excel);
  }
}

 

lilik
Offline
Зарегистрирован: 19.10.2017

:-)

Чините паяльник скорее, а то пишут, что библиотеки "серво" и "софтваресериал" не работают вместе (интересно узнать).

https://qna.habr.com/q/188627

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Есть такая проблема. Какой-нить макет с озвучкой через DFPlayer и сервой делаешь и матом ругаешься - включил звук, серва дернулась.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

lilik пишет:

:-)

Чините паяльник скорее, а то пишут, что библиотеки "серво" и "софтваресериал" не работают вместе (интересно узнать).

https://qna.habr.com/q/188627

заставить работать можно, я думаю, точнее есть большая надежда граничащая с уверенностью )))

ЗЫ { 9600, 114, 236, 236, 233, }, это задержки, надо поднимать скорость до 115200, там они минимальные, если не взлетит, то переводить датчик на хардовый сериал

{ 115200, 1, 17, 17, 12, },